@@ -130,6 +130,7 @@ struct SDParams {
130
130
float apg_eta = 1 .0f ;
131
131
float apg_momentum = 0 .0f ;
132
132
float apg_norm_threshold = 0 .0f ;
133
+ float apg_norm_smoothing = 0 .0f ;
133
134
};
134
135
135
136
void print_params (SDParams params) {
@@ -214,6 +215,8 @@ void print_usage(int argc, const char* argv[]) {
214
215
printf (" --apg-eta VALUE parallel projected guidance scale for APG (default: 1.0, recommended: between 0 and 1)\n " );
215
216
printf (" --apg-momentum VALUE CFG update direction momentum for APG (default: 0, recommended: around -0.5)\n " );
216
217
printf (" --apg-nt, --apg-rescale VALUE CFG update direction norm threshold for APG (default: 0 = disabled, recommended: 4-15)\n " );
218
+ printf (" --apg-nt-smoothing VALUE EXPERIMENTAL! Norm threshold smoothing for APG (default: 0 = disabled)\n " );
219
+ printf (" (replaces saturation with a smooth approximation)\n " );
217
220
printf (" --slg-scale SCALE skip layer guidance (SLG) scale, only for DiT models: (default: 0)\n " );
218
221
printf (" 0 means disabled, a value of 2.5 is nice for sd3.5 medium\n " );
219
222
printf (" --skip-layers LAYERS Layers to skip for SLG steps: (default: [7,8,9])\n " );
@@ -641,6 +644,12 @@ void parse_args(int argc, const char** argv, SDParams& params) {
641
644
break ;
642
645
}
643
646
params.apg_norm_threshold = std::stof (argv[i]);
647
+ } else if (arg == " --apg-nt-smoothing" ) {
648
+ if (++i >= argc) {
649
+ invalid_arg = true ;
650
+ break ;
651
+ }
652
+ params.apg_norm_smoothing = std::stof (argv[i]);
644
653
} else {
645
654
fprintf (stderr, " error: unknown argument: %s\n " , arg.c_str ());
646
655
print_usage (argc, argv);
@@ -739,6 +748,9 @@ std::string get_image_params(SDParams params, int64_t seed) {
739
748
}
740
749
if (params.apg_norm_threshold != 0 ) {
741
750
parameter_string += " CFG normalization threshold: " + std::to_string (params.apg_norm_threshold ) + " , " ;
751
+ if (params.apg_norm_smoothing != 0 ) {
752
+ parameter_string += " CFG normalization threshold: " + std::to_string (params.apg_norm_smoothing ) + " , " ;
753
+ }
742
754
}
743
755
if (params.slg_scale != 0 && params.skip_layers .size () != 0 ) {
744
756
parameter_string += " SLG scale: " + std::to_string (params.cfg_scale ) + " , " ;
@@ -989,7 +1001,8 @@ int main(int argc, const char* argv[]) {
989
1001
params.skip_layer_end },
990
1002
sd_apg_params_t {params.apg_eta ,
991
1003
params.apg_momentum ,
992
- params.apg_norm_threshold });
1004
+ params.apg_norm_threshold ,
1005
+ params.apg_norm_smoothing });
993
1006
} else {
994
1007
sd_image_t input_image = {(uint32_t )params.width ,
995
1008
(uint32_t )params.height ,
@@ -1060,7 +1073,8 @@ int main(int argc, const char* argv[]) {
1060
1073
params.skip_layer_end },
1061
1074
sd_apg_params_t {params.apg_eta ,
1062
1075
params.apg_momentum ,
1063
- params.apg_norm_threshold });
1076
+ params.apg_norm_threshold ,
1077
+ params.apg_norm_smoothing });
1064
1078
}
1065
1079
}
1066
1080
0 commit comments