Skip to content

Commit

Permalink
[Template] add linearization dump languages
Browse files Browse the repository at this point in the history
- ticket 5626
- added julia and python
  • Loading branch information
kabdelhak authored and adrpo committed Sep 9, 2019
1 parent bc1d4b8 commit 1ff9a98
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 1 deletion.
119 changes: 119 additions & 0 deletions OMCompiler/Compiler/Template/CodegenC.tpl
Expand Up @@ -836,6 +836,10 @@ template simulationFile_lnz(SimCode simCode)
then functionlinearmodel(modelInfo, modelNamePrefix(simCode))
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"matlab")
then functionlinearmodelMatlab(modelInfo, modelNamePrefix(simCode))
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"julia")
then functionlinearmodelJulia(modelInfo, modelNamePrefix(simCode))
else if stringEq(Flags.getConfigString(LINEARIZATION_DUMP_LANGUAGE),"python")
then functionlinearmodelPython(modelInfo, modelNamePrefix(simCode))
%>
#if defined(__cplusplus)
}
Expand Down Expand Up @@ -4720,6 +4724,105 @@ template functionlinearmodelMatlab(ModelInfo modelInfo, String modelNamePrefix)
end match
end functionlinearmodelMatlab;

template functionlinearmodelJulia(ModelInfo modelInfo, String modelNamePrefix) "template functionlinearmodelJulia
Generates julia functions in simulation file."
::=
match modelInfo
case MODELINFO(varInfo=VARINFO(__), vars=SIMVARS(__)) then
let matrixA = genMatrixJulia("A", "n", "n", varInfo.numStateVars, varInfo.numStateVars)
let matrixB = genMatrixJulia("B", "n", "p", varInfo.numStateVars, varInfo.numInVars)
let matrixC = genMatrixJulia("C", "q", "n", varInfo.numOutVars, varInfo.numStateVars)
let matrixD = genMatrixJulia("D", "q", "p", varInfo.numOutVars, varInfo.numInVars)
let matrixCz = genMatrixJulia("Cz", "nz", "n", varInfo.numAlgVars, varInfo.numStateVars)
let matrixDz = genMatrixJulia("Dz", "nz", "p", varInfo.numAlgVars, varInfo.numInVars)
//string def_proctedpart("\n Real x[<%varInfo.numStateVars%>](start=x0);\n Real u[<%varInfo.numInVars%>](start=u0);\n output Real y[<%varInfo.numOutVars%>];\n");
<<
const char *<%symbolName(modelNamePrefix,"linear_model_frame")%>()
{
return "function <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"#= der(x) = A * x + B * u =#\n#= y = C * x + D * u =#\n"
" local n = <%varInfo.numStateVars%> #= number of states =#\n local p = <%varInfo.numInVars%> #= number of inputs =#\n local q = <%varInfo.numOutVars%> #= number of outputs =# \n"
"\n"
" local x0 = %s\n"
" local u0 = %s\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
" (n, p, q, x0, u0, A, B, C, D)\n"
"end";
}
const char *<%symbolName(modelNamePrefix,"linear_model_datarecovery_frame")%>()
{
return "function <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"#= der(x) = A * x + B * u =#\n#= y = C * x + D * u =#\n"
" local n = <%varInfo.numStateVars%> #= number of states =#\n local p = <%varInfo.numInVars%> #= number of inputs =#\n local q = <%varInfo.numOutVars%> #= number of outputs =# \n"
"\n"
" local x0 = %s\n"
" local u0 = %s\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
" (n, p, q, x0, u0, A, B, C, D)\n"
"end";
}
>>
end match
end functionlinearmodelJulia;


template functionlinearmodelPython(ModelInfo modelInfo, String modelNamePrefix) "template functionlinearmodelPython
Generates python functions in simulation file."
::=
match modelInfo
case MODELINFO(varInfo=VARINFO(__), vars=SIMVARS(__)) then
let matrixA = genMatrixMatlab("A", "n", "n", varInfo.numStateVars, varInfo.numStateVars)
let matrixB = genMatrixMatlab("B", "n", "p", varInfo.numStateVars, varInfo.numInVars)
let matrixC = genMatrixMatlab("C", "q", "n", varInfo.numOutVars, varInfo.numStateVars)
let matrixD = genMatrixMatlab("D", "q", "p", varInfo.numOutVars, varInfo.numInVars)
let matrixCz = genMatrixMatlab("Cz", "nz", "n", varInfo.numAlgVars, varInfo.numStateVars)
let matrixDz = genMatrixMatlab("Dz", "nz", "p", varInfo.numAlgVars, varInfo.numInVars)
//string def_proctedpart("\n Real x[<%varInfo.numStateVars%>](start=x0);\n Real u[<%varInfo.numInVars%>](start=u0);\n output Real y[<%varInfo.numOutVars%>];\n");
<<
const char *<%symbolName(modelNamePrefix,"linear_model_frame")%>()
{
return "def <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"# der(x) = A * x + B * u \n# y = C * x + D * u \n"
" n = <%varInfo.numStateVars%> # number of states\n p = <%varInfo.numInVars%> # number of inputs\n q = <%varInfo.numOutVars%> # number of outputs\n"
"\n"
" x0 = %s\n"
" u0 = %s\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
" return (n, p, q, x0, u0, A, B, C, D)\n"
"end";
}
const char *<%symbolName(modelNamePrefix,"linear_model_datarecovery_frame")%>()
{
return "def <%symbolName(modelNamePrefix,"GetLinearModel")%>()\n"
"# der(x) = A * x + B * u \n# y = C * x + D * u \n"
" n = <%varInfo.numStateVars%> # number of states\n p = <%varInfo.numInVars%> # number of inputs\n q = <%varInfo.numOutVars%> # number of outputs\n"
"\n"
" x0 = %s\n"
" u0 = %s\n"
"\n"
<%matrixA%>
<%matrixB%>
<%matrixC%>
<%matrixD%>
" return (n, p, q, x0, u0, A, B, C, D)\n"
"end";
}
>>
end match
end functionlinearmodelPython;

template getVarName(list<SimVar> simVars, String arrayName) "template getVarName
Generates name for a varables."
::=
Expand Down Expand Up @@ -4763,6 +4866,22 @@ template genMatrixMatlab(String name, String row, String col, Integer rowI, Inte
end match
end genMatrixMatlab;

template genMatrixJulia(String name, String row, String col, Integer rowI, Integer colI) "template genMatrixJulia
Generates Matrix for linear model in Julia code"
::=
match rowI
case 0 then
<<" local <%name%> = zeros(<%row%>, <%col%>)%s\n">>
case _ then
match colI
case 0 then
<<" local <%name%> = zeros(<%row%>, <%col%>)%s\n">>
case _ then
<<" local <%name%> = [%s]\n">>
end match
end match
end genMatrixJulia;

template genVector(String name, String num, Integer numI, Integer flag) "template genVector
Generates variables Vectors for linear model"
::=
Expand Down
2 changes: 1 addition & 1 deletion OMCompiler/Compiler/Util/Flags.mo
Expand Up @@ -1497,7 +1497,7 @@ constant ConfigFlag STRICT = CONFIG_FLAG(130, "strict",

constant ConfigFlag LINEARIZATION_DUMP_LANGUAGE = CONFIG_FLAG(131, "linearizationDumpLanguage",
NONE(), EXTERNAL(), STRING_FLAG("modelica"),
SOME(STRING_OPTION({"modelica","matlab"})),
SOME(STRING_OPTION({"modelica","matlab","julia","python"})),
Util.gettext("Sets the target language for the produced code of linearization. Only works with '--generateSymbolicLinearization' and 'linearize(modelName)'."));

protected
Expand Down

0 comments on commit 1ff9a98

Please sign in to comment.