Skip to content

Commit fbed275

Browse files
committed
- Safer (but slower) removal of uninteresting points using a recursive algorithm
- Previously we could remove a point because it could be reconstructed using linear interpolation of its neighbours... But those could also be removed. - Swap arguments to addRelativeTolerance (relative was absolute and other way around) git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@17895 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 46612d5 commit fbed275

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

Compiler/runtime/SimulationResultsCmpTubes.c

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -506,9 +506,9 @@ static addTargetEventTimesRes mergeTimelines(addTargetEventTimesRes ref, addTarg
506506
return res;
507507
}
508508

509-
static addTargetEventTimesRes removeUneventfulPoints(addTargetEventTimesRes in, double reltol, double xabstol)
509+
static addTargetEventTimesRes removeUneventfulPoints(addTargetEventTimesRes in, int removeNonEvents, double reltol, double xabstol)
510510
{
511-
int i;
511+
int i,iter=0;
512512
addTargetEventTimesRes res;
513513
res.values = (double*) GC_malloc_atomic(in.size * sizeof(double));
514514
res.time = (double*) GC_malloc_atomic(in.size * sizeof(double));
@@ -522,18 +522,25 @@ static addTargetEventTimesRes removeUneventfulPoints(addTargetEventTimesRes in,
522522
if (in.values[i] == in.values[i-1] && isEvent) {
523523
continue;
524524
}
525-
double x0 = in.time[i-1];
526-
double y0 = in.values[i-1];
525+
double x0 = res.values[res.size-1];
526+
double y0 = res.time[res.size-1];
527527
double x = in.time[i];
528528
double y = in.values[i];
529529
double x1 = in.time[i+1];
530530
double y1 = in.values[i+1];
531-
if (almostEqualRelativeAndAbs(y,linearInterpolation(x,x0,x1,y0,y1,xabstol),reltol,0) && !isEvent) {
531+
if (almostEqualRelativeAndAbs(y,linearInterpolation(x,x0,x1,y0,y1,xabstol),reltol,0) && !isEvent && removeNonEvents) {
532532
/* The point can be reconstructed using linear interpolation */
533+
res.time[res.size] = x1;
534+
res.values[res.size] = y1;
535+
res.size++;
536+
i++;
537+
if (i < in.size-2) {
538+
iter=1;
539+
}
533540
continue;
534541
}
535-
res.values[res.size] = in.values[i];
536-
res.time[res.size] = in.time[i];
542+
res.time[res.size] = x;
543+
res.values[res.size] = y;
537544
res.size++;
538545
}
539546
if (in.size > 1) {
@@ -542,11 +549,15 @@ static addTargetEventTimesRes removeUneventfulPoints(addTargetEventTimesRes in,
542549
res.time[res.size] = in.time[in.size-1];
543550
res.size++;
544551
}
545-
return res;
552+
if (iter) {
553+
return removeUneventfulPoints(res,removeNonEvents,reltol,xabstol);
554+
} else {
555+
return res;
556+
}
546557
}
547558

548559
/* Adds a relative tolerance compared to the reference signal. Overwrites the target values vector. */
549-
static inline void addRelativeTolerance(double *targetValues, double *sourceValues, double length, double abstol, double reltol, int direction)
560+
static inline void addRelativeTolerance(double *targetValues, double *sourceValues, size_t length, double reltol, double abstol, int direction)
550561
{
551562
int i;
552563
if (direction > 0) {
@@ -580,17 +591,18 @@ static unsigned int cmpDataTubes(int isResultCmp, char* varname, DataField *time
580591
size_t html_size=0;
581592
double xabstol = (reftime->data[reftime->n-1]-reftime->data[0])*rangeDelta;
582593
/* Calculate the tubes without additional events added */
583-
addTargetEventTimesRes ref,actual;
594+
addTargetEventTimesRes ref,actual,actualoriginal;
584595
ref.values = refdata->data;
585596
ref.time = reftime->data;
586597
ref.size = reftime->n;
587-
actual.values = data->data;
588-
actual.time = time->data;
589-
actual.size = time->n;
598+
actualoriginal.values = data->data;
599+
actualoriginal.time = time->data;
600+
actualoriginal.size = time->n;
601+
actual = actualoriginal;
590602
/* assertMonotonic(ref); */
591603
/* assertMonotonic(actual); */
592-
ref = removeUneventfulPoints(ref, reltol, xabstol);
593-
actual = removeUneventfulPoints(actual, reltol, xabstol);
604+
ref = removeUneventfulPoints(ref, 1, reltol, xabstol);
605+
actual = removeUneventfulPoints(actual, 1, reltol, xabstol);
594606
/* assertMonotonic(ref); */
595607
/* assertMonotonic(actual); */
596608
privates *priv = calculateTubes(ref.time,ref.values,ref.size,rangeDelta);
@@ -640,11 +652,15 @@ static unsigned int cmpDataTubes(int isResultCmp, char* varname, DataField *time
640652
"<label for=\"4\">error</label>\n"
641653
"<input type=checkbox id=\"5\" onClick=\"change(this)\">\n"
642654
"<label for=\"5\">actual (original)</label>\n"
643-
"Parameters used for the comparison: Relative tolerance %.2g. Absolute tolerance %.2g (%.2g relative). Range delta %.2g."
655+
"Reference time: %.15g to %.15g, actual time: %.15g to %.15g. Parameters used for the comparison: Relative tolerance %.2g. Absolute tolerance %.2g (%.2g relative). Range delta %.2g."
644656
"</p>\n"
645657
"<script type=\"text/javascript\">\n"
646658
"g = new Dygraph(document.getElementById(\"graphdiv\"),\n"
647659
"[\n",
660+
reftime->data[0],
661+
reftime->data[reftime->n-1],
662+
time->data[0],
663+
time->data[time->n-1],
648664
reltol,
649665
abstol,
650666
reltolDiffMaxMin,

0 commit comments

Comments
 (0)