Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 66f09c4

Browse files
vwaurichOpenModelica-Hudson
authored andcommitted
add scriptingAPI to compute error sum
1 parent 5b71b66 commit 66f09c4

File tree

5 files changed

+232
-0
lines changed

5 files changed

+232
-0
lines changed

Compiler/FrontEnd/ModelicaBuiltin.mo

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,6 +2889,17 @@ external "builtin";
28892889
annotation(preferredView="text");
28902890
end compareSimulationResults;
28912891

2892+
public function deltaSimulationResults "calculates the sum of absolute errors."
2893+
input String filename;
2894+
input String reffilename;
2895+
input String[:] vars = fill("",0);
2896+
output Real result;
2897+
external "builtin";
2898+
annotation(Documentation(info="<html>
2899+
<p>For each data point in the reference file, the sum of all absolute error sums of all given variables is calculated.</p>
2900+
</html>"),preferredView="text");
2901+
end deltaSimulationResults;
2902+
28922903
public function diffSimulationResults "compares simulation results."
28932904
input String actualFile;
28942905
input String expectedFile;

Compiler/Script/CevalScriptBackend.mo

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2172,6 +2172,20 @@ algorithm
21722172
then
21732173
(cache,v,st);
21742174

2175+
case (cache,_,"deltaSimulationResults",{Values.STRING(filename),Values.STRING(filename_1),Values.ARRAY(valueLst=cvars)},st,_)
2176+
equation
2177+
filename = Util.absoluteOrRelative(filename);
2178+
filename_1 = Util.testsuiteFriendlyPath(filename_1);
2179+
filename_1 = Util.absoluteOrRelative(filename_1);
2180+
vars_1 = List.map(cvars, ValuesUtil.extractValueString);
2181+
val = SimulationResults.deltaSimulationResults(filename,filename_1,vars_1);
2182+
then
2183+
(cache,Values.REAL(val),st);
2184+
2185+
case (cache,_,"deltaSimulationResults",_,st,_)
2186+
then (cache,Values.STRING("Error in deltaSimulationResults"),st);
2187+
2188+
21752189
case (cache,_,"compareSimulationResults",_,st,_)
21762190
then (cache,Values.STRING("Error in compareSimulationResults"),st);
21772191

Compiler/Util/SimulationResults.mo

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ public function cmpSimulationResults
108108
external "C" res=SimulationResults_cmpSimulationResults(runningTestsuite,filename,reffilename,logfilename,refTol,absTol,vars) annotation(Library = "omcruntime");
109109
end cmpSimulationResults;
110110

111+
public function deltaSimulationResults
112+
input String filename;
113+
input String reffilename;
114+
input list<String> vars;
115+
output Real res;
116+
external "C" res=SimulationResults_deltaSimulationResults(filename,reffilename,vars) annotation(Library = "omcruntime");
117+
end deltaSimulationResults;
111118

112119
public function diffSimulationResults
113120
input Boolean runningTestsuite;

Compiler/runtime/SimulationResultsCmp.c

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,39 @@ static char almostEqualWithDefaultTolerance(double a, double b)
159159
return almostEqualRelativeAndAbs(a,b,DOUBLEEQUAL_REL,DOUBLEEQUAL_TOTAL);
160160
}
161161

162+
static double deltaData(char* varname, DataField *time, DataField *reftime, DataField *data, DataField *refdata)
163+
{
164+
unsigned int i, iRef, i2;
165+
double res, val, valRef, t;
166+
res = 0;
167+
i = 0;
168+
for (iRef=0;iRef < reftime->n;iRef++){
169+
valRef = refdata->data[iRef];
170+
t = reftime->data[iRef];
171+
//get left and right reference point to interpolate
172+
while((time->data[i] < t))
173+
{
174+
i++;
175+
}
176+
i2 = i+1;
177+
//there is a result value at time t
178+
if (fabs(time->data[i]-t) <= max((0.0001*time->data[time->n]),1e-12))
179+
{
180+
val = data->data[i];
181+
}
182+
//interpolate result value at time t
183+
else
184+
{
185+
//printf("xl %f xr %f tl %f tr %f \n", data->data[i], data->data[i2], time->data[i], time->data[i2]);
186+
val = (data->data[i2] - data->data[i])/(time->data[i2] - time->data[i])*(t - time->data[i])+data->data[i];
187+
}
188+
res += fabs(valRef-val);
189+
//fprintf(stderr, "at time %f, val: %f and valRef: %f and res %f\n",t,val,valRef, res);
190+
}
191+
return res;
192+
}
193+
194+
162195
static unsigned int cmpData(int isResultCmp, char* varname, DataField *time, DataField *reftime, DataField *data, DataField *refdata, double reltol, double abstol, DiffDataField *ddf, char **cmpdiffvars, unsigned int vardiffindx, int keepEqualResults, void **diffLst, const char *prefix)
163196
{
164197
unsigned int i,j,k,j_event;
@@ -737,3 +770,164 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
737770
return res;
738771
}
739772

773+
/* Common, huge function, for both result comparison and result diff */
774+
double SimulationResultsCmp_deltaResults(const char *filename, const char *reffilename, void *vars)
775+
{
776+
double res = 0;
777+
unsigned int i,size,size_ref, len, k, j;
778+
unsigned int ncmpvars = 0;
779+
void *allvars,*allvarsref;
780+
char *var,*var1;
781+
char **cmpvars=NULL;
782+
int suggestReadAll=0;
783+
DataField time,timeref,data,dataref;
784+
const char *timeVarName, *timeVarNameRef;
785+
int offset, offsetRef;
786+
const char *msg[2] = {"",""};
787+
788+
/* open files */
789+
/* fprintf(stderr, "Open File %s\n", filename); */
790+
791+
SimulationResultsImpl__close(&simresglob_c);
792+
SimulationResultsImpl__close(&simresglob_ref);
793+
794+
if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(filename,&simresglob_c)) {
795+
msg[0] = filename;
796+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Error opening file: %s."), msg, 1);
797+
return -1;
798+
}
799+
/* fprintf(stderr, "Open File %s\n", reffilename); */
800+
if (UNKNOWN_PLOT == SimulationResultsImpl__openFile(reffilename,&simresglob_ref)) {
801+
msg[0] = filename;
802+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Error opening reference file: %s."), msg, 1);
803+
return -1;
804+
}
805+
806+
size = SimulationResultsImpl__readSimulationResultSize(filename,&simresglob_c);
807+
/*fprintf(stderr, "Read size of File %s size= %d\n", filename,size);*/
808+
size_ref = SimulationResultsImpl__readSimulationResultSize(reffilename,&simresglob_ref);
809+
/*fprintf(stderr, "Read size of File %s size= %d\n", reffilename,size_ref);*/
810+
811+
/* get vars to compare */
812+
cmpvars = getVars(vars,&ncmpvars);
813+
/* if no var compare all vars */
814+
allvars = SimulationResultsImpl__readVarsFilterAliases(filename,&simresglob_c);
815+
allvarsref = SimulationResultsImpl__readVarsFilterAliases(reffilename,&simresglob_ref);
816+
if (ncmpvars==0) {
817+
suggestReadAll = 1;
818+
cmpvars = getVars(allvarsref,&ncmpvars);
819+
if (ncmpvars==0){
820+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Error Getting Vars."), msg, 1);
821+
return -1;
822+
}
823+
}
824+
#ifdef DEBUGOUTPUT
825+
fprintf(stderr, "Compare Vars:\n");
826+
for(i=0;i<ncmpvars;i++)
827+
fprintf(stderr, "Var: %s\n", cmpvars[i]);
828+
#endif
829+
830+
/* get time */
831+
/*fprintf(stderr, "get time\n");*/
832+
timeVarName = getTimeVarName(allvars);
833+
timeVarNameRef = getTimeVarName(allvarsref);
834+
time = getData(timeVarName,filename,size,suggestReadAll,&simresglob_c,0);
835+
if (time.n==0) {
836+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Error get time!"), msg, 0);
837+
return -1;
838+
}
839+
/*fprintf(stderr, "get reftime\n");*/
840+
timeref = getData(timeVarNameRef,reffilename,size_ref,suggestReadAll,&simresglob_ref,0);
841+
if (timeref.n==0) {
842+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("Error get reference time!"), msg, 0);
843+
return -1;
844+
}
845+
846+
/* check if time is larger or less reftime */
847+
if (time.data[0] > timeref.data[0]) {
848+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("The result file starts before the reference file."), msg, 0);
849+
return -1;
850+
}
851+
if(time.data[time.n-1] < timeref.data[timeref.n-1]){
852+
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_error, gettext("The result file ends before the reference file."), msg, 0);
853+
return -1;
854+
}
855+
856+
/* calculate offsets */
857+
for(offset=0; offset<time.n-1 && time.data[offset] == time.data[offset+1]; ++offset);
858+
for(offsetRef=0; offsetRef<timeref.n-1 && timeref.data[offsetRef] == timeref.data[offsetRef+1]; ++offsetRef);
859+
var1=NULL;
860+
/* compare vars */
861+
/* fprintf(stderr, "compare vars\n"); */
862+
for (i=0;i<ncmpvars;i++) {
863+
var = cmpvars[i];
864+
len = strlen(var);
865+
if (var1) {
866+
free(var1);
867+
var1 = NULL;
868+
}
869+
var1 = (char*) omc_alloc_interface.malloc(len+10);
870+
k = 0;
871+
for (j=0;j<len;j++) {
872+
if (var[j] !='\"' ) {
873+
var1[k] = var[j];
874+
k +=1;
875+
}
876+
}
877+
var1[k] = 0;
878+
/* fprintf(stderr, "compare var: %s\n",var); */
879+
/* check if in ref_file */
880+
dataref = getData(var1,reffilename,size_ref,suggestReadAll,&simresglob_ref,0);
881+
if (dataref.n==0) {
882+
if (dataref.data) {
883+
free(dataref.data);
884+
}
885+
if (var1) {
886+
GC_free(var1);
887+
var1 = NULL;
888+
}
889+
continue;
890+
}
891+
/* check if in file */
892+
data = getData(var1,filename,size,suggestReadAll,&simresglob_c,0);
893+
if (data.n==0) {
894+
if (data.data) {
895+
free(data.data);
896+
}
897+
if (var1) {
898+
GC_free(var1);
899+
var1 = NULL;
900+
}
901+
continue;
902+
}
903+
/* adjust initial data points */
904+
for(j=offset; j>0; j--)
905+
data.data[j-1] = data.data[j];
906+
for(j=offsetRef; j>0; j--)
907+
dataref.data[j-1] = dataref.data[j];
908+
909+
/* calulate delta */
910+
res += deltaData(var,&time,&timeref,&data,&dataref);
911+
912+
/* free */
913+
if (dataref.data) {
914+
free(dataref.data);
915+
}
916+
if (data.data) {
917+
free(data.data);
918+
}
919+
if (var1) {
920+
GC_free(var1);
921+
var1 = NULL;
922+
}
923+
}
924+
if (cmpvars) GC_free(cmpvars);
925+
if (time.data) free(time.data);
926+
if (timeref.data) free(timeref.data);
927+
928+
/* close files */
929+
SimulationResultsImpl__close(&simresglob_c);
930+
SimulationResultsImpl__close(&simresglob_ref);
931+
return res;
932+
}
933+

Compiler/runtime/SimulationResults_omc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ void* SimulationResults_cmpSimulationResults(int runningTestsuite, const char *f
7272
return SimulationResultsCmp_compareResults(1,runningTestsuite,filename,reffilename,logfilename,refTol,absTol,0,0,vars,0,NULL,0,NULL);
7373
}
7474

75+
double SimulationResults_deltaSimulationResults(const char *filename,const char *reffilename, void *vars)
76+
{
77+
double res = SimulationResultsCmp_deltaResults(filename,reffilename,vars);
78+
return res;
79+
}
80+
7581
void* SimulationResults_diffSimulationResults(int runningTestsuite, const char *filename,const char *reffilename,const char *logfilename, double refTol, double reltolDiffMaxMin, double rangeDelta, void *vars, int keepEqualResults, int *success)
7682
{
7783
return SimulationResultsCmp_compareResults(0,runningTestsuite,filename,reffilename,logfilename,refTol,0,reltolDiffMaxMin,rangeDelta,vars,keepEqualResults,success,0,NULL);

0 commit comments

Comments
 (0)