@@ -79,6 +79,10 @@ IntervalResult ia_partial(vec2 v, float clip) {
7979 return IntervalResult(v, clip);
8080}
8181
82+ bool ia_is_error(float status) {
83+ return status == IA_EMPTY || status == IA_ENTIRE || status == IA_SINGULAR;
84+ }
85+
8286// Addition
8387IntervalResult ia_add(vec2 a, vec2 b) {
8488 return ia_ok(vec2(a.x + b.x - IA_EPS, a.y + b.y + IA_EPS));
@@ -394,6 +398,198 @@ IntervalResult ia_cosh(vec2 x) {
394398IntervalResult ia_tanh(vec2 x) {
395399 return ia_ok(vec2(tanh(x.x) - IA_EPS, tanh(x.y) + IA_EPS));
396400}
401+
402+ // IntervalResult overloads for propagation
403+ IntervalResult ia_add(IntervalResult a, IntervalResult b) {
404+ if (ia_is_error(a.status)) return a;
405+ if (ia_is_error(b.status)) return b;
406+ return ia_add(a.value, b.value);
407+ }
408+
409+ IntervalResult ia_add(IntervalResult a, vec2 b) {
410+ if (ia_is_error(a.status)) return a;
411+ return ia_add(a.value, b);
412+ }
413+
414+ IntervalResult ia_add(vec2 a, IntervalResult b) {
415+ if (ia_is_error(b.status)) return b;
416+ return ia_add(a, b.value);
417+ }
418+
419+ IntervalResult ia_sub(IntervalResult a, IntervalResult b) {
420+ if (ia_is_error(a.status)) return a;
421+ if (ia_is_error(b.status)) return b;
422+ return ia_sub(a.value, b.value);
423+ }
424+
425+ IntervalResult ia_sub(IntervalResult a, vec2 b) {
426+ if (ia_is_error(a.status)) return a;
427+ return ia_sub(a.value, b);
428+ }
429+
430+ IntervalResult ia_sub(vec2 a, IntervalResult b) {
431+ if (ia_is_error(b.status)) return b;
432+ return ia_sub(a, b.value);
433+ }
434+
435+ IntervalResult ia_mul(IntervalResult a, IntervalResult b) {
436+ if (ia_is_error(a.status)) return a;
437+ if (ia_is_error(b.status)) return b;
438+ return ia_mul(a.value, b.value);
439+ }
440+
441+ IntervalResult ia_mul(IntervalResult a, vec2 b) {
442+ if (ia_is_error(a.status)) return a;
443+ return ia_mul(a.value, b);
444+ }
445+
446+ IntervalResult ia_mul(vec2 a, IntervalResult b) {
447+ if (ia_is_error(b.status)) return b;
448+ return ia_mul(a, b.value);
449+ }
450+
451+ IntervalResult ia_div(IntervalResult a, IntervalResult b) {
452+ if (ia_is_error(a.status)) return a;
453+ if (ia_is_error(b.status)) return b;
454+ return ia_div(a.value, b.value);
455+ }
456+
457+ IntervalResult ia_div(IntervalResult a, vec2 b) {
458+ if (ia_is_error(a.status)) return a;
459+ return ia_div(a.value, b);
460+ }
461+
462+ IntervalResult ia_div(vec2 a, IntervalResult b) {
463+ if (ia_is_error(b.status)) return b;
464+ return ia_div(a, b.value);
465+ }
466+
467+ IntervalResult ia_negate(IntervalResult x) {
468+ if (ia_is_error(x.status)) return x;
469+ return ia_negate(x.value);
470+ }
471+
472+ IntervalResult ia_sqrt(IntervalResult x) {
473+ if (ia_is_error(x.status)) return x;
474+ return ia_sqrt(x.value);
475+ }
476+
477+ IntervalResult ia_square(IntervalResult x) {
478+ if (ia_is_error(x.status)) return x;
479+ return ia_square(x.value);
480+ }
481+
482+ IntervalResult ia_exp(IntervalResult x) {
483+ if (ia_is_error(x.status)) return x;
484+ return ia_exp(x.value);
485+ }
486+
487+ IntervalResult ia_ln(IntervalResult x) {
488+ if (ia_is_error(x.status)) return x;
489+ return ia_ln(x.value);
490+ }
491+
492+ IntervalResult ia_abs(IntervalResult x) {
493+ if (ia_is_error(x.status)) return x;
494+ return ia_abs(x.value);
495+ }
496+
497+ IntervalResult ia_sign(IntervalResult x) {
498+ if (ia_is_error(x.status)) return x;
499+ return ia_sign(x.value);
500+ }
501+
502+ IntervalResult ia_floor(IntervalResult x) {
503+ if (ia_is_error(x.status)) return x;
504+ return ia_floor(x.value);
505+ }
506+
507+ IntervalResult ia_ceil(IntervalResult x) {
508+ if (ia_is_error(x.status)) return x;
509+ return ia_ceil(x.value);
510+ }
511+
512+ IntervalResult ia_min(IntervalResult a, IntervalResult b) {
513+ if (ia_is_error(a.status)) return a;
514+ if (ia_is_error(b.status)) return b;
515+ return ia_min(a.value, b.value);
516+ }
517+
518+ IntervalResult ia_min(IntervalResult a, vec2 b) {
519+ if (ia_is_error(a.status)) return a;
520+ return ia_min(a.value, b);
521+ }
522+
523+ IntervalResult ia_min(vec2 a, IntervalResult b) {
524+ if (ia_is_error(b.status)) return b;
525+ return ia_min(a, b.value);
526+ }
527+
528+ IntervalResult ia_max(IntervalResult a, IntervalResult b) {
529+ if (ia_is_error(a.status)) return a;
530+ if (ia_is_error(b.status)) return b;
531+ return ia_max(a.value, b.value);
532+ }
533+
534+ IntervalResult ia_max(IntervalResult a, vec2 b) {
535+ if (ia_is_error(a.status)) return a;
536+ return ia_max(a.value, b);
537+ }
538+
539+ IntervalResult ia_max(vec2 a, IntervalResult b) {
540+ if (ia_is_error(b.status)) return b;
541+ return ia_max(a, b.value);
542+ }
543+
544+ IntervalResult ia_pow(IntervalResult base, float exp) {
545+ if (ia_is_error(base.status)) return base;
546+ return ia_pow(base.value, exp);
547+ }
548+
549+ IntervalResult ia_sin(IntervalResult x) {
550+ if (ia_is_error(x.status)) return x;
551+ return ia_sin(x.value);
552+ }
553+
554+ IntervalResult ia_cos(IntervalResult x) {
555+ if (ia_is_error(x.status)) return x;
556+ return ia_cos(x.value);
557+ }
558+
559+ IntervalResult ia_tan(IntervalResult x) {
560+ if (ia_is_error(x.status)) return x;
561+ return ia_tan(x.value);
562+ }
563+
564+ IntervalResult ia_asin(IntervalResult x) {
565+ if (ia_is_error(x.status)) return x;
566+ return ia_asin(x.value);
567+ }
568+
569+ IntervalResult ia_acos(IntervalResult x) {
570+ if (ia_is_error(x.status)) return x;
571+ return ia_acos(x.value);
572+ }
573+
574+ IntervalResult ia_atan(IntervalResult x) {
575+ if (ia_is_error(x.status)) return x;
576+ return ia_atan(x.value);
577+ }
578+
579+ IntervalResult ia_sinh(IntervalResult x) {
580+ if (ia_is_error(x.status)) return x;
581+ return ia_sinh(x.value);
582+ }
583+
584+ IntervalResult ia_cosh(IntervalResult x) {
585+ if (ia_is_error(x.status)) return x;
586+ return ia_cosh(x.value);
587+ }
588+
589+ IntervalResult ia_tanh(IntervalResult x) {
590+ if (ia_is_error(x.status)) return x;
591+ return ia_tanh(x.value);
592+ }
397593` ;
398594
399595/**
0 commit comments