+
- {modelArch?.disableSections?.includes('train.timestep_type') ? null : (
+ {disableSections.includes('train.timestep_type') ? null : (
setJobConfig(value, 'config.process[0].train.timestep_type')}
options={[
{ value: 'sigmoid', label: 'Sigmoid' },
@@ -451,13 +475,15 @@ export default function SimpleJob({
]}
/>
setJobConfig(value, 'config.process[0].train.noise_scheduler')}
+ value={jobConfig.config.process[0].train.loss_type}
+ onChange={value => setJobConfig(value, 'config.process[0].train.loss_type')}
options={[
- { value: 'flowmatch', label: 'FlowMatch' },
- { value: 'ddpm', label: 'DDPM' },
+ { value: 'mse', label: 'Mean Squared Error' },
+ { value: 'mae', label: 'Mean Absolute Error' },
+ { value: 'wavelet', label: 'Wavelet' },
+ { value: 'stepped', label: 'Stepped Recovery' },
]}
/>
@@ -482,17 +508,19 @@ export default function SimpleJob({
)}
- {
- setJobConfig(value, 'config.process[0].train.unload_text_encoder');
- if (value) {
- setJobConfig(false, 'config.process[0].train.cache_text_embeddings');
- }
- }}
- />
+ {!disableSections.includes('train.unload_text_encoder') && (
+ {
+ setJobConfig(value, 'config.process[0].train.unload_text_encoder');
+ if (value) {
+ setJobConfig(false, 'config.process[0].train.cache_text_embeddings');
+ }
+ }}
+ />
+ )}
-
- setJobConfig(value, 'config.process[0].train.diff_output_preservation')}
- />
-
- {jobConfig.config.process[0].train.diff_output_preservation && (
+ {disableSections.includes('train.diff_output_preservation') ? null : (
<>
-
- setJobConfig(value, 'config.process[0].train.diff_output_preservation_multiplier')
- }
- placeholder="eg. 1.0"
- min={0}
- />
- setJobConfig(value, 'config.process[0].train.diff_output_preservation_class')}
- placeholder="eg. woman"
- />
+
+ setJobConfig(value, 'config.process[0].train.diff_output_preservation')}
+ />
+
+ {jobConfig.config.process[0].train.diff_output_preservation && (
+ <>
+
+ setJobConfig(value, 'config.process[0].train.diff_output_preservation_multiplier')
+ }
+ placeholder="eg. 1.0"
+ min={0}
+ />
+
+ setJobConfig(value, 'config.process[0].train.diff_output_preservation_class')
+ }
+ placeholder="eg. woman"
+ />
+ >
+ )}
>
)}
@@ -561,7 +595,7 @@ export default function SimpleJob({
setJobConfig(value, `config.process[0].datasets[${i}].folder_path`)}
options={datasetOptions}
@@ -578,6 +612,49 @@ export default function SimpleJob({
options={[{ value: '', label: <> > }, ...datasetOptions]}
/>
)}
+ {modelArch?.additionalSections?.includes('datasets.multi_control_paths') && (
+ <>
+
+ setJobConfig(
+ value == '' ? null : value,
+ `config.process[0].datasets[${i}].control_path_1`,
+ )
+ }
+ options={[{ value: '', label: <> > }, ...datasetOptions]}
+ />
+
+ setJobConfig(
+ value == '' ? null : value,
+ `config.process[0].datasets[${i}].control_path_2`,
+ )
+ }
+ options={[{ value: '', label: <> > }, ...datasetOptions]}
+ />
+
+ setJobConfig(
+ value == '' ? null : value,
+ `config.process[0].datasets[${i}].control_path_3`,
+ )
+ }
+ options={[{ value: '', label: <> > }, ...datasetOptions]}
+ />
+ >
+ )}
)}
+
+
+ Flip X
+ >
+ }
+ checked={dataset.flip_x || false}
+ onChange={value => setJobConfig(value, `config.process[0].datasets[${i}].flip_x`)}
+ />
+
+ Flip Y
+ >
+ }
+ checked={dataset.flip_y || false}
+ onChange={value => setJobConfig(value, `config.process[0].datasets[${i}].flip_y`)}
+ />
+
@@ -796,7 +893,28 @@ export default function SimpleJob({
label="Skip First Sample"
className="pt-4"
checked={jobConfig.config.process[0].train.skip_first_sample || false}
- onChange={value => setJobConfig(value, 'config.process[0].train.skip_first_sample')}
+ onChange={value => {
+ setJobConfig(value, 'config.process[0].train.skip_first_sample');
+ // cannot do both, so disable the other
+ if (value) {
+ setJobConfig(false, 'config.process[0].train.force_first_sample');
+ }
+ }}
+ />
+
+
+ {
+ setJobConfig(value, 'config.process[0].train.force_first_sample');
+ // cannot do both, so disable the other
+ if (value) {
+ setJobConfig(false, 'config.process[0].train.skip_first_sample');
+ }
+ }}
/>
@@ -804,7 +922,13 @@ export default function SimpleJob({
label="Disable Sampling"
className="pt-1"
checked={jobConfig.config.process[0].train.disable_sampling || false}
- onChange={value => setJobConfig(value, 'config.process[0].train.disable_sampling')}
+ onChange={value => {
+ setJobConfig(value, 'config.process[0].train.disable_sampling');
+ // cannot do both, so disable the other
+ if (value) {
+ setJobConfig(false, 'config.process[0].train.force_first_sample');
+ }
+ }}
/>
@@ -826,31 +950,151 @@ export default function SimpleJob({
placeholder="Enter prompt"
required
/>
+
+ {
+ // remove any non-numeric characters
+ value = value.replace(/\D/g, '');
+ if (value === '') {
+ // remove the key from the config if empty
+ let newConfig = objectCopy(jobConfig);
+ if (newConfig.config.process[0].sample.samples[i]) {
+ delete newConfig.config.process[0].sample.samples[i].width;
+ setJobConfig(
+ newConfig.config.process[0].sample.samples,
+ 'config.process[0].sample.samples',
+ );
+ }
+ } else {
+ const intValue = parseInt(value);
+ if (!isNaN(intValue)) {
+ setJobConfig(intValue, `config.process[0].sample.samples[${i}].width`);
+ } else {
+ console.warn('Invalid width value:', value);
+ }
+ }
+ }}
+ placeholder={`${jobConfig.config.process[0].sample.width} (default)`}
+ />
+ {
+ // remove any non-numeric characters
+ value = value.replace(/\D/g, '');
+ if (value === '') {
+ // remove the key from the config if empty
+ let newConfig = objectCopy(jobConfig);
+ if (newConfig.config.process[0].sample.samples[i]) {
+ delete newConfig.config.process[0].sample.samples[i].height;
+ setJobConfig(
+ newConfig.config.process[0].sample.samples,
+ 'config.process[0].sample.samples',
+ );
+ }
+ } else {
+ const intValue = parseInt(value);
+ if (!isNaN(intValue)) {
+ setJobConfig(intValue, `config.process[0].sample.samples[${i}].height`);
+ } else {
+ console.warn('Invalid height value:', value);
+ }
+ }
+ }}
+ placeholder={`${jobConfig.config.process[0].sample.height} (default)`}
+ />
+ {
+ // remove any non-numeric characters
+ value = value.replace(/\D/g, '');
+ if (value === '') {
+ // remove the key from the config if empty
+ let newConfig = objectCopy(jobConfig);
+ if (newConfig.config.process[0].sample.samples[i]) {
+ delete newConfig.config.process[0].sample.samples[i].seed;
+ setJobConfig(
+ newConfig.config.process[0].sample.samples,
+ 'config.process[0].sample.samples',
+ );
+ }
+ } else {
+ const intValue = parseInt(value);
+ if (!isNaN(intValue)) {
+ setJobConfig(intValue, `config.process[0].sample.samples[${i}].seed`);
+ } else {
+ console.warn('Invalid seed value:', value);
+ }
+ }
+ }}
+ placeholder={`${jobConfig.config.process[0].sample.walk_seed ? jobConfig.config.process[0].sample.seed + i : jobConfig.config.process[0].sample.seed} (default)`}
+ />
+ {
+ // remove any non-numeric, - or . characters
+ value = value.replace(/[^0-9.-]/g, '');
+ if (value === '') {
+ // remove the key from the config if empty
+ let newConfig = objectCopy(jobConfig);
+ if (newConfig.config.process[0].sample.samples[i]) {
+ delete newConfig.config.process[0].sample.samples[i].network_multiplier;
+ setJobConfig(
+ newConfig.config.process[0].sample.samples,
+ 'config.process[0].sample.samples',
+ );
+ }
+ } else {
+ // set it as a string
+ setJobConfig(value, `config.process[0].sample.samples[${i}].network_multiplier`);
+ return;
+ }
+ }}
+ placeholder={`1.0 (default)`}
+ />
+
-
+ {modelArch?.additionalSections?.includes('datasets.multi_control_paths') && (
+
+
+ {['ctrl_img_1', 'ctrl_img_2', 'ctrl_img_3'].map((ctrlKey, ctrl_idx) => (
+ {
+ if (!imagePath) {
+ let newSamples = objectCopy(jobConfig.config.process[0].sample.samples);
+ delete newSamples[i][ctrlKey as keyof typeof sample];
+ setJobConfig(newSamples, 'config.process[0].sample.samples');
+ } else {
+ setJobConfig(imagePath, `config.process[0].sample.samples[${i}].${ctrlKey}`);
+ }
+ }}
+ />
+ ))}
+
+
+ )}
{modelArch?.additionalSections?.includes('sample.ctrl_img') && (
-
{
- openAddImageModal(imagePath => {
- console.log('Selected image path:', imagePath);
- if (!imagePath) return;
+
{
+ if (!imagePath) {
+ let newSamples = objectCopy(jobConfig.config.process[0].sample.samples);
+ delete newSamples[i].ctrl_img;
+ setJobConfig(newSamples, 'config.process[0].sample.samples');
+ } else {
setJobConfig(imagePath, `config.process[0].sample.samples[${i}].ctrl_img`);
- });
+ }
}}
- >
- {!sample.ctrl_img && (
- Add Control Image
- )}
-
+ />
)}