@@ -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