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

Commit

Permalink
add 1-norm, 2-norm and max error for deltaSimualtionResults API
Browse files Browse the repository at this point in the history
  • Loading branch information
vwaurich authored and OpenModelica-Hudson committed Aug 9, 2017
1 parent a845eda commit e988ea4
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 11 deletions.
1 change: 1 addition & 0 deletions Compiler/FrontEnd/ModelicaBuiltin.mo
Original file line number Diff line number Diff line change
Expand Up @@ -2892,6 +2892,7 @@ end compareSimulationResults;
public function deltaSimulationResults "calculates the sum of absolute errors."
input String filename;
input String reffilename;
input String method "method to compute then error. choose 1norm, 2norm, maxerr";
input String[:] vars = fill("",0);
output Real result;
external "builtin";
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Script/CevalScriptBackend.mo
Original file line number Diff line number Diff line change
Expand Up @@ -2172,13 +2172,13 @@ algorithm
then
(cache,v,st);

case (cache,_,"deltaSimulationResults",{Values.STRING(filename),Values.STRING(filename_1),Values.ARRAY(valueLst=cvars)},st,_)
case (cache,_,"deltaSimulationResults",{Values.STRING(filename),Values.STRING(filename_1),Values.STRING(method_str),Values.ARRAY(valueLst=cvars)},st,_)
equation
filename = Util.absoluteOrRelative(filename);
filename_1 = Util.testsuiteFriendlyPath(filename_1);
filename_1 = Util.absoluteOrRelative(filename_1);
vars_1 = List.map(cvars, ValuesUtil.extractValueString);
val = SimulationResults.deltaSimulationResults(filename,filename_1,vars_1);
val = SimulationResults.deltaSimulationResults(filename,filename_1,method_str,vars_1);
then
(cache,Values.REAL(val),st);

Expand Down
3 changes: 2 additions & 1 deletion Compiler/Util/SimulationResults.mo
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,10 @@ end cmpSimulationResults;
public function deltaSimulationResults
input String filename;
input String reffilename;
input String method;
input list<String> vars;
output Real res;
external "C" res=SimulationResults_deltaSimulationResults(filename,reffilename,vars) annotation(Library = "omcruntime");
external "C" res=SimulationResults_deltaSimulationResults(filename,reffilename,method,vars) annotation(Library = "omcruntime");
end deltaSimulationResults;

public function diffSimulationResults
Expand Down
53 changes: 47 additions & 6 deletions Compiler/runtime/SimulationResultsCmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,12 @@ typedef struct {
unsigned int n_max;
} DiffDataField;

typedef enum {
NORM1,
NORM2,
MAX_ERR
} ErrorMethod;

#define DOUBLEEQUAL_TOTAL 0.0000000001
#define DOUBLEEQUAL_REL 0.00001

Expand Down Expand Up @@ -159,11 +165,12 @@ static char almostEqualWithDefaultTolerance(double a, double b)
return almostEqualRelativeAndAbs(a,b,DOUBLEEQUAL_REL,DOUBLEEQUAL_TOTAL);
}

static double deltaData(char* varname, DataField *time, DataField *reftime, DataField *data, DataField *refdata)
static double deltaData(ErrorMethod errMethod, DataField *time, DataField *reftime, DataField *data, DataField *refdata)
{
unsigned int i, iRef, i2;
double res, val, valRef, t;
double res,res0, val, valRef, t;
res = 0;
res0 = 0;
i = 0;
for (iRef=0;iRef < reftime->n;iRef++){
valRef = refdata->data[iRef];
Expand All @@ -185,8 +192,23 @@ static double deltaData(char* varname, DataField *time, DataField *reftime, Data
//printf("xl %f xr %f tl %f tr %f \n", data->data[i], data->data[i2], time->data[i], time->data[i2]);
val = (data->data[i2] - data->data[i])/(time->data[i2] - time->data[i])*(t - time->data[i])+data->data[i];
}
res += fabs(valRef-val);
//fprintf(stderr, "at time %f, val: %f and valRef: %f and res %f\n",t,val,valRef, res);
switch(errMethod){
case NORM1:
res0 += fabs(valRef-val); break;
case NORM2:
res0 += pow((valRef-val),2); break;
case MAX_ERR:
res0 = fmax(fabs(valRef-val),res0); break;
default:
res0 += fabs(valRef-val); break;
}
//fprintf(stderr, "at time %f, val: %f and valRef: %f and res %f\n",t,val,valRef, res0);
}
switch(errMethod){
case NORM2:
res = sqrt(res0); break;
default:
res = res0; break;
}
return res;
}
Expand Down Expand Up @@ -770,8 +792,9 @@ void* SimulationResultsCmp_compareResults(int isResultCmp, int runningTestsuite,
return res;
}


/* Common, huge function, for both result comparison and result diff */
double SimulationResultsCmp_deltaResults(const char *filename, const char *reffilename, void *vars)
double SimulationResultsCmp_deltaResults(const char *filename, const char *reffilename, const char *methodname, void *vars)
{
double res = 0;
unsigned int i,size,size_ref, len, k, j;
Expand All @@ -785,6 +808,24 @@ double SimulationResultsCmp_deltaResults(const char *filename, const char *reffi
int offset, offsetRef;
const char *msg[2] = {"",""};

/* choose error method */
ErrorMethod errMethod;

if (0 == strcmp(methodname, "1norm")){
errMethod = NORM1;
}
else if (0 == strcmp(methodname, "2norm")){
errMethod = NORM2;
}
else if (0 == strcmp(methodname, "maxerr")){
errMethod = MAX_ERR;
}
else {
msg[0] = methodname;
c_add_message(NULL,-1, ErrorType_scripting, ErrorLevel_warning, gettext("Unknown method string: %s. 1-Norm is chosen."), msg, 1);
errMethod = NORM1;
}

/* open files */
/* fprintf(stderr, "Open File %s\n", filename); */

Expand Down Expand Up @@ -907,7 +948,7 @@ double SimulationResultsCmp_deltaResults(const char *filename, const char *reffi
dataref.data[j-1] = dataref.data[j];

/* calulate delta */
res += deltaData(var,&time,&timeref,&data,&dataref);
res += deltaData(errMethod,&time,&timeref,&data,&dataref);

/* free */
if (dataref.data) {
Expand Down
4 changes: 2 additions & 2 deletions Compiler/runtime/SimulationResults_omc.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,9 @@ void* SimulationResults_cmpSimulationResults(int runningTestsuite, const char *f
return SimulationResultsCmp_compareResults(1,runningTestsuite,filename,reffilename,logfilename,refTol,absTol,0,0,vars,0,NULL,0,NULL);
}

double SimulationResults_deltaSimulationResults(const char *filename,const char *reffilename, void *vars)
double SimulationResults_deltaSimulationResults(const char *filename,const char *reffilename, const char *methodname, void *vars)
{
double res = SimulationResultsCmp_deltaResults(filename,reffilename,vars);
double res = SimulationResultsCmp_deltaResults(filename,reffilename,methodname,vars);
return res;
}

Expand Down

0 comments on commit e988ea4

Please sign in to comment.