Skip to content

Commit

Permalink
fix: issue 7969 (#8030)
Browse files Browse the repository at this point in the history
* update the attribute(min,max,nominal) of know variable like inputs via parameters.
* code is based on the comments in the function createStartValueEquations.
  • Loading branch information
vruge committed Oct 25, 2021
1 parent 159a9df commit c41fbb6
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 21 deletions.
42 changes: 21 additions & 21 deletions OMCompiler/Compiler/SimCode/SimCodeUtil.mo
Expand Up @@ -7045,18 +7045,18 @@ algorithm
nominalValueEquations := matchcontinue (syst, shared, acc)
local
BackendDAE.Variables vars, av;
list<BackendDAE.Equation> nominalValueEquationsTmp2;
list<BackendDAE.Equation> nominalValueEquationsTmp;
list<SimCode.SimEqSystem> simeqns, simeqns1;
Integer uniqueEqIndex;
BackendDAE.Variables globalKnownVars;

case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av), (uniqueEqIndex, simeqns)) equation
case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av, globalKnownVars=globalKnownVars), (uniqueEqIndex, simeqns)) equation
// vars
((nominalValueEquationsTmp2, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromNominal, ({}, av));
nominalValueEquationsTmp2 = listReverse(nominalValueEquationsTmp2);

// kvars -> see createStartValueEquations
((nominalValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromNominal, ({}, av));
((nominalValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(globalKnownVars, createInitialAssignmentsFromNominal, (nominalValueEquationsTmp, av));
nominalValueEquationsTmp = listReverse(nominalValueEquationsTmp);

(simeqns1, uniqueEqIndex) = List.mapFold(nominalValueEquationsTmp2, dlowEqToSimEqSystem, uniqueEqIndex);
(simeqns1, uniqueEqIndex) = List.mapFold(nominalValueEquationsTmp, dlowEqToSimEqSystem, uniqueEqIndex);
then ((uniqueEqIndex, listAppend(simeqns1, simeqns)));

else equation
Expand All @@ -7074,18 +7074,18 @@ algorithm
minValueEquations := matchcontinue (syst, shared, acc)
local
BackendDAE.Variables vars, av;
list<BackendDAE.Equation> minValueEquationsTmp2;
list<BackendDAE.Equation> minValueEquationsTmp;
list<SimCode.SimEqSystem> simeqns, simeqns1;
Integer uniqueEqIndex;
BackendDAE.Variables globalKnownVars;

case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av), (uniqueEqIndex, simeqns)) equation
case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av, globalKnownVars=globalKnownVars), (uniqueEqIndex, simeqns)) equation
// vars
((minValueEquationsTmp2, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromMin, ({}, av));
minValueEquationsTmp2 = listReverse(minValueEquationsTmp2);
((minValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromMin, ({}, av));
((minValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(globalKnownVars, createInitialAssignmentsFromMin, (minValueEquationsTmp, av));
minValueEquationsTmp = listReverse(minValueEquationsTmp);

// kvars -> see createStartValueEquations

(simeqns1, uniqueEqIndex) = List.mapFold(minValueEquationsTmp2, dlowEqToSimEqSystem, uniqueEqIndex);
(simeqns1, uniqueEqIndex) = List.mapFold(minValueEquationsTmp, dlowEqToSimEqSystem, uniqueEqIndex);
then ((uniqueEqIndex, listAppend(simeqns1, simeqns)));

else equation
Expand All @@ -7103,18 +7103,18 @@ algorithm
maxValueEquations := matchcontinue (syst, shared, acc)
local
BackendDAE.Variables vars, av;
list<BackendDAE.Equation> maxValueEquationsTmp2;
list<BackendDAE.Equation> maxValueEquationsTmp;
list<SimCode.SimEqSystem> simeqns, simeqns1;
Integer uniqueEqIndex;
BackendDAE.Variables globalKnownVars;

case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av), (uniqueEqIndex, simeqns)) equation
case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av, globalKnownVars=globalKnownVars), (uniqueEqIndex, simeqns)) equation
// vars
((maxValueEquationsTmp2, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromMax, ({}, av));
maxValueEquationsTmp2 = listReverse(maxValueEquationsTmp2);

// kvars -> see createStartValueEquationseqAttr
((maxValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromMax, ({}, av));
((maxValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(globalKnownVars, createInitialAssignmentsFromMax, (maxValueEquationsTmp, av));
maxValueEquationsTmp = listReverse(maxValueEquationsTmp);

(simeqns1, uniqueEqIndex) = List.mapFold(maxValueEquationsTmp2, dlowEqToSimEqSystem, uniqueEqIndex);
(simeqns1, uniqueEqIndex) = List.mapFold(maxValueEquationsTmp, dlowEqToSimEqSystem, uniqueEqIndex);
then ((uniqueEqIndex, listAppend(simeqns1, simeqns)));

else equation
Expand Down
Expand Up @@ -19,6 +19,7 @@ DMwarm.mos \
DMwarmCsv.mos \
InputOptIssues.mos \
LoopTest.mos \
issue7969.mos \
LRB.mos \
LRB2.mos \
LV.mos \
Expand Down
69 changes: 69 additions & 0 deletions testsuite/openmodelica/cruntime/optimization/basic/issue7969.mos
@@ -0,0 +1,69 @@
// name: issue7969
// status: correct

// target: inputs attribute are set via parameters

setCommandLineOptions("+gDynOpt");
getErrorString();

loadString("
model issue7969
input Real u(min = u_min, max = u_max, nominal=u_nominal);
input Real u1(min = -a, nominal=a);
input Real u2(max = p, min=p, nominal=2*p);
Real totalCost = (x-20)^2 annotation(isMayer = true);
parameter Real p = 10;
parameter Real u_min = -11;
parameter Real u_max = 12;
parameter Real u_nominal = 10;
parameter Real n = 10*p;
parameter Real a = 11;
Real x(start=1, fixed=true);
equation
der(x) = 1e-3*u - 1e-4*u1 + 1e-5*u2;
end issue7969;
");
getErrorString();

optimize(issue7969, numberOfIntervals=4, tolerance = 1e-8, stopTime = 2);
getErrorString();

val(u, {0.5,2});
val(u1, {0.5,2});
val(u2, {0.5,2});
val(x, {0.5,2});
// Result:
// true
// ""
// true
// ""
// record SimulationResult
// resultFile = "issue7969_res.mat",
// simulationOptions = "startTime = 0.0, stopTime = 2.0, numberOfIntervals = 4, tolerance = 1e-08, method = 'optimization', fileNamePrefix = 'issue7969', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''",
// messages = "LOG_SUCCESS | info | The initialization finished successfully without homotopy method.
//
// Optimizer Variables
// ========================================================
// State[0]:x(start = 1, nominal = 2, min = -Inf, max = +Inf, init = 1)
// Input[1]:u(start = 0, nominal = 10, min = -11, max = 12)
// Input[2]:u1(start = 0, nominal = 11, min = -11, max = +Inf)
// Input[3]:u2(start = 10, nominal = 20, min = 10, max = 10)
// --------------------------------------------------------
// number of nonlinear constraints: 0
// ========================================================
//
// ******************************************************************************
// This program contains Ipopt, a library for large-scale nonlinear optimization.
// Ipopt is released as open source code under the Eclipse Public License (EPL).
// For more information visit https://github.com/coin-or/Ipopt
// ******************************************************************************
//
// LOG_SUCCESS | info | The simulation finished successfully.
// "
// end SimulationResult;
// ""
// {12.0,12.0}
// {-11.0,-11.0}
// {10.0,10.0}
// {1.006600000063919,1.026400000255677}
// endResult

0 comments on commit c41fbb6

Please sign in to comment.