@@ -133,6 +133,7 @@ struct SDParams {
133
133
float apg_eta = 1 .0f ;
134
134
float apg_momentum = 0 .0f ;
135
135
float apg_norm_threshold = 0 .0f ;
136
+ float apg_norm_smoothing = 0 .0f ;
136
137
};
137
138
138
139
void print_params (SDParams params) {
@@ -220,6 +221,8 @@ void print_usage(int argc, const char* argv[]) {
220
221
printf (" --apg-eta VALUE parallel projected guidance scale for APG (default: 1.0, recommended: between 0 and 1)\n " );
221
222
printf (" --apg-momentum VALUE CFG update direction momentum for APG (default: 0, recommended: around -0.5)\n " );
222
223
printf (" --apg-nt, --apg-rescale VALUE CFG update direction norm threshold for APG (default: 0 = disabled, recommended: 4-15)\n " );
224
+ printf (" --apg-nt-smoothing VALUE EXPERIMENTAL! Norm threshold smoothing for APG (default: 0 = disabled)\n " );
225
+ printf (" (replaces saturation with a smooth approximation)\n " );
223
226
printf (" --slg-scale SCALE skip layer guidance (SLG) scale, only for DiT models: (default: 0)\n " );
224
227
printf (" 0 means disabled, a value of 2.5 is nice for sd3.5 medium\n " );
225
228
printf (" --eta SCALE eta in DDIM, only for DDIM and TCD: (default: 0)\n " );
@@ -654,6 +657,12 @@ void parse_args(int argc, const char** argv, SDParams& params) {
654
657
break ;
655
658
}
656
659
params.apg_norm_threshold = std::stof (argv[i]);
660
+ } else if (arg == " --apg-nt-smoothing" ) {
661
+ if (++i >= argc) {
662
+ invalid_arg = true ;
663
+ break ;
664
+ }
665
+ params.apg_norm_smoothing = std::stof (argv[i]);
657
666
} else {
658
667
fprintf (stderr, " error: unknown argument: %s\n " , arg.c_str ());
659
668
print_usage (argc, argv);
@@ -752,6 +761,9 @@ std::string get_image_params(SDParams params, int64_t seed) {
752
761
}
753
762
if (params.apg_norm_threshold != 0 ) {
754
763
parameter_string += " CFG normalization threshold: " + std::to_string (params.apg_norm_threshold ) + " , " ;
764
+ if (params.apg_norm_smoothing != 0 ) {
765
+ parameter_string += " CFG normalization threshold: " + std::to_string (params.apg_norm_smoothing ) + " , " ;
766
+ }
755
767
}
756
768
if (params.slg_scale != 0 && params.skip_layers .size () != 0 ) {
757
769
parameter_string += " SLG scale: " + std::to_string (params.cfg_scale ) + " , " ;
@@ -1004,7 +1016,8 @@ int main(int argc, const char* argv[]) {
1004
1016
params.skip_layer_end },
1005
1017
sd_apg_params_t {params.apg_eta ,
1006
1018
params.apg_momentum ,
1007
- params.apg_norm_threshold });
1019
+ params.apg_norm_threshold ,
1020
+ params.apg_norm_smoothing });
1008
1021
} else {
1009
1022
sd_image_t input_image = {(uint32_t )params.width ,
1010
1023
(uint32_t )params.height ,
@@ -1076,7 +1089,8 @@ int main(int argc, const char* argv[]) {
1076
1089
params.skip_layer_end },
1077
1090
sd_apg_params_t {params.apg_eta ,
1078
1091
params.apg_momentum ,
1079
- params.apg_norm_threshold });
1092
+ params.apg_norm_threshold ,
1093
+ params.apg_norm_smoothing });
1080
1094
}
1081
1095
}
1082
1096
0 commit comments