@@ -770,7 +770,6 @@ static void sample_k_diffusion(sample_method_t method,
770770 } break ;
771771 case DPMPP2S_A: {
772772 struct ggml_tensor * noise = ggml_dup_tensor (work_ctx, x);
773- struct ggml_tensor * d = ggml_dup_tensor (work_ctx, x);
774773 struct ggml_tensor * x2 = ggml_dup_tensor (work_ctx, x);
775774
776775 for (int i = 0 ; i < steps; i++) {
@@ -785,22 +784,15 @@ static void sample_k_diffusion(sample_method_t method,
785784 auto sigma_fn = [](float t) -> float { return exp (-t); };
786785
787786 if (sigma_down == 0 ) {
788- // Euler step
789- float * vec_d = (float *)d->data ;
787+ // d = (x - denoised) / sigmas[i];
788+ // dt = sigma_down - sigmas[i];
789+ // x += d * dt;
790+ // => x = denoised
790791 float * vec_x = (float *)x->data ;
791792 float * vec_denoised = (float *)denoised->data ;
792793
793- for (int j = 0 ; j < ggml_nelements (d); j++) {
794- vec_d[j] = (vec_x[j] - vec_denoised[j]) / sigmas[i];
795- }
796-
797- // TODO: If sigma_down == 0, isn't this wrong?
798- // But
799- // https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/sampling.py#L525
800- // has this exactly the same way.
801- float dt = sigma_down - sigmas[i];
802- for (int j = 0 ; j < ggml_nelements (d); j++) {
803- vec_x[j] = vec_x[j] + vec_d[j] * dt;
794+ for (int j = 0 ; j < ggml_nelements (x); j++) {
795+ vec_x[j] = vec_denoised[j];
804796 }
805797 } else {
806798 // DPM-Solver++(2S)
@@ -809,7 +801,6 @@ static void sample_k_diffusion(sample_method_t method,
809801 float h = t_next - t;
810802 float s = t + 0 .5f * h;
811803
812- float * vec_d = (float *)d->data ;
813804 float * vec_x = (float *)x->data ;
814805 float * vec_x2 = (float *)x2->data ;
815806 float * vec_denoised = (float *)denoised->data ;
0 commit comments