@@ -553,45 +553,46 @@ function DiffOpt.reverse_differentiate!(model::Model; tol = 1e-6)
553553 # Compute Jacobian
554554 Δs, df_dp = _compute_sensitivity (model; tol = tol)
555555 Δp = if ! iszero (model. input_cache. dobj)
556- model. input_cache. dobj * df_dp
556+ df_dp ' model. input_cache. dobj
557557 else
558- num_primal = length (cache. primal_vars)
559- # Fetch primal sensitivities
560- Δx = zeros (num_primal)
561- for (i, var_idx) in enumerate (cache. primal_vars)
562- if haskey (model. input_cache. dx, var_idx)
563- Δx[i] = model. input_cache. dx[var_idx]
564- end
558+ zeros (length (cache. params))
559+ end
560+ num_primal = length (cache. primal_vars)
561+ # Fetch primal sensitivities
562+ Δx = zeros (num_primal)
563+ for (i, var_idx) in enumerate (cache. primal_vars)
564+ if haskey (model. input_cache. dx, var_idx)
565+ Δx[i] = model. input_cache. dx[var_idx]
565566 end
566- # Fetch dual sensitivities
567- num_constraints = length (cache . cons)
568- num_up = length (cache. has_up )
569- num_low = length (cache. has_low )
570- Δdual = zeros (num_constraints + num_up + num_low )
571- for (i, ci) in enumerate (cache . cons )
572- idx = form . nlp_index_2_constraint[ci]
573- if haskey (model . input_cache . dy, idx)
574- Δdual[i] = model. input_cache. dy[ idx]
575- end
567+ end
568+ # Fetch dual sensitivities
569+ num_constraints = length (cache. cons )
570+ num_up = length (cache. has_up )
571+ num_low = length (cache . has_low )
572+ Δdual = zeros (num_constraints + num_up + num_low )
573+ for (i, ci) in enumerate (cache . cons)
574+ idx = form . nlp_index_2_constraint[ci]
575+ if haskey ( model. input_cache. dy, idx)
576+ Δdual[i] = model . input_cache . dy[idx]
576577 end
577- for (i, var_idx) in enumerate (cache . primal_vars[cache . has_low])
578- idx = form . constraint_lower_bounds[var_idx . value]
579- if haskey (model . input_cache . dy, idx)
580- Δdual[num_constraints + i] = model. input_cache. dy[ idx]
581- end
578+ end
579+ for (i, var_idx) in enumerate (cache . primal_vars[cache . has_low])
580+ idx = form . constraint_lower_bounds[var_idx . value]
581+ if haskey ( model. input_cache. dy, idx)
582+ Δdual[num_constraints + i] = model . input_cache . dy[idx]
582583 end
583- for (i, var_idx) in enumerate (cache . primal_vars[cache . has_up])
584- idx = form . constraint_upper_bounds[var_idx . value]
585- if haskey (model . input_cache . dy, idx)
586- Δdual[num_constraints + num_low + i] = model. input_cache. dy[ idx]
587- end
584+ end
585+ for (i, var_idx) in enumerate (cache . primal_vars[cache . has_up])
586+ idx = form . constraint_upper_bounds[var_idx . value]
587+ if haskey ( model. input_cache. dy, idx)
588+ Δdual[num_constraints + num_low + i] = model . input_cache . dy[idx]
588589 end
589- # Extract Parameter sensitivities
590- Δw = zeros (size (Δs, 1 ))
591- Δw[1 : num_primal] = Δx
592- Δw[cache. index_duals] = Δdual
593- Δp = Δs' * Δw
594590 end
591+ # Extract Parameter sensitivities
592+ Δw = zeros (size (Δs, 1 ))
593+ Δw[1 : num_primal] = Δx
594+ Δw[cache. index_duals] = Δdual
595+ Δp += Δs' * Δw
595596
596597 Δp_dict = Dict {MOI.ConstraintIndex,Float64} (
597598 form. var2ci[var_idx] => Δp[form. var2param[var_idx]. value]
0 commit comments