@@ -770,7 +770,6 @@ static void sample_k_diffusion(sample_method_t method,
770770 }break ;
771771case DPMPP2S_A: {
772772struct ggml_tensor * noise =ggml_dup_tensor (work_ctx, x);
773- struct ggml_tensor * d =ggml_dup_tensor (work_ctx, x);
774773struct ggml_tensor * x2 =ggml_dup_tensor (work_ctx, x);
775774
776775for (int i =0 ; i < steps; i++) {
@@ -785,22 +784,15 @@ static void sample_k_diffusion(sample_method_t method,
785784auto sigma_fn = [](float t) ->float {return exp (-t); };
786785
787786if (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
790791float * vec_x = (float *)x->data ;
791792float * 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,
809801float h = t_next - t;
810802float s = t +0 .5f * h;
811803
812- float * vec_d = (float *)d->data ;
813804float * vec_x = (float *)x->data ;
814805float * vec_x2 = (float *)x2->data ;
815806float * vec_denoised = (float *)denoised->data ;