[Pkg-octave-commit] [octave-interval] 01/03: Imported Upstream version 2.0.0
Oliver Heimlich
oheim-guest at moszumanska.debian.org
Mon Nov 21 23:40:13 UTC 2016
This is an automated email from the git hooks/post-receive script.
oheim-guest pushed a commit to branch master
in repository octave-interval.
commit bc78510a443b7700847b341d338175db28655422
Author: Oliver Heimlich <oheim at posteo.de>
Date: Tue Nov 22 00:29:31 2016 +0100
Imported Upstream version 2.0.0
---
CITATION | 4 +-
DESCRIPTION | 7 +-
INDEX | 11 +
NEWS | 88 +
doc/NEWS.texinfo | 64 +
doc/chapter/advanced-topics.texinfo | 8 +-
doc/chapter/ieee-1788.texinfo | 4 +-
doc/image/cameleon-animation.svg | 15210 +++++-----------------------
doc/image/cameleon-start-end.svg.eps | 2 +-
doc/image/cameleon-transition.svg.eps | 2 +-
doc/image/inverse-power.svg.eps | 2 +-
doc/image/octave-interval.ly.pdf | Bin 18023 -> 18023 bytes
inst/@infsup/abs.m | 82 +-
inst/@infsup/absrev.m | 64 +-
inst/@infsup/acos.m | 61 +-
inst/@infsup/acosh.m | 54 +-
inst/@infsup/asin.m | 28 +-
inst/@infsup/asinh.m | 16 +-
inst/@infsup/atan.m | 20 +-
inst/@infsup/atan2.m | 69 +-
inst/@infsup/atan2rev1.m | 54 +-
inst/@infsup/atan2rev2.m | 52 +-
inst/@infsup/atanh.m | 21 +-
inst/@infsup/bisect.m | 40 +-
inst/@infsup/bitunpack.m | 6 +-
inst/@infsup/cancelminus.m | 19 +-
inst/@infsup/cancelplus.m | 4 +-
inst/@infsup/cat.m | 31 +-
inst/@infsup/cbrt.m | 25 +-
inst/@infsup/ceil.m | 67 +-
inst/@infsup/chol.m | 169 +
inst/@infsup/columns.m | 6 +-
inst/@infsup/cos.m | 57 +-
inst/@infsup/cosh.m | 15 +-
inst/@infsup/coshrev.m | 6 +-
inst/@infsup/cosrev.m | 60 +-
inst/@infsup/cot.m | 31 +-
inst/@infsup/coth.m | 29 +-
inst/@infsup/csc.m | 49 +-
inst/@infsup/csch.m | 37 +-
inst/@infsup/ctranspose.m | 3 +-
inst/@infsup/det.m | 6 +-
inst/@infsup/diag.m | 28 +-
inst/@infsup/dilog.m | 24 +-
inst/@infsup/disjoint.m | 2 +-
inst/@infsup/disp.m | 32 +-
inst/@infsup/display.m | 7 +-
inst/@infsup/dot.m | 69 +-
inst/@infsup/ei.m | 15 +-
inst/@infsup/erf.m | 21 +-
inst/@infsup/erfc.m | 23 +-
inst/@infsup/exp.m | 18 +-
inst/@infsup/expm.m | 5 +-
inst/@infsup/expm1.m | 20 +-
inst/@infsup/factorial.m | 27 +-
inst/@infsup/fix.m | 78 +-
inst/@infsup/floor.m | 67 +-
inst/@infsup/fma.m | 43 +-
inst/@infsup/fminsearch.m | 2 +-
inst/@infsup/fzero.m | 6 +-
inst/@infsup/gamma.m | 121 +-
inst/@infsup/gammaln.m | 38 +-
inst/@infsup/gauss.m | 53 +-
inst/@infsup/hdist.m | 32 +-
inst/@infsup/horzcat.m | 14 +-
inst/@infsup/hypot.m | 21 +-
inst/@infsup/idist.m | 20 +-
inst/@infsup/inf.m | 14 +-
inst/@infsup/infsup.m | 1642 ++-
inst/@infsup/interior.m | 2 +-
inst/@infsup/intersect.m | 77 +-
inst/@infsup/intervaltoexact.m | 2 +-
inst/@infsup/intervaltotext.m | 49 +-
inst/@infsup/inv.m | 9 +-
inst/@infsup/iscommoninterval.m | 3 +-
inst/@infsup/isempty.m | 9 +-
inst/@infsup/isentire.m | 4 +-
inst/@infsup/ldivide.m | 4 +-
inst/@infsup/linspace.m | 15 +-
inst/@infsup/log.m | 20 +-
inst/@infsup/log10.m | 20 +-
inst/@infsup/log1p.m | 20 +-
inst/@infsup/log2.m | 20 +-
inst/@infsup/lu.m | 35 +-
inst/@infsup/mag.m | 2 +-
inst/@infsup/max.m | 15 +-
inst/@infsup/meshgrid.m | 16 +-
inst/@infsup/mid.m | 12 +-
inst/@infsup/mig.m | 4 +-
inst/@infsup/min.m | 15 +-
inst/@infsup/mince.m | 11 +-
inst/@infsup/minus.m | 21 +-
inst/@infsup/mldivide.m | 12 +-
inst/@infsup/mpower.m | 12 +-
inst/@infsup/mrdivide.m | 4 +-
inst/@infsup/mtimes.m | 10 +-
inst/@infsup/mulrev.m | 112 +-
inst/@infsup/newdec.m | 5 +-
inst/@infsup/nextout.m | 20 +-
inst/@infsup/norm.m | 24 +-
inst/@infsup/nthroot.m | 87 +-
inst/@infsup/overlap.m | 10 +-
inst/@infsup/plot.m | 26 +-
inst/@infsup/plot3.m | 160 +-
inst/@infsup/plus.m | 15 +-
inst/@infsup/polyval.m | 12 +-
inst/@infsup/postpad.m | 17 +-
inst/@infsup/pow.m | 31 +-
inst/@infsup/pow10.m | 15 +-
inst/@infsup/pow2.m | 15 +-
inst/@infsup/power.m | 66 +-
inst/@infsup/pown.m | 26 +-
inst/@infsup/pownrev.m | 14 +-
inst/@infsup/powrev1.m | 145 +-
inst/@infsup/powrev2.m | 99 +-
inst/@infsup/prepad.m | 17 +-
inst/@infsup/prod.m | 19 +-
inst/@infsup/psi.m | 27 +-
inst/@infsup/qr.m | 161 +
inst/@infsup/rad.m | 5 +-
inst/@infsup/rdivide.m | 69 +-
inst/@infsup/realsqrt.m | 24 +-
inst/@infsup/recip.m | 52 -
inst/@infsup/reshape.m | 12 +-
inst/@infsup/resize.m | 34 +-
inst/@infsup/round.m | 65 +-
inst/@infsup/roundb.m | 69 +-
inst/@infsup/rows.m | 3 +-
inst/@infsup/rsqrt.m | 20 +-
inst/@infsup/sdist.m | 22 +-
inst/@infsup/sec.m | 45 +-
inst/@infsup/sech.m | 20 +-
inst/@infsup/setdiff.m | 21 +-
inst/@infsup/setxor.m | 53 +-
inst/@infsup/sign.m | 25 +-
inst/@infsup/sin.m | 63 +-
inst/@infsup/sinh.m | 21 +-
inst/@infsup/sinrev.m | 54 +-
inst/@infsup/size.m | 9 +-
inst/@infsup/smig.m | 6 +-
inst/@infsup/sqr.m | 52 -
inst/@infsup/sqrrev.m | 6 +-
inst/@infsup/sqrt.m | 4 +-
inst/@infsup/strictprecedes.m | 2 +-
inst/@infsup/subsasgn.m | 14 +-
inst/@infsup/subsref.m | 23 +-
inst/@infsup/sum.m | 29 +-
inst/@infsup/sumabs.m | 13 +-
inst/@infsup/sumsq.m | 13 +-
inst/@infsup/sup.m | 14 +-
inst/@infsup/tan.m | 33 +-
inst/@infsup/tanh.m | 21 +-
inst/@infsup/tanrev.m | 52 +-
inst/@infsup/times.m | 23 +-
inst/@infsup/transpose.m | 13 +-
inst/@infsup/tril.m | 57 +
inst/@infsup/triu.m | 57 +
inst/@infsup/uminus.m | 17 +-
inst/@infsup/union.m | 9 +-
inst/@infsup/uplus.m | 4 +-
inst/@infsup/vertcat.m | 16 +-
inst/@infsup/wid.m | 6 +-
inst/@infsupdec/abs.m | 65 +-
inst/@infsupdec/absrev.m | 76 +-
inst/@infsupdec/acos.m | 16 +-
inst/@infsupdec/acosh.m | 16 +-
inst/@infsupdec/asin.m | 16 +-
inst/@infsupdec/asinh.m | 11 +-
inst/@infsupdec/atan.m | 11 +-
inst/@infsupdec/atan2.m | 26 +-
inst/@infsupdec/atan2rev1.m | 22 +-
inst/@infsupdec/atan2rev2.m | 22 +-
inst/@infsupdec/atanh.m | 16 +-
inst/@infsupdec/bisect.m | 13 +-
inst/@infsupdec/bitunpack.m | 20 +-
inst/@infsupdec/cancelminus.m | 18 +-
inst/@infsupdec/cat.m | 81 +
inst/@infsupdec/cbrt.m | 11 +-
inst/@infsupdec/ceil.m | 22 +-
inst/@infsupdec/cos.m | 11 +-
inst/@infsupdec/cosh.m | 11 +-
inst/@infsupdec/coshrev.m | 16 +-
inst/@infsupdec/cosrev.m | 16 +-
inst/@infsupdec/cot.m | 16 +-
inst/@infsupdec/coth.m | 14 +-
inst/@infsupdec/csc.m | 16 +-
inst/@infsupdec/csch.m | 9 +-
inst/@infsupdec/decorationpart.m | 2 +-
inst/@infsupdec/det.m | 11 +-
inst/@infsupdec/diag.m | 38 +-
inst/@infsupdec/dilog.m | 12 +-
inst/@infsupdec/disjoint.m | 7 +-
inst/@infsupdec/dot.m | 9 +-
inst/@infsupdec/ei.m | 17 +-
inst/@infsupdec/eq.m | 50 +-
inst/@infsupdec/erf.m | 11 +-
inst/@infsupdec/erfc.m | 13 +-
inst/@infsupdec/exp.m | 11 +-
inst/@infsupdec/expm1.m | 13 +-
inst/@infsupdec/factorial.m | 22 +-
inst/@infsupdec/fix.m | 22 +-
inst/@infsupdec/floor.m | 22 +-
inst/@infsupdec/fma.m | 20 +-
inst/@infsupdec/gamma.m | 16 +-
inst/@infsupdec/gammaln.m | 18 +-
inst/@infsupdec/gauss.m | 17 +-
inst/@infsupdec/horzcat.m | 66 -
inst/@infsupdec/hypot.m | 15 +-
inst/{@infsup => @infsupdec}/inf.m | 31 +-
inst/@infsupdec/infsupdec.m | 570 +-
inst/@infsupdec/interior.m | 7 +-
inst/@infsupdec/intersect.m | 27 +-
inst/@infsupdec/intervalpart.m | 10 +-
inst/@infsupdec/intervaltotext.m | 13 +-
inst/@infsupdec/isempty.m | 9 +-
inst/@infsupdec/isnai.m | 5 +-
inst/@infsupdec/le.m | 7 +-
inst/@infsupdec/linspace.m | 13 +-
inst/@infsupdec/log.m | 17 +-
inst/@infsupdec/log10.m | 17 +-
inst/@infsupdec/log1p.m | 17 +-
inst/@infsupdec/log2.m | 17 +-
inst/@infsupdec/lt.m | 7 +-
inst/@infsupdec/lu.m | 12 +-
inst/@infsupdec/max.m | 20 +-
inst/@infsupdec/meshgrid.m | 30 +-
inst/@infsupdec/min.m | 20 +-
inst/@infsupdec/mince.m | 9 +-
inst/@infsupdec/minus.m | 15 +-
inst/@infsupdec/mldivide.m | 27 +-
inst/@infsupdec/mpower.m | 8 +-
inst/@infsupdec/mtimes.m | 17 +-
inst/@infsupdec/mulrev.m | 30 +-
inst/@infsupdec/nextout.m | 11 +-
inst/@infsupdec/nthroot.m | 9 +-
inst/@infsupdec/overlap.m | 2 +-
inst/@infsupdec/plus.m | 15 +-
inst/@infsupdec/polyval.m | 11 +-
inst/@infsupdec/postpad.m | 19 +-
inst/@infsupdec/pow.m | 26 +-
inst/@infsupdec/pow10.m | 11 +-
inst/@infsupdec/pow2.m | 11 +-
inst/@infsupdec/power.m | 20 +-
inst/@infsupdec/pown.m | 17 +-
inst/@infsupdec/pownrev.m | 12 +-
inst/@infsupdec/powrev1.m | 21 +-
inst/@infsupdec/powrev2.m | 21 +-
inst/@infsupdec/precedes.m | 7 +-
inst/@infsupdec/prepad.m | 19 +-
inst/@infsupdec/prod.m | 7 +-
inst/@infsupdec/psi.m | 12 +-
inst/@infsupdec/rdivide.m | 25 +-
inst/@infsupdec/realsqrt.m | 19 +-
inst/@infsupdec/reshape.m | 20 +-
inst/@infsupdec/resize.m | 32 +-
inst/@infsupdec/round.m | 63 +-
inst/@infsupdec/roundb.m | 67 +-
inst/@infsupdec/rsqrt.m | 17 +-
inst/@infsupdec/sec.m | 16 +-
inst/@infsupdec/sech.m | 11 +-
inst/@infsupdec/setdiff.m | 17 +-
inst/@infsupdec/setxor.m | 18 +-
inst/@infsupdec/sign.m | 26 +-
inst/@infsupdec/sin.m | 11 +-
inst/@infsupdec/sinh.m | 11 +-
inst/@infsupdec/sinrev.m | 16 +-
inst/@infsupdec/sqrrev.m | 16 +-
inst/@infsupdec/strictprecedes.m | 7 +-
inst/@infsupdec/strictsubset.m | 7 +-
inst/@infsupdec/subsasgn.m | 21 +-
inst/@infsupdec/subset.m | 7 +-
inst/@infsupdec/subsref.m | 20 +-
inst/@infsupdec/sum.m | 7 +-
inst/{@infsup => @infsupdec}/sup.m | 31 +-
inst/@infsupdec/tan.m | 16 +-
inst/@infsupdec/tanh.m | 7 +-
inst/@infsupdec/tanrev.m | 16 +-
inst/@infsupdec/times.m | 15 +-
inst/@infsupdec/transpose.m | 13 +-
inst/@infsupdec/tril.m | 67 +
inst/@infsupdec/triu.m | 67 +
inst/@infsupdec/uminus.m | 11 +-
inst/@infsupdec/union.m | 27 +-
inst/@infsupdec/vertcat.m | 70 -
inst/__split_interval_literals__.m | 2 +-
inst/ctc_intersect.m | 2 +-
inst/ctc_union.m | 2 +-
inst/empty.m | 25 +-
inst/entire.m | 25 +-
inst/hull.m | 92 +-
inst/midrad.m | 118 +-
inst/nai.m | 23 +-
inst/test/abs_rev.tst | 2 +-
inst/test/atan2.tst | 2 +-
inst/test/c-xsc.tst | 2 +-
inst/test/fi_lib.tst | 2 +-
inst/test/libieeep1788_tests_bool.tst | 2 +-
inst/test/libieeep1788_tests_cancel.tst | 2 +-
inst/test/libieeep1788_tests_elem.tst | 2 +-
inst/test/libieeep1788_tests_mul_rev.tst | 2 +-
inst/test/libieeep1788_tests_num.tst | 2 +-
inst/test/libieeep1788_tests_overlap.tst | 2 +-
inst/test/libieeep1788_tests_rec_bool.tst | 2 +-
inst/test/libieeep1788_tests_rev.tst | 2 +-
inst/test/libieeep1788_tests_set.tst | 2 +-
inst/test/mpfi.tst | 2 +-
inst/test/mpfr_matrix_mul_d.cc-tst | 22 +
inst/test/mpfr_to_string_d.cc-tst | 8 +
inst/test/pow_rev.tst | 2 +-
inst/vereigback.m | 108 +
inst/vereigvec.m | 221 +
inst/verintlinineqs.m | 206 +
inst/verinvnonneg.m | 132 +
inst/verlinineqnn.m | 172 +
inst/verlinprog.m | 281 +
src/mpfr_function_d.cc | 92 +-
src/mpfr_matrix_mul_d.cc | 23 +
src/mpfr_to_string_d.cc | 129 +-
318 files changed, 9796 insertions(+), 16641 deletions(-)
diff --git a/CITATION b/CITATION
index 1c536f5..8e3375e 100644
--- a/CITATION
+++ b/CITATION
@@ -7,8 +7,8 @@ in publications use:
author = {Oliver Heimlich},
title = {GNU Octave Interval Package},
url = {http://octave.sourceforge.net/interval/},
- version = {1.5.0},
- date = {2016-05-31},
+ version = {2.0.0},
+ date = {2016-11-20},
}
See also ‘citation’ for citing Octave as a whole.
diff --git a/DESCRIPTION b/DESCRIPTION
index d4c5cde..146fac2 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,6 +1,6 @@
Name: interval
-Version: 1.5.0
-Date: 2016-05-31
+Version: 2.0.0
+Date: 2016-11-20
Author: Oliver Heimlich <oheim at posteo.de>
Maintainer: Oliver Heimlich <oheim at posteo.de>
Title: Real-valued interval arithmetic
@@ -16,9 +16,6 @@ Description: The interval package for real-valued interval arithmetic allows
The implementation is based on interval boundaries represented by binary64
numbers and is conforming to IEEE Std 1788-2015, IEEE standard for interval
arithmetic.
-Problems: Comparison with isequal fails for interval matrices in
- Octave 4.0.0 (bug #44334, fixed in Octave 4.0.1). 3D plotting is not possible
- with gnuplot as graphics toolkit (bug #45594).
Depends: octave (>= 3.8.0)
SystemRequirements: mpfr (>= 3.1.0) [Debian] libmpfr4 (>= 3.1.0)
BuildRequires: mpfr (>= 3.1.0) [Debian] libmpfr-dev (>= 3.1.0)
diff --git a/INDEX b/INDEX
index 38bbbf9..15ca625 100644
--- a/INDEX
+++ b/INDEX
@@ -74,6 +74,7 @@ Interval function (most with tightest accuracy)
@infsup/uminus
@infsup/uplus
Interval matrix operation
+ @infsup/chol
@infsup/det
@infsup/dot
@infsup/expm
@@ -85,6 +86,7 @@ Interval matrix operation
@infsup/mtimes
@infsup/norm
@infsup/prod
+ @infsup/qr
@infsup/sum
@infsup/sumabs
@infsup/sumsq
@@ -160,6 +162,13 @@ Interval solver or optimizer
Interval contractor arithmetic
ctc_intersect
ctc_union
+Verified solver or optimizer
+ vereigback
+ vereigvec
+ verintlinineqs
+ verinvnonneg
+ verlinineqnn
+ verlinprog
Utility function
@infsup/cat
@infsup/columns
@@ -185,6 +194,8 @@ Utility function
@infsup/subsasgn
@infsup/subsref
@infsup/transpose
+ @infsup/tril
+ @infsup/triu
@infsup/vertcat
@infsupdec/decorationpart
@infsupdec/intervalpart
diff --git a/NEWS b/NEWS
index 2b17f98..ec5a9f2 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,94 @@
GNU Octave Interval Package
Summary of important user-visible changes
+Version 2.0.0 2016-11-20
+========================
+
+This major release contains fundamental changes to the interval
+constructors. After a discussion on the P1788 mailing list, it has been
+revealed that this interval package didn’t implement exceptions from the
+standard for interval arithmetic correctly: Operations from IEEE Std
+1788-2015 which trigger an “exception” shall return a value nonetheless.
+Conformance has been improved in this new version, but may break
+compatibility with previous versions.
+
+ A second big news is that the interval package comprises functions
+from VERSOFT, a verification software package by Jiří Rohn, who has
+generously published his work as free software this year.
+Unfortunately, some of VERSOFT’s functions are encrypted and could not
+be included yet.
+
+ • nai: With additional arguments, matrices of NaI (not an interval)
+ values can be constructed. Previously, NaI has been restricted to
+ be of scalar value.
+
+ • infsup: The bare interval constructor merely triggers a warning
+ instead of an error on illegal input, which creates empty
+ intervals. If input contains legitimate as well as illegal input,
+ only entries with illegal input will carry empty intervals.
+
+ • infsupdec: The decorated interval constructor may create interval
+ matrices which have NaI (not an interval) as entries. If input
+ contains legitimate as well as illegal input, only entries with
+ illegal input will carry NaI values.
+
+ • Warning and error identifiers of the constructors have been
+ revised.
+
+ The warning identifier ‘interval:NaI’ has been removed. Illegal
+ input signals an ‘interval:UndefinedOperation’ warning. If the
+ input is of an illegal data type or of illegal size, the
+ constructors signal an ‘interval:InvalidOperand’ warning.
+
+ The warning identifier ‘interval:PossiblyUndefinedOperation’ has
+ been renamed to ‘interval:PossiblyUndefined’ to better match the
+ wording in the standard document. Also, previous versions failed
+ to trigger this warning in cases where there is a floating point
+ number between boundaries U < L, which has been fixed.
+
+ • It is no longer valid to call ‘infsup (+inf, -inf)’ to create an
+ empty interval and the constructor will signal a warning in these
+ cases. This change has been made to better conform to the
+ ‘numsToInterval’ function from the interval standard.
+
+ You may create empty intervals with either ‘infsup ()’ or
+ ‘infsupdec ()’ or ‘empty ()’.
+
+ • inf, sup: If the input is NaI (not an interval), these functions
+ return NaN (not a number) values instead of an error.
+
+ • Output of intervals in hexadecimal form discriminates between
+ subnormal boundaries and normal boundaries. Subnormal numbers
+ start with “0x0.” whereas normal numbers start with “0x1.”.
+
+ Also, hexadecimal form has been changed to lower case.
+
+ • resize: New interval elements are initialized with zero instead of
+ empty intervals to better match the corresponding Octave function.
+
+ • Interval constructors may broadcast column and row vectors.
+
+ • Performance improvements: factorial on large arguments; plot and
+ plot3 on input that is plotted as a line.
+
+ • New interval functions: tril, triu, qr
+
+ • New functions which have been ported from Jiří Rohn’s VERSOFT:
+ chol, vereigback, vereigvec, verintlinineqs, verinvnonneg,
+ verlinineqnn, verlinprog
+
+ • recip, sqr: The functions have been removed, after they have been
+ deprecated in version 1.4.0.
+
+ • plot3: Fixed plotting with gnuplot and fixed an issue where the
+ figure did not switch from 2D to 3D after plotting.
+
+ • expm1: Fixed documentation, the function computes exp (X) - 1
+ instead of exp (X - 1).
+
+ • norm: Fixed an error where the Hamming norm of empty intervals was
+ non-empty.
+
Version 1.5.0 2016-05-31
========================
diff --git a/doc/NEWS.texinfo b/doc/NEWS.texinfo
index ac613a2..d717b3a 100644
--- a/doc/NEWS.texinfo
+++ b/doc/NEWS.texinfo
@@ -14,6 +14,70 @@
@center GNU Octave Interval Package
@center Summary of important user-visible changes
+ at release{2.0.0, 2016-11-20}
+This major release contains fundamental changes to the interval constructors. After a discussion on the P1788 mailing list, it has been revealed that this interval package didn't implement exceptions from the standard for interval arithmetic correctly: Operations from IEEE Std 1788-2015 which trigger an “exception” shall return a value nonetheless. Conformance has been improved in this new version, but may break compatibility with previous versions.
+
+A second big news is that the interval package comprises functions from VERSOFT, a verification software package by Jiří Rohn, who has generously published his work as free software this year. Unfortunately, some of VERSOFT's functions are encrypted and could not be included yet.
+
+ at itemize
+ at item
+ nai: With additional arguments, matrices of NaI (not an interval) values can be constructed. Previously, NaI has been restricted to be of scalar value.
+
+ at item
+ infsup: The bare interval constructor merely triggers a warning instead of an error on illegal input, which creates empty intervals. If input contains legitimate as well as illegal input, only entries with illegal input will carry empty intervals.
+
+ at item
+ infsupdec: The decorated interval constructor may create interval matrices which have NaI (not an interval) as entries. If input contains legitimate as well as illegal input, only entries with illegal input will carry NaI values.
+
+ at item
+ Warning and error identifiers of the constructors have been revised.
+
+ The warning identifier @code{interval:NaI} has been removed. Illegal input signals an @code{interval:UndefinedOperation} warning. If the input is of an illegal data type or of illegal size, the constructors signal an @code{interval:InvalidOperand} warning.
+
+ The warning identifier @code{interval:PossiblyUndefinedOperation} has been renamed to @code{interval:PossiblyUndefined} to better match the wording in the standard document. Also, previous versions failed to trigger this warning in cases where there is a floating point number between boundaries @var{u} < @var{l}, which has been fixed.
+
+ at item
+ It is no longer valid to call @code{infsup (+inf, -inf)} to create an empty interval and the constructor will signal a warning in these cases. This change has been made to better conform to the @command{numsToInterval} function from the interval standard.
+
+ You may create empty intervals with either @code{infsup ()} or @code{infsupdec ()} or @code{empty ()}.
+
+ at item
+ inf, sup: If the input is NaI (not an interval), these functions return NaN (not a number) values instead of an error.
+
+ at item
+ Output of intervals in hexadecimal form discriminates between subnormal boundaries and normal boundaries. Subnormal numbers start with “0x0.” whereas normal numbers start with “0x1.”.
+
+ Also, hexadecimal form has been changed to lower case.
+
+ at item
+ resize: New interval elements are initialized with zero instead of empty intervals to better match the corresponding Octave function.
+
+ at item
+ Interval constructors may broadcast column and row vectors.
+
+ at item
+ Performance improvements: factorial on large arguments; plot and plot3 on input that is plotted as a line.
+
+ at item
+ New interval functions: tril, triu, qr
+
+ at item
+ New functions which have been ported from Jiří Rohn's VERSOFT: chol, vereigback, vereigvec, verintlinineqs, verinvnonneg, verlinineqnn, verlinprog
+
+ at item
+ recip, sqr: The functions have been removed, after they have been deprecated in version 1.4.0.
+
+ at item
+ plot3: Fixed plotting with gnuplot and fixed an issue where the figure did not switch from 2D to 3D after plotting.
+
+ at item
+ expm1: Fixed documentation, the function computes exp (X) - 1 instead of exp (X - 1).
+
+ at item
+ norm: Fixed an error where the Hamming norm of empty intervals was non-empty.
+
+ at end itemize
+
@release{1.5.0, 2016-05-31}
@itemize
@item
diff --git a/doc/chapter/advanced-topics.texinfo b/doc/chapter/advanced-topics.texinfo
index cb5d374..29c34d5 100644
--- a/doc/chapter/advanced-topics.texinfo
+++ b/doc/chapter/advanced-topics.texinfo
@@ -9,7 +9,7 @@
Due to the nature of set-based interval arithmetic, one should not observe errors (in the sense of raised GNU Octave error messages) during computation unless operations are evaluated for incompatible data types. Arithmetic operations which are not defined for (parts of) their input, simply ignore anything that is outside of their domain.
-However, the interval constructors can produce errors depending on the input. The @funref{@@infsup/infsup} constructor will fail if the interval boundaries are invalid. Contrariwise, the (preferred) @funref{@@infsupdec/infsupdec}, @funref{midrad} and @funref{hull} constructors will only issue a warning and return a [NaI] object, which will propagate and survive through computations. NaI stands for “not an interval”.
+However, the interval constructors can produce warnings depending on the input. The @funref{@@infsup/infsup} constructor will warn if the interval boundaries are invalid and returns empty intervals in these cases. Contrariwise, the (preferred) @funref{@@infsupdec/infsupdec}, @funref{midrad} and @funref{hull} constructors will only issue a warning and return [NaI] objects, which will propagate and survive through computations. NaI stands for “not an interval”.
Effects of set-based interval arithmetic on partial functions and the NaI object
@example
@@ -63,13 +63,13 @@ An interval operation has been evaluated on both, a bare and a decorated interva
The implicit conversion applies the best possible decoration for the bare interval. If the bare interval has been produced from an interval arithmetic computation, this branch of computation is not covered by the decoration information and the final decoration could be considered wrong. For example, @code{infsupdec (1, 2) + infsup (0, 1) ^ 0} would ignore that 0^0 is undefined.
@end table
- at item interval:NaI
+ at item interval:UndefinedOperation
@table @asis
@item Reason
-An error has occurred during interval construction and the NaI object has been produced. The warning text contains further details. A NaI can be explicitly created with the @funref{nai} function.
+An error has occurred during interval construction and the NaI object has been produced (an empty interval in case of the bare interval constructor). The warning text contains further details. A NaI can be explicitly created with the @funref{nai} function.
@item Possible consequences
-Nothing bad is going to happen, because the semantics of NaI are well defined by IEEE Std 1788-2015. However, the user might choose to cancel the algorithm immediately when the NaI is encountered for the first time.
+Nothing bad is going to happen, because the semantics of NaI and empty intervals are well defined by IEEE Std 1788-2015. However, the user might choose to cancel the algorithm immediately when the NaI is encountered for the first time.
@end table
@end table
diff --git a/doc/chapter/ieee-1788.texinfo b/doc/chapter/ieee-1788.texinfo
index 961c6f4..01eb5ad 100644
--- a/doc/chapter/ieee-1788.texinfo
+++ b/doc/chapter/ieee-1788.texinfo
@@ -512,7 +512,7 @@ The inverval package version @value{version} for GNU Octave is conforming to IE
@item
What mechanisms of exception handling are used in exception handlers provided by the implementation? What additional exception handling is provided by the implementation?
- The exceptions described by IEEE Std 1788-2015 raise an error, which can be handled with GNU Octave's error mechanism. The implementation provides no additional exception handling.
+ The exceptions described by IEEE Std 1788-2015 raise a warning, which can be handled with GNU Octave's warning mechanism. The warning may be customized to produce an error instead and interrupt computation. The implementation provides no additional exception handling.
@item
[Question does not apply to IEEE 754 conforming types.]
@@ -549,7 +549,7 @@ The inverval package version @value{version} for GNU Octave is conforming to IE
If at least one input is a decorated interval, bare interval inputs are implicitly decorated as described by @command{newDec} in the standard document. Implicit promotion from a bare interval to a decorated interval is signaled with GNU Octave's warning mechanism.
- If implicit conversion fails (e.g., illegal interval literals), bare interval operations raise an error, whereas the decorated interval operations continue on NaI inputs.
+ If implicit conversion fails (e.g., illegal interval literals), bare interval operations produce empty intervals, whereas the decorated interval operations continue on NaI inputs.
@item
[Question does not apply to IEEE 754 conforming types.]
diff --git a/doc/image/cameleon-animation.svg b/doc/image/cameleon-animation.svg
index dceeed3..e04b5e0 100644
--- a/doc/image/cameleon-animation.svg
+++ b/doc/image/cameleon-animation.svg
@@ -42,17 +42,17 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
- inkscape:cx="255.14977"
- inkscape:cy="320.19239"
+ inkscape:cx="332.67012"
+ inkscape:cy="158.56798"
inkscape:document-units="in"
inkscape:current-layer="layer3"
showgrid="false"
inkscape:window-width="1680"
- inkscape:window-height="1013"
- inkscape:window-x="1680"
- inkscape:window-y="0"
+ inkscape:window-height="986"
+ inkscape:window-x="0"
+ inkscape:window-y="27"
inkscape:window-maximized="1"
- inkscape:snap-global="false"
+ inkscape:snap-global="true"
objecttolerance="10000"
inkscape:snap-bbox="true"
inkscape:snap-page="true"
@@ -96,30 +96,22 @@
style="opacity:0.6;display:inline">
<g
id="g3004"
- style="fill:#859900;fill-opacity:1">
+ style="fill:#859900;fill-opacity:1;visibility:hidden">
<path
inkscape:connector-curvature="0"
id="rect2985"
d="m 163.19291,-0.46191177 0,144.00001177 -144.000009,0 0,-90.000019 90.000009,0 0,36 -17.999999,0 0,18.000019 36.000009,0 0,-72.000019 -126.0000262,0 0,126.000009 180.0000162,0 0,-162.00000177 z"
style="fill:#859900;fill-opacity:1;stroke:none">
<animateTransform
- begin="0;r1.end"
+ begin="playing.begin"
id="r950"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
+ dur="0.083008s"
from="3.13336 0 162"
to="3.13336 0 162" />
<animateTransform
begin="r950.end"
- id="r949"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="3.13336 0 162"
- to="3.13336 0 162" />
- <animateTransform
- begin="r949.end"
id="r948"
attributeName="transform"
type="rotate"
@@ -131,75 +123,11 @@
id="r947"
attributeName="transform"
type="rotate"
- dur="0.0622559s"
+ dur="0.72632s"
from="-0.537148 0 162"
to="-0.537148 0 162" />
<animateTransform
begin="r947.end"
- id="r946"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r946.end"
- id="r945"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r945.end"
- id="r944"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r944.end"
- id="r943"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r943.end"
- id="r942"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r942.end"
- id="r941"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r941.end"
- id="r940"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r940.end"
- id="r939"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r939.end"
id="r938"
attributeName="transform"
type="rotate"
@@ -227,19 +155,11 @@
id="r935"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.020752s"
from="-16.1368 0 162"
to="-16.1368 0 162" />
<animateTransform
begin="r935.end"
- id="r934"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r934.end"
id="r933"
attributeName="transform"
type="rotate"
@@ -267,19 +187,11 @@
id="r930"
attributeName="transform"
type="rotate"
- dur="0.00518799s"
+ dur="0.010376s"
from="-19.3485 0 162"
to="-19.3485 0 162" />
<animateTransform
begin="r930.end"
- id="r929"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-19.3485 0 162"
- to="-19.3485 0 162" />
- <animateTransform
- begin="r929.end"
id="r928"
attributeName="transform"
type="rotate"
@@ -291,59 +203,11 @@
id="r927"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
+ dur="0.070038s"
from="-19.8073 0 162"
to="-19.8073 0 162" />
<animateTransform
begin="r927.end"
- id="r926"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r926.end"
- id="r925"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r925.end"
- id="r924"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r924.end"
- id="r923"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r923.end"
- id="r922"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r922.end"
- id="r921"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-19.8073 0 162"
- to="-19.8073 0 162" />
- <animateTransform
- begin="r921.end"
id="r920"
attributeName="transform"
type="rotate"
@@ -387,59 +251,11 @@
id="r915"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.072632s"
from="-23.4778 0 162"
to="-23.4778 0 162" />
<animateTransform
begin="r915.end"
- id="r914"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r914.end"
- id="r913"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r913.end"
- id="r912"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r912.end"
- id="r911"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r911.end"
- id="r910"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r910.end"
- id="r909"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r909.end"
id="r908"
attributeName="transform"
type="rotate"
@@ -451,19 +267,11 @@
id="r907"
attributeName="transform"
type="rotate"
- dur="0.015564s"
+ dur="0.036316s"
from="-24.3955 0 162"
to="-24.3955 0 162" />
<animateTransform
begin="r907.end"
- id="r906"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r906.end"
id="r905"
attributeName="transform"
type="rotate"
@@ -523,43 +331,11 @@
id="r898"
attributeName="transform"
type="rotate"
- dur="0.00518799s"
+ dur="0.025940s"
from="-30.36 0 162"
to="-30.36 0 162" />
<animateTransform
begin="r898.end"
- id="r897"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-30.36 0 162"
- to="-30.36 0 162" />
- <animateTransform
- begin="r897.end"
- id="r896"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-30.36 0 162"
- to="-30.36 0 162" />
- <animateTransform
- begin="r896.end"
- id="r895"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-30.36 0 162"
- to="-30.36 0 162" />
- <animateTransform
- begin="r895.end"
- id="r894"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-30.36 0 162"
- to="-30.36 0 162" />
- <animateTransform
- begin="r894.end"
id="r893"
attributeName="transform"
type="rotate"
@@ -571,59 +347,11 @@
id="r892"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.072632s"
from="-30.8189 0 162"
to="-30.8189 0 162" />
<animateTransform
begin="r892.end"
- id="r891"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r891.end"
- id="r890"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r890.end"
- id="r889"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r889.end"
- id="r888"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r888.end"
- id="r887"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r887.end"
- id="r886"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-30.8189 0 162"
- to="-30.8189 0 162" />
- <animateTransform
- begin="r886.end"
id="r885"
attributeName="transform"
type="rotate"
@@ -651,59 +379,11 @@
id="r882"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
+ dur="0.070038s"
from="-34.4894 0 162"
to="-34.4894 0 162" />
<animateTransform
begin="r882.end"
- id="r881"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r881.end"
- id="r880"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r880.end"
- id="r879"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r879.end"
- id="r878"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r878.end"
- id="r877"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r877.end"
- id="r876"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-34.4894 0 162"
- to="-34.4894 0 162" />
- <animateTransform
- begin="r876.end"
id="r875"
attributeName="transform"
type="rotate"
@@ -731,57 +411,25 @@
id="r872"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.051880s"
from="-38.1599 0 162"
to="-38.1599 0 162" />
<animateTransform
begin="r872.end"
- id="r871"
+ id="r867"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.0484493s"
from="-38.1599 0 162"
- to="-38.1599 0 162" />
+ to="-39.0775 0 162" />
<animateTransform
- begin="r871.end"
- id="r870"
+ begin="r867.end"
+ id="r866"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-38.1599 0 162"
- to="-38.1599 0 162" />
- <animateTransform
- begin="r870.end"
- id="r869"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-38.1599 0 162"
- to="-38.1599 0 162" />
- <animateTransform
- begin="r869.end"
- id="r868"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-38.1599 0 162"
- to="-38.1599 0 162" />
- <animateTransform
- begin="r868.end"
- id="r867"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-38.1599 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r867.end"
- id="r866"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.020752s"
+ from="-39.0775 0 162"
+ to="-39.0775 0 162" />
<animateTransform
begin="r866.end"
id="r865"
@@ -819,19 +467,11 @@
id="r861"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.020752s"
from="-43.6657 0 162"
to="-43.6657 0 162" />
<animateTransform
begin="r861.end"
- id="r860"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-43.6657 0 162"
- to="-43.6657 0 162" />
- <animateTransform
- begin="r860.end"
id="r859"
attributeName="transform"
type="rotate"
@@ -843,19 +483,11 @@
id="r858"
attributeName="transform"
type="rotate"
- dur="0.00518799s"
+ dur="0.010376s"
from="-45.0421 0 162"
to="-45.0421 0 162" />
<animateTransform
begin="r858.end"
- id="r857"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-45.0421 0 162"
- to="-45.0421 0 162" />
- <animateTransform
- begin="r857.end"
id="r856"
attributeName="transform"
type="rotate"
@@ -867,27 +499,11 @@
id="r855"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
+ dur="0.028534s"
from="-45.5009 0 162"
to="-45.5009 0 162" />
<animateTransform
begin="r855.end"
- id="r854"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r854.end"
- id="r853"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r853.end"
id="r852"
attributeName="transform"
type="rotate"
@@ -955,59 +571,11 @@
id="r844"
attributeName="transform"
type="rotate"
- dur="0.010376s"
+ dur="0.072632s"
from="-51.0067 0 162"
to="-51.0067 0 162" />
<animateTransform
begin="r844.end"
- id="r843"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r843.end"
- id="r842"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r842.end"
- id="r841"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r841.end"
- id="r840"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r840.end"
- id="r839"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r839.end"
- id="r838"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-51.0067 0 162"
- to="-51.0067 0 162" />
- <animateTransform
- begin="r838.end"
id="r837"
attributeName="transform"
type="rotate"
@@ -1019,67 +587,11 @@
id="r836"
attributeName="transform"
type="rotate"
- dur="0.020752s"
+ dur="0.16602s"
from="-50.089 0 162"
to="-50.089 0 162" />
<animateTransform
begin="r836.end"
- id="r835"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r835.end"
- id="r834"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r834.end"
- id="r833"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r833.end"
- id="r832"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r832.end"
- id="r831"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r831.end"
- id="r830"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r830.end"
- id="r829"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-50.089 0 162"
- to="-50.089 0 162" />
- <animateTransform
- begin="r829.end"
id="r828"
attributeName="transform"
type="rotate"
@@ -1091,27 +603,11 @@
id="r827"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
+ dur="0.11414s"
from="-48.2538 0 162"
to="-48.2538 0 162" />
<animateTransform
begin="r827.end"
- id="r826"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-48.2538 0 162"
- to="-48.2538 0 162" />
- <animateTransform
- begin="r826.end"
- id="r825"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-48.2538 0 162"
- to="-48.2538 0 162" />
- <animateTransform
- begin="r825.end"
id="r824"
attributeName="transform"
type="rotate"
@@ -1147,83 +643,11 @@
id="r820"
attributeName="transform"
type="rotate"
- dur="0.020752s"
+ dur="0.20752s"
from="-42.748 0 162"
to="-42.748 0 162" />
<animateTransform
begin="r820.end"
- id="r819"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r819.end"
- id="r818"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r818.end"
- id="r817"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r817.end"
- id="r816"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r816.end"
- id="r815"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r815.end"
- id="r814"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r814.end"
- id="r813"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r813.end"
- id="r812"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r812.end"
- id="r811"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-42.748 0 162"
- to="-42.748 0 162" />
- <animateTransform
- begin="r811.end"
id="r810"
attributeName="transform"
type="rotate"
@@ -1235,43 +659,11 @@
id="r809"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
+ dur="0.20752s"
from="-40.9128 0 162"
to="-40.9128 0 162" />
<animateTransform
begin="r809.end"
- id="r808"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r808.end"
- id="r807"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r807.end"
- id="r806"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r806.end"
- id="r805"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r805.end"
id="r804"
attributeName="transform"
type="rotate"
@@ -1283,14026 +675,4976 @@
id="r803"
attributeName="transform"
type="rotate"
- dur="0.020752s"
+ dur="0.22827s"
from="-39.0775 0 162"
to="-39.0775 0 162" />
<animateTransform
begin="r803.end"
- id="r802"
+ id="r792"
attributeName="transform"
type="rotate"
- dur="0.020752s"
+ dur="0.184695s"
from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ to="-35.407 0 162" />
<animateTransform
- begin="r802.end"
- id="r801"
+ begin="r792.end"
+ id="r791"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.09408s"
+ from="-35.407 0 162"
+ to="-33.5717 0 162" />
<animateTransform
- begin="r801.end"
- id="r800"
+ begin="r791.end"
+ id="r790"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.32166s"
+ from="-33.5717 0 162"
+ to="-33.5717 0 162" />
<animateTransform
- begin="r800.end"
- id="r799"
+ begin="r790.end"
+ id="r782"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.0968987s"
+ from="-33.5717 0 162"
+ to="-31.7365 0 162" />
<animateTransform
- begin="r799.end"
- id="r798"
+ begin="r782.end"
+ id="r781"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.37354s"
+ from="-31.7365 0 162"
+ to="-31.7365 0 162" />
<animateTransform
- begin="r798.end"
- id="r797"
+ begin="r781.end"
+ id="r763"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.184695s"
+ from="-31.7365 0 162"
+ to="-28.066 0 162" />
<animateTransform
- begin="r797.end"
- id="r796"
+ begin="r763.end"
+ id="r762"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.0968987s"
+ from="-28.066 0 162"
+ to="-26.2307 0 162" />
<animateTransform
- begin="r796.end"
- id="r795"
+ begin="r762.end"
+ id="r761"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.44617s"
+ from="-26.2307 0 162"
+ to="-26.2307 0 162" />
<animateTransform
- begin="r795.end"
- id="r794"
+ begin="r761.end"
+ id="r750"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.09408s"
+ from="-26.2307 0 162"
+ to="-24.3955 0 162" />
<animateTransform
- begin="r794.end"
- id="r793"
+ begin="r750.end"
+ id="r749"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
+ dur="0.31128s"
+ from="-24.3955 0 162"
+ to="-24.3955 0 162" />
<animateTransform
- begin="r793.end"
- id="r792"
+ begin="r749.end"
+ id="r734"
attributeName="transform"
type="rotate"
- dur="0.184695s"
- from="-39.0775 0 162"
- to="-35.407 0 162" />
+ dur="0.0484493s"
+ from="-24.3955 0 162"
+ to="-23.4778 0 162" />
<animateTransform
- begin="r792.end"
- id="r791"
+ begin="r734.end"
+ id="r733"
attributeName="transform"
type="rotate"
- dur="0.09408s"
- from="-35.407 0 162"
- to="-33.5717 0 162" />
+ dur="0.010376s"
+ from="-23.4778 0 162"
+ to="-23.4778 0 162" />
<animateTransform
- begin="r791.end"
- id="r790"
+ begin="r733.end"
+ id="r732"
attributeName="transform"
type="rotate"
- dur="0.0311279s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.138521s"
+ from="-23.4778 0 162"
+ to="-20.725 0 162" />
<animateTransform
- begin="r790.end"
- id="r789"
+ begin="r732.end"
+ id="r731"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.036316s"
+ from="-20.725 0 162"
+ to="-20.725 0 162" />
<animateTransform
- begin="r789.end"
- id="r788"
+ begin="r731.end"
+ id="r729"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.04704s"
+ from="-20.725 0 162"
+ to="-19.8073 0 162" />
<animateTransform
- begin="r788.end"
- id="r787"
+ begin="r729.end"
+ id="r728"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.0923475s"
+ from="-19.8073 0 162"
+ to="-17.9721 0 162" />
<animateTransform
- begin="r787.end"
- id="r786"
+ begin="r728.end"
+ id="r727"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.04704s"
+ from="-17.9721 0 162"
+ to="-17.0544 0 162" />
<animateTransform
- begin="r786.end"
- id="r785"
+ begin="r727.end"
+ id="r726"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.036316s"
+ from="-17.0544 0 162"
+ to="-17.0544 0 162" />
<animateTransform
- begin="r785.end"
- id="r784"
+ begin="r726.end"
+ id="r724"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.0484493s"
+ from="-17.0544 0 162"
+ to="-16.1368 0 162" />
<animateTransform
- begin="r784.end"
- id="r783"
+ begin="r724.end"
+ id="r723"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-33.5717 0 162"
- to="-33.5717 0 162" />
+ dur="0.031128s"
+ from="-16.1368 0 162"
+ to="-16.1368 0 162" />
<animateTransform
- begin="r783.end"
- id="r782"
+ begin="r723.end"
+ id="r720"
attributeName="transform"
type="rotate"
- dur="0.0968987s"
- from="-33.5717 0 162"
- to="-31.7365 0 162" />
+ dur="0.0923475s"
+ from="-16.1368 0 162"
+ to="-14.3016 0 162" />
<animateTransform
- begin="r782.end"
- id="r781"
+ begin="r720.end"
+ id="r719"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.04704s"
+ from="-14.3016 0 162"
+ to="-13.3839 0 162" />
<animateTransform
- begin="r781.end"
- id="r780"
+ begin="r719.end"
+ id="r718"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.036316s"
+ from="-13.3839 0 162"
+ to="-13.3839 0 162" />
<animateTransform
- begin="r780.end"
- id="r779"
+ begin="r718.end"
+ id="r716"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0484493s"
+ from="-13.3839 0 162"
+ to="-12.4663 0 162" />
<animateTransform
- begin="r779.end"
- id="r778"
+ begin="r716.end"
+ id="r715"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.041504s"
+ from="-12.4663 0 162"
+ to="-12.4663 0 162" />
<animateTransform
- begin="r778.end"
- id="r777"
+ begin="r715.end"
+ id="r711"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0923475s"
+ from="-12.4663 0 162"
+ to="-10.6311 0 162" />
<animateTransform
- begin="r777.end"
- id="r776"
+ begin="r711.end"
+ id="r710"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0484493s"
+ from="-10.6311 0 162"
+ to="-9.71343 0 162" />
<animateTransform
- begin="r776.end"
- id="r775"
+ begin="r710.end"
+ id="r709"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.036316s"
+ from="-9.71343 0 162"
+ to="-9.71343 0 162" />
<animateTransform
- begin="r775.end"
- id="r774"
+ begin="r709.end"
+ id="r707"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.04704s"
+ from="-9.71343 0 162"
+ to="-8.7958 0 162" />
<animateTransform
- begin="r774.end"
- id="r773"
+ begin="r707.end"
+ id="r706"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.05188s"
+ from="-8.7958 0 162"
+ to="-8.7958 0 162" />
<animateTransform
- begin="r773.end"
- id="r772"
+ begin="r706.end"
+ id="r701"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0923475s"
+ from="-8.7958 0 162"
+ to="-6.96054 0 162" />
<animateTransform
- begin="r772.end"
- id="r771"
+ begin="r701.end"
+ id="r700"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0484493s"
+ from="-6.96054 0 162"
+ to="-6.04291 0 162" />
<animateTransform
- begin="r771.end"
- id="r770"
+ begin="r700.end"
+ id="r699"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.041504s"
+ from="-6.04291 0 162"
+ to="-6.04291 0 162" />
<animateTransform
- begin="r770.end"
- id="r769"
+ begin="r699.end"
+ id="r697"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0484493s"
+ from="-6.04291 0 162"
+ to="-5.12529 0 162" />
<animateTransform
- begin="r769.end"
- id="r768"
+ begin="r697.end"
+ id="r696"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.05188s"
+ from="-5.12529 0 162"
+ to="-5.12529 0 162" />
<animateTransform
- begin="r768.end"
- id="r767"
+ begin="r696.end"
+ id="r691"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0923475s"
+ from="-5.12529 0 162"
+ to="-3.29003 0 162" />
<animateTransform
- begin="r767.end"
- id="r766"
+ begin="r691.end"
+ id="r690"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.04704s"
+ from="-3.29003 0 162"
+ to="-2.3724 0 162" />
<animateTransform
- begin="r766.end"
- id="r765"
+ begin="r690.end"
+ id="r689"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
- <animateTransform
- begin="r765.end"
- id="r764"
+ dur="0.057068s"
+ from="-2.3724 0 162"
+ to="-2.3724 0 162" />
+ <animateTransform
+ begin="r689.end"
+ id="r686"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-31.7365 0 162"
- to="-31.7365 0 162" />
+ dur="0.0484493s"
+ from="-2.3724 0 162"
+ to="-1.45478 0 162" />
<animateTransform
- begin="r764.end"
- id="r763"
+ begin="r686.end"
+ id="r685"
attributeName="transform"
type="rotate"
- dur="0.184695s"
- from="-31.7365 0 162"
- to="-28.066 0 162" />
+ dur="0.062256s"
+ from="-1.45478 0 162"
+ to="-1.45478 0 162" />
<animateTransform
- begin="r763.end"
- id="r762"
+ begin="r685.end"
+ id="r679"
attributeName="transform"
type="rotate"
- dur="0.0968987s"
- from="-28.066 0 162"
- to="-26.2307 0 162" />
+ dur="0.0923475s"
+ from="-1.45478 0 162"
+ to="0.38048 0 162" />
<animateTransform
- begin="r762.end"
- id="r761"
+ begin="r679.end"
+ id="r678"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.0484493s"
+ from="0.38048 0 162"
+ to="1.29811 0 162" />
<animateTransform
- begin="r761.end"
- id="r760"
+ begin="r678.end"
+ id="r677"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.057068s"
+ from="1.29811 0 162"
+ to="1.29811 0 162" />
<animateTransform
- begin="r760.end"
- id="r759"
+ begin="r677.end"
+ id="r674"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.04704s"
+ from="1.29811 0 162"
+ to="2.21574 0 162" />
<animateTransform
- begin="r759.end"
- id="r758"
+ begin="r674.end"
+ id="r673"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.0692607s"
+ from="2.21574 0 162"
+ to="3.59218 0 162" />
<animateTransform
- begin="r758.end"
- id="r757"
+ begin="r673.end"
+ id="r672"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.02352s"
+ from="3.59218 0 162"
+ to="4.05099 0 162" />
<animateTransform
- begin="r757.end"
- id="r756"
+ begin="r672.end"
+ id="r671"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.090790s"
+ from="4.05099 0 162"
+ to="4.05099 0 162" />
<animateTransform
- begin="r756.end"
- id="r755"
+ begin="r671.end"
+ id="r662"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.0484493s"
+ from="4.05099 0 162"
+ to="4.96862 0 162" />
<animateTransform
- begin="r755.end"
- id="r754"
+ begin="r662.end"
+ id="r661"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.036316s"
+ from="4.96862 0 162"
+ to="4.96862 0 162" />
<animateTransform
- begin="r754.end"
- id="r753"
+ begin="r661.end"
+ id="r659"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.04704s"
+ from="4.96862 0 162"
+ to="5.88625 0 162" />
<animateTransform
- begin="r753.end"
- id="r752"
+ begin="r659.end"
+ id="r658"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.020752s"
+ from="5.88625 0 162"
+ to="5.88625 0 162" />
<animateTransform
- begin="r752.end"
- id="r751"
+ begin="r658.end"
+ id="r656"
attributeName="transform"
type="rotate"
- dur="0.0311279s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
+ dur="0.0692607s"
+ from="5.88625 0 162"
+ to="7.26269 0 162" />
<animateTransform
- begin="r751.end"
- id="r750"
+ begin="r656.end"
+ id="r655"
attributeName="transform"
type="rotate"
- dur="0.09408s"
- from="-26.2307 0 162"
- to="-24.3955 0 162" />
+ dur="0.02352s"
+ from="7.26269 0 162"
+ to="7.7215 0 162" />
<animateTransform
- begin="r750.end"
- id="r749"
+ begin="r655.end"
+ id="r654"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.10117s"
+ from="7.7215 0 162"
+ to="7.7215 0 162" />
<animateTransform
- begin="r749.end"
- id="r748"
+ begin="r654.end"
+ id="r644"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.04704s"
+ from="7.7215 0 162"
+ to="8.63913 0 162" />
<animateTransform
- begin="r748.end"
- id="r747"
+ begin="r644.end"
+ id="r643"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.031128s"
+ from="8.63913 0 162"
+ to="8.63913 0 162" />
<animateTransform
- begin="r747.end"
- id="r746"
+ begin="r643.end"
+ id="r641"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.04704s"
+ from="8.63913 0 162"
+ to="9.55676 0 162" />
<animateTransform
- begin="r746.end"
- id="r745"
+ begin="r641.end"
+ id="r640"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.041504s"
+ from="9.55676 0 162"
+ to="9.55676 0 162" />
<animateTransform
- begin="r745.end"
- id="r744"
+ begin="r640.end"
+ id="r636"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.0692607s"
+ from="9.55676 0 162"
+ to="10.9332 0 162" />
<animateTransform
- begin="r744.end"
- id="r743"
+ begin="r636.end"
+ id="r635"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.02352s"
+ from="10.9332 0 162"
+ to="11.392 0 162" />
<animateTransform
- begin="r743.end"
- id="r742"
+ begin="r635.end"
+ id="r634"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.11154s"
+ from="11.392 0 162"
+ to="11.392 0 162" />
<animateTransform
- begin="r742.end"
- id="r741"
+ begin="r634.end"
+ id="r623"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.0484493s"
+ from="11.392 0 162"
+ to="12.3096 0 162" />
<animateTransform
- begin="r741.end"
- id="r740"
+ begin="r623.end"
+ id="r622"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.015564s"
+ from="12.3096 0 162"
+ to="12.3096 0 162" />
<animateTransform
- begin="r740.end"
- id="r739"
+ begin="r622.end"
+ id="r621"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.04704s"
+ from="12.3096 0 162"
+ to="13.2273 0 162" />
<animateTransform
- begin="r739.end"
- id="r738"
+ begin="r621.end"
+ id="r620"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.010376s"
+ from="13.2273 0 162"
+ to="13.2273 0 162" />
<animateTransform
- begin="r738.end"
- id="r737"
+ begin="r620.end"
+ id="r619"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.0692607s"
+ from="13.2273 0 162"
+ to="14.6037 0 162" />
<animateTransform
- begin="r737.end"
- id="r736"
+ begin="r619.end"
+ id="r618"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.0461738s"
+ from="14.6037 0 162"
+ to="15.5213 0 162" />
<animateTransform
- begin="r736.end"
- id="r735"
+ begin="r618.end"
+ id="r617"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
+ dur="0.00518799s"
+ from="15.5213 0 162"
+ to="15.5213 0 162" />
<animateTransform
- begin="r735.end"
- id="r734"
+ begin="r617.end"
+ id="r616"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-24.3955 0 162"
- to="-23.4778 0 162" />
+ dur="0.0692607s"
+ from="15.5213 0 162"
+ to="16.8978 0 162" />
<animateTransform
- begin="r734.end"
- id="r733"
+ begin="r616.end"
+ id="r615"
attributeName="transform"
type="rotate"
dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
+ from="16.8978 0 162"
+ to="16.8978 0 162" />
<animateTransform
- begin="r733.end"
- id="r732"
+ begin="r615.end"
+ id="r614"
attributeName="transform"
type="rotate"
dur="0.138521s"
- from="-23.4778 0 162"
- to="-20.725 0 162" />
+ from="16.8978 0 162"
+ to="19.6507 0 162" />
<animateTransform
- begin="r732.end"
- id="r731"
+ begin="r614.end"
+ id="r613"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-20.725 0 162"
- to="-20.725 0 162" />
+ dur="0.062256s"
+ from="19.6507 0 162"
+ to="19.6507 0 162" />
<animateTransform
- begin="r731.end"
- id="r730"
+ begin="r613.end"
+ id="r610"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="-20.725 0 162"
- to="-20.725 0 162" />
+ dur="0.461738s"
+ from="19.6507 0 162"
+ to="28.8269 0 162" />
<animateTransform
- begin="r730.end"
- id="r729"
+ begin="r610.end"
+ id="r609"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="-20.725 0 162"
- to="-19.8073 0 162" />
+ dur="0.0622559s"
+ from="28.8269 0 162"
+ to="28.8269 0 162" />
<animateTransform
- begin="r729.end"
- id="r728"
+ begin="r609.end"
+ id="r608"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-19.8073 0 162"
- to="-17.9721 0 162" />
+ dur="0.18816s"
+ from="28.8269 0 162"
+ to="32.4974 0 162" />
<animateTransform
- begin="r728.end"
- id="r727"
+ begin="r608.end"
+ id="r607"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="-17.9721 0 162"
- to="-17.0544 0 162" />
+ dur="0.554085s"
+ from="32.4974 0 162"
+ to="43.509 0 162" />
<animateTransform
- begin="r727.end"
- id="r726"
+ begin="r607.end"
+ id="r606"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
+ dur="0.66406s"
+ from="43.509 0 162"
+ to="43.509 0 162" />
<animateTransform
- begin="r726.end"
- id="r725"
+ begin="r606.end"
+ id="r598"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
+ dur="0.193797s"
+ from="43.509 0 162"
+ to="47.1795 0 162" />
<animateTransform
- begin="r725.end"
- id="r724"
+ begin="r598.end"
+ id="r597"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-17.0544 0 162"
- to="-16.1368 0 162" />
+ dur="0.44617s"
+ from="47.1795 0 162"
+ to="47.1795 0 162" />
<animateTransform
- begin="r724.end"
- id="r723"
+ begin="r597.end"
+ id="r586"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
+ dur="0.09408s"
+ from="47.1795 0 162"
+ to="49.0147 0 162" />
<animateTransform
- begin="r723.end"
- id="r722"
+ begin="r586.end"
+ id="r585"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
+ dur="0.14526s"
+ from="49.0147 0 162"
+ to="49.0147 0 162" />
<animateTransform
- begin="r722.end"
- id="r721"
+ begin="r585.end"
+ id="r578"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
+ dur="0.0484493s"
+ from="49.0147 0 162"
+ to="49.9324 0 162" />
<animateTransform
- begin="r721.end"
- id="r720"
+ begin="r578.end"
+ id="r577"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-16.1368 0 162"
- to="-14.3016 0 162" />
+ dur="0.020752s"
+ from="49.9324 0 162"
+ to="49.9324 0 162" />
<animateTransform
- begin="r720.end"
- id="r719"
+ begin="r577.end"
+ id="r575"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="-14.3016 0 162"
- to="-13.3839 0 162" />
+ dur="0.0923475s"
+ from="49.9324 0 162"
+ to="51.7676 0 162" />
<animateTransform
- begin="r719.end"
- id="r718"
+ begin="r575.end"
+ id="r574"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="-13.3839 0 162"
- to="-13.3839 0 162" />
+ dur="0.0923475s"
+ from="51.7676 0 162"
+ to="53.6029 0 162" />
<animateTransform
- begin="r718.end"
- id="r717"
+ begin="r574.end"
+ id="r573"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-13.3839 0 162"
- to="-13.3839 0 162" />
+ dur="0.0242247s"
+ from="53.6029 0 162"
+ to="54.0617 0 162" />
<animateTransform
- begin="r717.end"
- id="r716"
+ begin="r573.end"
+ id="r572"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-13.3839 0 162"
- to="-12.4663 0 162" />
+ dur="0.00518799s"
+ from="54.0617 0 162"
+ to="54.0617 0 162" />
<animateTransform
- begin="r716.end"
- id="r715"
+ begin="r572.end"
+ id="r571"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
+ dur="0.115434s"
+ from="54.0617 0 162"
+ to="56.3558 0 162" />
<animateTransform
- begin="r715.end"
- id="r714"
+ begin="r571.end"
+ id="r570"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
+ dur="0.22827s"
+ from="56.3558 0 162"
+ to="56.3558 0 162" />
<animateTransform
- begin="r714.end"
- id="r713"
+ begin="r570.end"
+ id="r559"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
+ dur="0.0968987s"
+ from="56.3558 0 162"
+ to="58.191 0 162" />
<animateTransform
- begin="r713.end"
- id="r712"
+ begin="r559.end"
+ id="r558"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
+ dur="0.372293s"
+ from="58.191 0 162"
+ to="65.532 0 162" />
<animateTransform
- begin="r712.end"
- id="r711"
+ begin="r558.end"
+ id="r557"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-12.4663 0 162"
- to="-10.6311 0 162" />
+ dur="2.4072s"
+ from="65.532 0 162"
+ to="65.532 0 162" />
<animateTransform
- begin="r711.end"
- id="r710"
+ begin="r557.end"
+ id="r542"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-10.6311 0 162"
- to="-9.71343 0 162" />
+ dur="0.37632s"
+ from="65.532 0 162"
+ to="58.191 0 162" />
<animateTransform
- begin="r710.end"
- id="r709"
+ begin="r542.end"
+ id="r541"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
+ dur="0.74707s"
+ from="58.191 0 162"
+ to="58.191 0 162" />
<animateTransform
- begin="r709.end"
- id="r708"
+ begin="r541.end"
+ id="r532"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
+ dur="0.193797s"
+ from="58.191 0 162"
+ to="61.8615 0 162" />
<animateTransform
- begin="r708.end"
- id="r707"
+ begin="r532.end"
+ id="r531"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="-9.71343 0 162"
- to="-8.7958 0 162" />
+ dur="0.87158s"
+ from="61.8615 0 162"
+ to="61.8615 0 162" />
<animateTransform
- begin="r707.end"
- id="r706"
+ begin="r531.end"
+ id="r510"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
+ dur="0.210826s"
+ from="61.8615 0 162"
+ to="65.532 0 162" />
<animateTransform
- begin="r706.end"
- id="r705"
+ begin="r510.end"
+ id="r509"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
+ dur="1.9922s"
+ from="65.532 0 162"
+ to="65.532 0 162" />
<animateTransform
- begin="r705.end"
- id="r704"
+ begin="r509.end"
+ id="r497"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
+ dur="0.75264s"
+ from="65.532 0 162"
+ to="50.85 0 162" />
<animateTransform
- begin="r704.end"
- id="r703"
+ begin="r497.end"
+ id="r496"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
+ dur="0.249023s"
+ from="50.85 0 162"
+ to="50.85 0 162" />
<animateTransform
- begin="r703.end"
- id="r702"
+ begin="r496.end"
+ id="r495"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
+ dur="1.66226s"
+ from="50.85 0 162"
+ to="17.8154 0 162" />
<animateTransform
- begin="r702.end"
- id="r701"
+ begin="r495.end"
+ id="r494"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-8.7958 0 162"
- to="-6.96054 0 162" />
+ dur="0.083008s"
+ from="17.8154 0 162"
+ to="17.8154 0 162" />
<animateTransform
- begin="r701.end"
- id="r700"
+ begin="r494.end"
+ id="r492"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-6.96054 0 162"
- to="-6.04291 0 162" />
+ dur="0.18816s"
+ from="17.8154 0 162"
+ to="14.1449 0 162" />
<animateTransform
- begin="r700.end"
- id="r699"
+ begin="r492.end"
+ id="r491"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-6.04291 0 162"
- to="-6.04291 0 162" />
+ dur="0.64331s"
+ from="14.1449 0 162"
+ to="14.1449 0 162" />
<animateTransform
- begin="r699.end"
- id="r698"
+ begin="r491.end"
+ id="r483"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-6.04291 0 162"
- to="-6.04291 0 162" />
+ dur="0.387595s"
+ from="14.1449 0 162"
+ to="6.80387 0 162" />
<animateTransform
- begin="r698.end"
- id="r697"
+ begin="r483.end"
+ id="r482"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-6.04291 0 162"
- to="-5.12529 0 162" />
+ dur="1.3281s"
+ from="6.80387 0 162"
+ to="6.80387 0 162" />
<animateTransform
- begin="r697.end"
- id="r696"
+ begin="r482.end"
+ id="r474"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-5.12529 0 162"
- to="-5.12529 0 162" />
+ dur="0.775189s"
+ from="6.80387 0 162"
+ to="-7.87817 0 162" />
<animateTransform
- begin="r696.end"
- id="r695"
+ begin="r474.end"
+ id="r473"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-5.12529 0 162"
- to="-5.12529 0 162" />
+ dur="1.56991s"
+ from="-7.87817 0 162"
+ to="-39.0775 0 162" />
<animateTransform
- begin="r695.end"
- id="r694"
+ begin="r473.end"
+ id="r472"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-5.12529 0 162"
- to="-5.12529 0 162" />
+ dur="0.18677s"
+ from="-39.0775 0 162"
+ to="-39.0775 0 162" />
<animateTransform
- begin="r694.end"
- id="r693"
+ begin="r472.end"
+ id="r463"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-5.12529 0 162"
- to="-5.12529 0 162" />
+ dur="0.0968987s"
+ from="-39.0775 0 162"
+ to="-40.9128 0 162" />
<animateTransform
- begin="r693.end"
- id="r692"
+ begin="r463.end"
+ id="r462"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-5.12529 0 162"
- to="-5.12529 0 162" />
+ dur="0.207782s"
+ from="-40.9128 0 162"
+ to="-45.0421 0 162" />
<animateTransform
- begin="r692.end"
- id="r691"
+ begin="r462.end"
+ id="r461"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-5.12529 0 162"
- to="-3.29003 0 162" />
+ dur="0.010376s"
+ from="-45.0421 0 162"
+ to="-45.0421 0 162" />
<animateTransform
- begin="r691.end"
- id="r690"
+ begin="r461.end"
+ id="r459"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="-3.29003 0 162"
- to="-2.3724 0 162" />
+ dur="0.02352s"
+ from="-45.0421 0 162"
+ to="-45.5009 0 162" />
<animateTransform
- begin="r690.end"
- id="r689"
+ begin="r459.end"
+ id="r458"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="-2.3724 0 162"
- to="-2.3724 0 162" />
+ dur="0.080414s"
+ from="-45.5009 0 162"
+ to="-45.5009 0 162" />
<animateTransform
- begin="r689.end"
- id="r688"
+ begin="r458.end"
+ id="r450"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-2.3724 0 162"
- to="-2.3724 0 162" />
+ dur="0.0484493s"
+ from="-45.5009 0 162"
+ to="-46.4185 0 162" />
<animateTransform
- begin="r688.end"
- id="r687"
+ begin="r450.end"
+ id="r449"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="-2.3724 0 162"
- to="-2.3724 0 162" />
+ dur="0.16602s"
+ from="-46.4185 0 162"
+ to="-46.4185 0 162" />
<animateTransform
- begin="r687.end"
- id="r686"
+ begin="r449.end"
+ id="r441"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="-2.3724 0 162"
- to="-1.45478 0 162" />
+ dur="0.0968987s"
+ from="-46.4185 0 162"
+ to="-48.2538 0 162" />
<animateTransform
- begin="r686.end"
- id="r685"
+ begin="r441.end"
+ id="r440"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.36939s"
+ from="-48.2538 0 162"
+ to="-55.5948 0 162" />
<animateTransform
- begin="r685.end"
- id="r684"
+ begin="r440.end"
+ id="r439"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.277043s"
+ from="-55.5948 0 162"
+ to="-61.1006 0 162" />
<animateTransform
- begin="r684.end"
- id="r683"
+ begin="r439.end"
+ id="r438"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.020752s"
+ from="-61.1006 0 162"
+ to="-61.1006 0 162" />
<animateTransform
- begin="r683.end"
- id="r682"
+ begin="r438.end"
+ id="r437"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.0968987s"
+ from="-61.1006 0 162"
+ to="-62.9358 0 162" />
<animateTransform
- begin="r682.end"
- id="r681"
+ begin="r437.end"
+ id="r436"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.083008s"
+ from="-62.9358 0 162"
+ to="-62.9358 0 162" />
<animateTransform
- begin="r681.end"
- id="r680"
+ begin="r436.end"
+ id="r434"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="-1.45478 0 162"
- to="-1.45478 0 162" />
+ dur="0.277043s"
+ from="-62.9358 0 162"
+ to="-68.4416 0 162" />
<animateTransform
- begin="r680.end"
- id="r679"
+ begin="r434.end"
+ id="r433"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="-1.45478 0 162"
- to="0.38048 0 162" />
+ dur="0.09408s"
+ from="-68.4416 0 162"
+ to="-70.2769 0 162" />
<animateTransform
- begin="r679.end"
- id="r678"
+ begin="r433.end"
+ id="r432"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="0.38048 0 162"
- to="1.29811 0 162" />
+ dur="0.11414s"
+ from="-70.2769 0 162"
+ to="-70.2769 0 162" />
<animateTransform
- begin="r678.end"
- id="r677"
+ begin="r432.end"
+ id="r429"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="1.29811 0 162"
- to="1.29811 0 162" />
+ dur="0.277043s"
+ from="-70.2769 0 162"
+ to="-75.7826 0 162" />
<animateTransform
- begin="r677.end"
- id="r676"
+ begin="r429.end"
+ id="r428"
attributeName="transform"
type="rotate"
dur="0.020752s"
- from="1.29811 0 162"
- to="1.29811 0 162" />
+ from="-75.7826 0 162"
+ to="-75.7826 0 162" />
<animateTransform
- begin="r676.end"
- id="r675"
+ begin="r428.end"
+ id="r427"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="1.29811 0 162"
- to="1.29811 0 162" />
+ dur="0.0968987s"
+ from="-75.7826 0 162"
+ to="-77.6179 0 162" />
<animateTransform
- begin="r675.end"
- id="r674"
+ begin="r427.end"
+ id="r426"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="1.29811 0 162"
- to="2.21574 0 162" />
+ dur="0.230869s"
+ from="-77.6179 0 162"
+ to="-82.206 0 162" />
<animateTransform
- begin="r674.end"
- id="r673"
+ begin="r426.end"
+ id="r425"
attributeName="transform"
type="rotate"
- dur="0.0692607s"
- from="2.21574 0 162"
- to="3.59218 0 162" />
+ dur="0.010376s"
+ from="-82.206 0 162"
+ to="-82.206 0 162" />
<animateTransform
- begin="r673.end"
- id="r672"
+ begin="r425.end"
+ id="r424"
attributeName="transform"
type="rotate"
- dur="0.02352s"
- from="3.59218 0 162"
- to="4.05099 0 162" />
+ dur="0.0484493s"
+ from="-82.206 0 162"
+ to="-83.1236 0 162" />
<animateTransform
- begin="r672.end"
- id="r671"
+ begin="r424.end"
+ id="r423"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.14526s"
+ from="-83.1236 0 162"
+ to="-83.1236 0 162" />
<animateTransform
- begin="r671.end"
- id="r670"
+ begin="r423.end"
+ id="r416"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.09408s"
+ from="-83.1236 0 162"
+ to="-84.9589 0 162" />
<animateTransform
- begin="r670.end"
- id="r669"
+ begin="r416.end"
+ id="r415"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.28015s"
+ from="-84.9589 0 162"
+ to="-84.9589 0 162" />
<animateTransform
- begin="r669.end"
- id="r668"
+ begin="r415.end"
+ id="r408"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.18816s"
+ from="-84.9589 0 162"
+ to="-88.6294 0 162" />
<animateTransform
- begin="r668.end"
- id="r667"
+ begin="r408.end"
+ id="r407"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.0622559s"
+ from="-88.6294 0 162"
+ to="-88.6294 0 162" />
<animateTransform
- begin="r667.end"
- id="r666"
+ begin="r407.end"
+ id="r406"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.415564s"
+ from="-88.6294 0 162"
+ to="-96.8881 0 162" />
<animateTransform
- begin="r666.end"
- id="r665"
+ begin="r406.end"
+ id="r405"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.041504s"
+ from="-96.8881 0 162"
+ to="-96.8881 0 162" />
<animateTransform
- begin="r665.end"
- id="r664"
+ begin="r405.end"
+ id="r401"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.04704s"
+ from="-96.8881 0 162"
+ to="-97.8057 0 162" />
<animateTransform
- begin="r664.end"
- id="r663"
+ begin="r401.end"
+ id="r400"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="4.05099 0 162"
- to="4.05099 0 162" />
+ dur="0.20233s"
+ from="-97.8057 0 162"
+ to="-97.8057 0 162" />
<animateTransform
- begin="r663.end"
- id="r662"
+ begin="r400.end"
+ id="r390"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="4.05099 0 162"
- to="4.96862 0 162" />
+ dur="0.09408s"
+ from="-97.8057 0 162"
+ to="-99.6409 0 162" />
<animateTransform
- begin="r662.end"
- id="r661"
+ begin="r390.end"
+ id="r389"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="4.96862 0 162"
- to="4.96862 0 162" />
+ dur="0.0311279s"
+ from="-99.6409 0 162"
+ to="-99.6409 0 162" />
<animateTransform
- begin="r661.end"
- id="r660"
+ begin="r389.end"
+ id="r388"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="4.96862 0 162"
- to="4.96862 0 162" />
+ dur="0.207782s"
+ from="-99.6409 0 162"
+ to="-103.77 0 162" />
<animateTransform
- begin="r660.end"
- id="r659"
+ begin="r388.end"
+ id="r387"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="4.96862 0 162"
- to="5.88625 0 162" />
+ dur="0.036316s"
+ from="-103.77 0 162"
+ to="-103.77 0 162" />
<animateTransform
- begin="r659.end"
- id="r658"
+ begin="r387.end"
+ id="r380"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="5.88625 0 162"
- to="5.88625 0 162" />
+ dur="0.0242247s"
+ from="-103.77 0 162"
+ to="-104.229 0 162" />
<animateTransform
- begin="r658.end"
- id="r657"
+ begin="r380.end"
+ id="r379"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="5.88625 0 162"
- to="5.88625 0 162" />
+ dur="0.0923475s"
+ from="-104.229 0 162"
+ to="-106.064 0 162" />
<animateTransform
- begin="r657.end"
- id="r656"
+ begin="r379.end"
+ id="r378"
attributeName="transform"
type="rotate"
- dur="0.0692607s"
- from="5.88625 0 162"
- to="7.26269 0 162" />
+ dur="0.049286s"
+ from="-106.064 0 162"
+ to="-106.064 0 162" />
<animateTransform
- begin="r656.end"
- id="r655"
+ begin="r378.end"
+ id="r373"
attributeName="transform"
type="rotate"
dur="0.02352s"
- from="7.26269 0 162"
- to="7.7215 0 162" />
+ from="-106.064 0 162"
+ to="-106.523 0 162" />
<animateTransform
- begin="r655.end"
- id="r654"
+ begin="r373.end"
+ id="r372"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.115434s"
+ from="-106.523 0 162"
+ to="-108.817 0 162" />
<animateTransform
- begin="r654.end"
- id="r653"
+ begin="r372.end"
+ id="r371"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.24384s"
+ from="-108.817 0 162"
+ to="-108.817 0 162" />
<animateTransform
- begin="r653.end"
- id="r652"
+ begin="r371.end"
+ id="r359"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.04704s"
+ from="-108.817 0 162"
+ to="-109.735 0 162" />
<animateTransform
- begin="r652.end"
- id="r651"
+ begin="r359.end"
+ id="r358"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.138521s"
+ from="-109.735 0 162"
+ to="-112.488 0 162" />
<animateTransform
- begin="r651.end"
- id="r650"
+ begin="r358.end"
+ id="r357"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.10376s"
+ from="-112.488 0 162"
+ to="-112.488 0 162" />
<animateTransform
- begin="r650.end"
- id="r649"
+ begin="r357.end"
+ id="r352"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.0968987s"
+ from="-112.488 0 162"
+ to="-114.323 0 162" />
<animateTransform
- begin="r649.end"
- id="r648"
+ begin="r352.end"
+ id="r351"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.12451s"
+ from="-114.323 0 162"
+ to="-114.323 0 162" />
<animateTransform
- begin="r648.end"
- id="r647"
+ begin="r351.end"
+ id="r348"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.0968987s"
+ from="-114.323 0 162"
+ to="-116.158 0 162" />
<animateTransform
- begin="r647.end"
- id="r646"
+ begin="r348.end"
+ id="r347"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.041504s"
+ from="-116.158 0 162"
+ to="-116.158 0 162" />
<animateTransform
- begin="r646.end"
- id="r645"
+ begin="r347.end"
+ id="r345"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="7.7215 0 162"
- to="7.7215 0 162" />
+ dur="0.138521s"
+ from="-116.158 0 162"
+ to="-118.911 0 162" />
<animateTransform
- begin="r645.end"
- id="r644"
+ begin="r345.end"
+ id="r344"
attributeName="transform"
type="rotate"
dur="0.04704s"
- from="7.7215 0 162"
- to="8.63913 0 162" />
+ from="-118.911 0 162"
+ to="-119.829 0 162" />
<animateTransform
- begin="r644.end"
- id="r643"
+ begin="r344.end"
+ id="r343"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="8.63913 0 162"
- to="8.63913 0 162" />
+ dur="0.38910s"
+ from="-119.829 0 162"
+ to="-119.829 0 162" />
<animateTransform
- begin="r643.end"
- id="r642"
+ begin="r343.end"
+ id="r324"
attributeName="transform"
type="rotate"
- dur="0.015564s"
- from="8.63913 0 162"
- to="8.63913 0 162" />
+ dur="0.09408s"
+ from="-119.829 0 162"
+ to="-121.664 0 162" />
<animateTransform
- begin="r642.end"
- id="r641"
+ begin="r324.end"
+ id="r323"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="8.63913 0 162"
- to="9.55676 0 162" />
+ dur="0.062256s"
+ from="-121.664 0 162"
+ to="-121.664 0 162" />
<animateTransform
- begin="r641.end"
- id="r640"
+ begin="r323.end"
+ id="r321"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="9.55676 0 162"
- to="9.55676 0 162" />
+ dur="0.09408s"
+ from="-121.664 0 162"
+ to="-123.499 0 162" />
<animateTransform
- begin="r640.end"
- id="r639"
+ begin="r321.end"
+ id="r320"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="9.55676 0 162"
- to="9.55676 0 162" />
+ dur="0.31128s"
+ from="-123.499 0 162"
+ to="-123.499 0 162" />
<animateTransform
- begin="r639.end"
- id="r638"
+ begin="r320.end"
+ id="r305"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="9.55676 0 162"
- to="9.55676 0 162" />
+ dur="0.0484493s"
+ from="-123.499 0 162"
+ to="-124.417 0 162" />
<animateTransform
- begin="r638.end"
- id="r637"
+ begin="r305.end"
+ id="r304"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="9.55676 0 162"
- to="9.55676 0 162" />
+ dur="0.22827s"
+ from="-124.417 0 162"
+ to="-124.417 0 162" />
<animateTransform
- begin="r637.end"
- id="r636"
+ begin="r304.end"
+ id="r282"
attributeName="transform"
type="rotate"
- dur="0.0692607s"
- from="9.55676 0 162"
- to="10.9332 0 162" />
+ dur="0.04704s"
+ from="-124.417 0 162"
+ to="-123.499 0 162" />
<animateTransform
- begin="r636.end"
- id="r635"
+ begin="r282.end"
+ id="r281"
attributeName="transform"
type="rotate"
- dur="0.02352s"
- from="10.9332 0 162"
- to="11.392 0 162" />
+ dur="0.14008s"
+ from="-123.499 0 162"
+ to="-123.499 0 162" />
<animateTransform
- begin="r635.end"
- id="r634"
+ begin="r281.end"
+ id="r274"
attributeName="transform"
type="rotate"
- dur="0.00778198s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.0484493s"
+ from="-123.499 0 162"
+ to="-122.582 0 162" />
<animateTransform
- begin="r634.end"
- id="r633"
+ begin="r274.end"
+ id="r273"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.10376s"
+ from="-122.582 0 162"
+ to="-122.582 0 162" />
<animateTransform
- begin="r633.end"
- id="r632"
+ begin="r273.end"
+ id="r263"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.0923475s"
+ from="-122.582 0 162"
+ to="-120.746 0 162" />
<animateTransform
- begin="r632.end"
- id="r631"
+ begin="r263.end"
+ id="r262"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.0484493s"
+ from="-120.746 0 162"
+ to="-119.829 0 162" />
<animateTransform
- begin="r631.end"
- id="r630"
+ begin="r262.end"
+ id="r261"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.11932s"
+ from="-119.829 0 162"
+ to="-119.829 0 162" />
<animateTransform
- begin="r630.end"
- id="r629"
+ begin="r261.end"
+ id="r255"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.04704s"
+ from="-119.829 0 162"
+ to="-118.911 0 162" />
<animateTransform
- begin="r629.end"
- id="r628"
+ begin="r255.end"
+ id="r254"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.020752s"
+ from="-118.911 0 162"
+ to="-118.911 0 162" />
<animateTransform
- begin="r628.end"
- id="r627"
+ begin="r254.end"
+ id="r252"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.0923475s"
+ from="-118.911 0 162"
+ to="-117.076 0 162" />
<animateTransform
- begin="r627.end"
- id="r626"
+ begin="r252.end"
+ id="r251"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.00778198s"
+ from="-117.076 0 162"
+ to="-117.076 0 162" />
<animateTransform
- begin="r626.end"
- id="r625"
+ begin="r251.end"
+ id="r250"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.02352s"
+ from="-117.076 0 162"
+ to="-116.617 0 162" />
<animateTransform
- begin="r625.end"
- id="r624"
+ begin="r250.end"
+ id="r249"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="11.392 0 162"
- to="11.392 0 162" />
+ dur="0.036316s"
+ from="-116.617 0 162"
+ to="-116.617 0 162" />
<animateTransform
- begin="r624.end"
- id="r623"
+ begin="r249.end"
+ id="r242"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="11.392 0 162"
- to="12.3096 0 162" />
+ dur="0.0461738s"
+ from="-116.617 0 162"
+ to="-115.699 0 162" />
<animateTransform
- begin="r623.end"
- id="r622"
+ begin="r242.end"
+ id="r241"
attributeName="transform"
type="rotate"
dur="0.015564s"
- from="12.3096 0 162"
- to="12.3096 0 162" />
+ from="-115.699 0 162"
+ to="-115.699 0 162" />
<animateTransform
- begin="r622.end"
- id="r621"
+ begin="r241.end"
+ id="r238"
attributeName="transform"
type="rotate"
- dur="0.04704s"
- from="12.3096 0 162"
- to="13.2273 0 162" />
+ dur="0.02352s"
+ from="-115.699 0 162"
+ to="-115.241 0 162" />
<animateTransform
- begin="r621.end"
- id="r620"
+ begin="r238.end"
+ id="r237"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="13.2273 0 162"
- to="13.2273 0 162" />
+ dur="0.025940s"
+ from="-115.241 0 162"
+ to="-115.241 0 162" />
<animateTransform
- begin="r620.end"
- id="r619"
+ begin="r237.end"
+ id="r234"
attributeName="transform"
type="rotate"
- dur="0.0692607s"
- from="13.2273 0 162"
- to="14.6037 0 162" />
+ dur="0.02352s"
+ from="-115.241 0 162"
+ to="-114.782 0 162" />
<animateTransform
- begin="r619.end"
- id="r618"
+ begin="r234.end"
+ id="r233"
attributeName="transform"
type="rotate"
- dur="0.0461738s"
- from="14.6037 0 162"
- to="15.5213 0 162" />
+ dur="0.07782s"
+ from="-114.782 0 162"
+ to="-114.782 0 162" />
<animateTransform
- begin="r618.end"
- id="r617"
+ begin="r233.end"
+ id="r218"
attributeName="transform"
type="rotate"
- dur="0.00518799s"
- from="15.5213 0 162"
- to="15.5213 0 162" />
+ dur="0.0461738s"
+ from="-114.782 0 162"
+ to="-113.864 0 162" />
<animateTransform
- begin="r617.end"
- id="r616"
+ begin="r218.end"
+ id="r217"
attributeName="transform"
type="rotate"
- dur="0.0692607s"
- from="15.5213 0 162"
- to="16.8978 0 162" />
+ dur="0.0242247s"
+ from="-113.864 0 162"
+ to="-113.405 0 162" />
<animateTransform
- begin="r616.end"
- id="r615"
+ begin="r217.end"
+ id="r216"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="16.8978 0 162"
- to="16.8978 0 162" />
+ dur="0.072632s"
+ from="-113.405 0 162"
+ to="-113.405 0 162" />
<animateTransform
- begin="r615.end"
- id="r614"
+ begin="r216.end"
+ id="r209"
attributeName="transform"
type="rotate"
- dur="0.138521s"
- from="16.8978 0 162"
- to="19.6507 0 162" />
+ dur="0.0242247s"
+ from="-113.405 0 162"
+ to="-112.947 0 162" />
<animateTransform
- begin="r614.end"
- id="r613"
+ begin="r209.end"
+ id="r208"
attributeName="transform"
type="rotate"
dur="0.020752s"
- from="19.6507 0 162"
- to="19.6507 0 162" />
+ from="-112.947 0 162"
+ to="-112.947 0 162" />
<animateTransform
- begin="r613.end"
- id="r612"
+ begin="r208.end"
+ id="r204"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="19.6507 0 162"
- to="19.6507 0 162" />
+ dur="0.0461738s"
+ from="-112.947 0 162"
+ to="-112.029 0 162" />
<animateTransform
- begin="r612.end"
- id="r611"
+ begin="r204.end"
+ id="r203"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="19.6507 0 162"
- to="19.6507 0 162" />
+ dur="0.0242247s"
+ from="-112.029 0 162"
+ to="-111.57 0 162" />
<animateTransform
- begin="r611.end"
- id="r610"
+ begin="r203.end"
+ id="r202"
attributeName="transform"
type="rotate"
- dur="0.461738s"
- from="19.6507 0 162"
- to="28.8269 0 162" />
+ dur="0.12451s"
+ from="-111.57 0 162"
+ to="-111.57 0 162" />
<animateTransform
- begin="r610.end"
- id="r609"
+ begin="r202.end"
+ id="r190"
attributeName="transform"
type="rotate"
- dur="0.0622559s"
- from="28.8269 0 162"
- to="28.8269 0 162" />
+ dur="0.0242247s"
+ from="-111.57 0 162"
+ to="-111.111 0 162" />
<animateTransform
- begin="r609.end"
- id="r608"
+ begin="r190.end"
+ id="r189"
attributeName="transform"
type="rotate"
- dur="0.18816s"
- from="28.8269 0 162"
- to="32.4974 0 162" />
+ dur="0.00518799s"
+ from="-111.111 0 162"
+ to="-111.111 0 162" />
<animateTransform
- begin="r608.end"
- id="r607"
+ begin="r189.end"
+ id="r188"
attributeName="transform"
type="rotate"
- dur="0.554085s"
- from="32.4974 0 162"
- to="43.509 0 162" />
+ dur="0.0692607s"
+ from="-111.111 0 162"
+ to="-109.735 0 162" />
<animateTransform
- begin="r607.end"
- id="r606"
+ begin="r188.end"
+ id="r187"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.062256s"
+ from="-109.735 0 162"
+ to="-109.735 0 162" />
<animateTransform
- begin="r606.end"
- id="r605"
+ begin="r187.end"
+ id="r181"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.04704s"
+ from="-109.735 0 162"
+ to="-108.817 0 162" />
<animateTransform
- begin="r605.end"
- id="r604"
+ begin="r181.end"
+ id="r180"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.057068s"
+ from="-108.817 0 162"
+ to="-108.817 0 162" />
<animateTransform
- begin="r604.end"
- id="r603"
+ begin="r180.end"
+ id="r177"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.0484493s"
+ from="-108.817 0 162"
+ to="-107.9 0 162" />
<animateTransform
- begin="r603.end"
- id="r602"
+ begin="r177.end"
+ id="r176"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.010376s"
+ from="-107.9 0 162"
+ to="-107.9 0 162" />
<animateTransform
- begin="r602.end"
- id="r601"
+ begin="r176.end"
+ id="r175"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.0692607s"
+ from="-107.9 0 162"
+ to="-106.523 0 162" />
<animateTransform
- begin="r601.end"
- id="r600"
+ begin="r175.end"
+ id="r174"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.02352s"
+ from="-106.523 0 162"
+ to="-106.064 0 162" />
<animateTransform
- begin="r600.end"
- id="r599"
+ begin="r174.end"
+ id="r173"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="43.509 0 162"
- to="43.509 0 162" />
+ dur="0.090790s"
+ from="-106.064 0 162"
+ to="-106.064 0 162" />
<animateTransform
- begin="r599.end"
- id="r598"
+ begin="r173.end"
+ id="r164"
attributeName="transform"
type="rotate"
- dur="0.193797s"
- from="43.509 0 162"
- to="47.1795 0 162" />
+ dur="0.0484493s"
+ from="-106.064 0 162"
+ to="-105.147 0 162" />
<animateTransform
- begin="r598.end"
- id="r597"
+ begin="r164.end"
+ id="r163"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.062256s"
+ from="-105.147 0 162"
+ to="-105.147 0 162" />
<animateTransform
- begin="r597.end"
- id="r596"
+ begin="r163.end"
+ id="r160"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.0484493s"
+ from="-105.147 0 162"
+ to="-104.229 0 162" />
<animateTransform
- begin="r596.end"
- id="r595"
+ begin="r160.end"
+ id="r159"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.083008s"
+ from="-104.229 0 162"
+ to="-104.229 0 162" />
<animateTransform
- begin="r595.end"
- id="r594"
+ begin="r159.end"
+ id="r151"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.0923475s"
+ from="-104.229 0 162"
+ to="-102.394 0 162" />
<animateTransform
- begin="r594.end"
- id="r593"
+ begin="r151.end"
+ id="r150"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.0484493s"
+ from="-102.394 0 162"
+ to="-101.476 0 162" />
<animateTransform
- begin="r593.end"
- id="r592"
+ begin="r150.end"
+ id="r149"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.062256s"
+ from="-101.476 0 162"
+ to="-101.476 0 162" />
<animateTransform
- begin="r592.end"
- id="r591"
+ begin="r149.end"
+ id="r146"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.0484493s"
+ from="-101.476 0 162"
+ to="-100.559 0 162" />
<animateTransform
- begin="r591.end"
- id="r590"
+ begin="r146.end"
+ id="r145"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.072632s"
+ from="-100.559 0 162"
+ to="-100.559 0 162" />
<animateTransform
- begin="r590.end"
- id="r589"
+ begin="r145.end"
+ id="r138"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.0923475s"
+ from="-100.559 0 162"
+ to="-98.7233 0 162" />
<animateTransform
- begin="r589.end"
- id="r588"
+ begin="r138.end"
+ id="r137"
attributeName="transform"
type="rotate"
- dur="0.0415039s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.04704s"
+ from="-98.7233 0 162"
+ to="-97.8057 0 162" />
<animateTransform
- begin="r588.end"
- id="r587"
+ begin="r137.end"
+ id="r136"
attributeName="transform"
type="rotate"
- dur="0.0311279s"
- from="47.1795 0 162"
- to="47.1795 0 162" />
+ dur="0.057068s"
+ from="-97.8057 0 162"
+ to="-97.8057 0 162" />
<animateTransform
- begin="r587.end"
- id="r586"
+ begin="r136.end"
+ id="r133"
attributeName="transform"
type="rotate"
- dur="0.09408s"
- from="47.1795 0 162"
- to="49.0147 0 162" />
+ dur="0.0484493s"
+ from="-97.8057 0 162"
+ to="-96.8881 0 162" />
<animateTransform
- begin="r586.end"
- id="r585"
+ begin="r133.end"
+ id="r132"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.072632s"
+ from="-96.8881 0 162"
+ to="-96.8881 0 162" />
<animateTransform
- begin="r585.end"
- id="r584"
+ begin="r132.end"
+ id="r125"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.0923475s"
+ from="-96.8881 0 162"
+ to="-95.0528 0 162" />
<animateTransform
- begin="r584.end"
- id="r583"
+ begin="r125.end"
+ id="r124"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.04704s"
+ from="-95.0528 0 162"
+ to="-94.1352 0 162" />
<animateTransform
- begin="r583.end"
- id="r582"
+ begin="r124.end"
+ id="r123"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.072632s"
+ from="-94.1352 0 162"
+ to="-94.1352 0 162" />
<animateTransform
- begin="r582.end"
- id="r581"
+ begin="r123.end"
+ id="r119"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.04704s"
+ from="-94.1352 0 162"
+ to="-93.2175 0 162" />
<animateTransform
- begin="r581.end"
- id="r580"
+ begin="r119.end"
+ id="r118"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
+ dur="0.062256s"
+ from="-93.2175 0 162"
+ to="-93.2175 0 162" />
<animateTransform
- begin="r580.end"
- id="r579"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="49.0147 0 162"
- to="49.0147 0 162" />
- <animateTransform
- begin="r579.end"
- id="r578"
+ begin="r118.end"
+ id="r112"
attributeName="transform"
type="rotate"
- dur="0.0484493s"
- from="49.0147 0 162"
- to="49.9324 0 162" />
+ dur="0.0923475s"
+ from="-93.2175 0 162"
+ to="-91.3823 0 162" />
<animateTransform
- begin="r578.end"
- id="r577"
+ begin="r112.end"
+ id="r111"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="49.9324 0 162"
- to="49.9324 0 162" />
+ dur="0.04704s"
+ from="-91.3823 0 162"
+ to="-90.4647 0 162" />
<animateTransform
- begin="r577.end"
- id="r576"
+ begin="r111.end"
+ id="r110"
attributeName="transform"
type="rotate"
- dur="0.010376s"
- from="49.9324 0 162"
- to="49.9324 0 162" />
+ dur="0.057068s"
+ from="-90.4647 0 162"
+ to="-90.4647 0 162" />
<animateTransform
- begin="r576.end"
- id="r575"
+ begin="r110.end"
+ id="r107"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="49.9324 0 162"
- to="51.7676 0 162" />
+ dur="0.0484493s"
+ from="-90.4647 0 162"
+ to="-89.547 0 162" />
<animateTransform
- begin="r575.end"
- id="r574"
+ begin="r107.end"
+ id="r106"
attributeName="transform"
type="rotate"
- dur="0.0923475s"
- from="51.7676 0 162"
- to="53.6029 0 162" />
+ dur="0.031128s"
+ from="-89.547 0 162"
+ to="-89.547 0 162" />
<animateTransform
- begin="r574.end"
- id="r573"
+ begin="r106.end"
+ id="r103"
attributeName="transform"
type="rotate"
- dur="0.0242247s"
- from="53.6029 0 162"
- to="54.0617 0 162" />
+ dur="0.230869s"
+ from="-89.547 0 162"
+ to="-84.9589 0 162" />
<animateTransform
- begin="r573.end"
- id="r572"
+ begin="r103.end"
+ id="r102"
attributeName="transform"
type="rotate"
- dur="0.00518799s"
- from="54.0617 0 162"
- to="54.0617 0 162" />
+ dur="0.072632s"
+ from="-84.9589 0 162"
+ to="-84.9589 0 162" />
<animateTransform
- begin="r572.end"
- id="r571"
+ begin="r102.end"
+ id="r100"
attributeName="transform"
type="rotate"
- dur="0.115434s"
- from="54.0617 0 162"
- to="56.3558 0 162" />
+ dur="0.09408s"
+ from="-84.9589 0 162"
+ to="-83.1236 0 162" />
<animateTransform
- begin="r571.end"
- id="r570"
+ begin="r100.end"
+ id="r99"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.461738s"
+ from="-83.1236 0 162"
+ to="-73.9474 0 162" />
<animateTransform
- begin="r570.end"
- id="r569"
+ begin="r99.end"
+ id="r98"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.73878s"
+ from="-73.9474 0 162"
+ to="-59.2653 0 162" />
<animateTransform
- begin="r569.end"
- id="r568"
+ begin="r98.end"
+ id="r97"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.387595s"
+ from="-59.2653 0 162"
+ to="-51.9243 0 162" />
<animateTransform
- begin="r568.end"
- id="r567"
+ begin="r97.end"
+ id="r96"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.166016s"
+ from="-51.9243 0 162"
+ to="-51.9243 0 162" />
<animateTransform
- begin="r567.end"
- id="r566"
+ begin="r96.end"
+ id="r95"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.387595s"
+ from="-51.9243 0 162"
+ to="-44.5833 0 162" />
<animateTransform
- begin="r566.end"
- id="r565"
+ begin="r95.end"
+ id="r94"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.49805s"
+ from="-44.5833 0 162"
+ to="-44.5833 0 162" />
<animateTransform
- begin="r565.end"
- id="r564"
+ begin="r94.end"
+ id="r88"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.193797s"
+ from="-44.5833 0 162"
+ to="-40.9128 0 162" />
<animateTransform
- begin="r564.end"
- id="r563"
+ begin="r88.end"
+ id="r87"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.24902s"
+ from="-40.9128 0 162"
+ to="-40.9128 0 162" />
<animateTransform
- begin="r563.end"
- id="r562"
+ begin="r87.end"
+ id="r81"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.0968987s"
+ from="-40.9128 0 162"
+ to="-39.0775 0 162" />
<animateTransform
- begin="r562.end"
- id="r561"
+ begin="r81.end"
+ id="r80"
attributeName="transform"
type="rotate"
dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ from="-39.0775 0 162"
+ to="-39.0775 0 162" />
<animateTransform
- begin="r561.end"
- id="r560"
+ begin="r80.end"
+ id="r79"
attributeName="transform"
type="rotate"
- dur="0.020752s"
- from="56.3558 0 162"
- to="56.3558 0 162" />
+ dur="0.461738s"
+ from="-39.0775 0 162"
+ to="-29.9012 0 162" />
<animateTransform
- begin="r560.end"
- id="r559"
+ begin="r79.end"
+ id="r78"
attributeName="transform"
type="rotate"
- dur="0.0968987s"
- from="56.3558 0 162"
- to="58.191 0 162" />
+ dur="0.193797s"
+ from="-29.9012 0 162"
+ to="-26.2307 0 162" />
<animateTransform
- begin="r559.end"
- id="r558"
+ begin="r78.end"
+ id="r77"
attributeName="transform"
type="rotate"
- dur="0.372293s"
- from="58.191 0 162"
- to="65.532 0 162" />
+ dur="0.24902s"
+ from="-26.2307 0 162"
+ to="-26.2307 0 162" />
<animateTransform
- begin="r558.end"
- id="r557"
+ begin="r77.end"
+ id="r71"
attributeName="transform"
type="rotate"
- dur="0.124512s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.0968987s"
+ from="-26.2307 0 162"
+ to="-24.3955 0 162" />
<animateTransform
- begin="r557.end"
- id="r556"
+ begin="r71.end"
+ id="r70"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.14526s"
+ from="-24.3955 0 162"
+ to="-24.3955 0 162" />
<animateTransform
- begin="r556.end"
- id="r555"
+ begin="r70.end"
+ id="r63"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.0484493s"
+ from="-24.3955 0 162"
+ to="-23.4778 0 162" />
<animateTransform
- begin="r555.end"
- id="r554"
+ begin="r63.end"
+ id="r62"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.031128s"
+ from="-23.4778 0 162"
+ to="-23.4778 0 162" />
<animateTransform
- begin="r554.end"
- id="r553"
+ begin="r62.end"
+ id="r59"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.230869s"
+ from="-23.4778 0 162"
+ to="-18.8897 0 162" />
<animateTransform
- begin="r553.end"
- id="r552"
+ begin="r59.end"
+ id="r58"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.0968987s"
+ from="-18.8897 0 162"
+ to="-17.0544 0 162" />
<animateTransform
- begin="r552.end"
- id="r551"
+ begin="r58.end"
+ id="r57"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.14008s"
+ from="-17.0544 0 162"
+ to="-17.0544 0 162" />
<animateTransform
- begin="r551.end"
- id="r550"
+ begin="r57.end"
+ id="r50"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.04704s"
+ from="-17.0544 0 162"
+ to="-16.1368 0 162" />
<animateTransform
- begin="r550.end"
- id="r549"
+ begin="r50.end"
+ id="r49"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.072632s"
+ from="-16.1368 0 162"
+ to="-16.1368 0 162" />
<animateTransform
- begin="r549.end"
- id="r548"
+ begin="r49.end"
+ id="r42"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r548.end"
- id="r547"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r547.end"
- id="r546"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r546.end"
- id="r545"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r545.end"
- id="r544"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.0242247s"
+ from="-16.1368 0 162"
+ to="-15.678 0 162" />
<animateTransform
- begin="r544.end"
- id="r543"
+ begin="r42.end"
+ id="r41"
attributeName="transform"
type="rotate"
- dur="0.124512s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ dur="0.025940s"
+ from="-15.678 0 162"
+ to="-15.678 0 162" />
<animateTransform
- begin="r543.end"
- id="r542"
+ begin="r41.end"
+ id="r36"
attributeName="transform"
type="rotate"
- dur="0.37632s"
- from="65.532 0 162"
- to="58.191 0 162" />
+ dur="0.115434s"
+ from="-15.678 0 162"
+ to="-13.3839 0 162" />
<animateTransform
- begin="r542.end"
- id="r541"
+ begin="r36.end"
+ id="r35"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.0484493s"
+ from="-13.3839 0 162"
+ to="-12.4663 0 162" />
<animateTransform
- begin="r541.end"
- id="r540"
+ begin="r35.end"
+ id="r34"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.070038s"
+ from="-12.4663 0 162"
+ to="-12.4663 0 162" />
<animateTransform
- begin="r540.end"
- id="r539"
+ begin="r34.end"
+ id="r27"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.02352s"
+ from="-12.4663 0 162"
+ to="-12.0075 0 162" />
<animateTransform
- begin="r539.end"
- id="r538"
+ begin="r27.end"
+ id="r26"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.115434s"
+ from="-12.0075 0 162"
+ to="-9.71343 0 162" />
<animateTransform
- begin="r538.end"
- id="r537"
+ begin="r26.end"
+ id="r25"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.26459s"
+ from="-9.71343 0 162"
+ to="-9.71343 0 162" />
<animateTransform
- begin="r537.end"
- id="r536"
+ begin="r25.end"
+ id="r12"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.04704s"
+ from="-9.71343 0 162"
+ to="-8.7958 0 162" />
<animateTransform
- begin="r536.end"
- id="r535"
+ begin="r12.end"
+ id="r11"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.041504s"
+ from="-8.7958 0 162"
+ to="-8.7958 0 162" />
<animateTransform
- begin="r535.end"
- id="r534"
+ begin="r11.end"
+ id="r7"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.415564s"
+ from="-8.7958 0 162"
+ to="-0.537148 0 162" />
<animateTransform
- begin="r534.end"
- id="r533"
+ begin="r7.end"
+ id="r6"
attributeName="transform"
type="rotate"
- dur="0.0830078s"
- from="58.191 0 162"
- to="58.191 0 162" />
+ dur="0.24902s"
+ from="-0.537148 0 162"
+ to="-0.537148 0 162" />
<animateTransform
- begin="r533.end"
- id="r532"
+ begin="r6.end"
+ id="r3"
attributeName="transform"
type="rotate"
dur="0.193797s"
- from="58.191 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r532.end"
- id="r531"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r531.end"
- id="r530"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r530.end"
- id="r529"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r529.end"
- id="r528"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r528.end"
- id="r527"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r527.end"
- id="r526"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r526.end"
- id="r525"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r525.end"
- id="r524"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r524.end"
- id="r523"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r523.end"
- id="r522"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r522.end"
- id="r521"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r521.end"
- id="r520"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r520.end"
- id="r519"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r519.end"
- id="r518"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r518.end"
- id="r517"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r517.end"
- id="r516"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r516.end"
- id="r515"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r515.end"
- id="r514"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r514.end"
- id="r513"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r513.end"
- id="r512"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r512.end"
- id="r511"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="61.8615 0 162"
- to="61.8615 0 162" />
- <animateTransform
- begin="r511.end"
- id="r510"
- attributeName="transform"
- type="rotate"
- dur="0.210826s"
- from="61.8615 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r510.end"
- id="r509"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r509.end"
- id="r508"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r508.end"
- id="r507"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
+ from="-0.537148 0 162"
+ to="3.13336 0 162" />
<animateTransform
- begin="r507.end"
- id="r506"
+ begin="r3.end"
+ id="r2"
attributeName="transform"
type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r506.end"
- id="r505"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r505.end"
- id="r504"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r504.end"
- id="r503"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r503.end"
- id="r502"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r502.end"
- id="r501"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r501.end"
- id="r500"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r500.end"
- id="r499"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r499.end"
- id="r498"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="65.532 0 162"
- to="65.532 0 162" />
- <animateTransform
- begin="r498.end"
- id="r497"
- attributeName="transform"
- type="rotate"
- dur="0.75264s"
- from="65.532 0 162"
- to="50.85 0 162" />
- <animateTransform
- begin="r497.end"
- id="r496"
- attributeName="transform"
- type="rotate"
- dur="0.249023s"
- from="50.85 0 162"
- to="50.85 0 162" />
- <animateTransform
- begin="r496.end"
- id="r495"
- attributeName="transform"
- type="rotate"
- dur="1.66226s"
- from="50.85 0 162"
- to="17.8154 0 162" />
- <animateTransform
- begin="r495.end"
- id="r494"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="17.8154 0 162"
- to="17.8154 0 162" />
- <animateTransform
- begin="r494.end"
- id="r493"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="17.8154 0 162"
- to="17.8154 0 162" />
- <animateTransform
- begin="r493.end"
- id="r492"
- attributeName="transform"
- type="rotate"
- dur="0.18816s"
- from="17.8154 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r492.end"
- id="r491"
- attributeName="transform"
- type="rotate"
- dur="0.0622559s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r491.end"
- id="r490"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r490.end"
- id="r489"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r489.end"
- id="r488"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r488.end"
- id="r487"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r487.end"
- id="r486"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r486.end"
- id="r485"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r485.end"
- id="r484"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="14.1449 0 162"
- to="14.1449 0 162" />
- <animateTransform
- begin="r484.end"
- id="r483"
- attributeName="transform"
- type="rotate"
- dur="0.387595s"
- from="14.1449 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r483.end"
- id="r482"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r482.end"
- id="r481"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r481.end"
- id="r480"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r480.end"
- id="r479"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r479.end"
- id="r478"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r478.end"
- id="r477"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r477.end"
- id="r476"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r476.end"
- id="r475"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="6.80387 0 162"
- to="6.80387 0 162" />
- <animateTransform
- begin="r475.end"
- id="r474"
- attributeName="transform"
- type="rotate"
- dur="0.775189s"
- from="6.80387 0 162"
- to="-7.87817 0 162" />
- <animateTransform
- begin="r474.end"
- id="r473"
- attributeName="transform"
- type="rotate"
- dur="1.56991s"
- from="-7.87817 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r473.end"
- id="r472"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r472.end"
- id="r471"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r471.end"
- id="r470"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r470.end"
- id="r469"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r469.end"
- id="r468"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r468.end"
- id="r467"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r467.end"
- id="r466"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r466.end"
- id="r465"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r465.end"
- id="r464"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r464.end"
- id="r463"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-39.0775 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r463.end"
- id="r462"
- attributeName="transform"
- type="rotate"
- dur="0.207782s"
- from="-40.9128 0 162"
- to="-45.0421 0 162" />
- <animateTransform
- begin="r462.end"
- id="r461"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-45.0421 0 162"
- to="-45.0421 0 162" />
- <animateTransform
- begin="r461.end"
- id="r460"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-45.0421 0 162"
- to="-45.0421 0 162" />
- <animateTransform
- begin="r460.end"
- id="r459"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-45.0421 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r459.end"
- id="r458"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r458.end"
- id="r457"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r457.end"
- id="r456"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r456.end"
- id="r455"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r455.end"
- id="r454"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r454.end"
- id="r453"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r453.end"
- id="r452"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r452.end"
- id="r451"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-45.5009 0 162"
- to="-45.5009 0 162" />
- <animateTransform
- begin="r451.end"
- id="r450"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-45.5009 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r450.end"
- id="r449"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r449.end"
- id="r448"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r448.end"
- id="r447"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r447.end"
- id="r446"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r446.end"
- id="r445"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r445.end"
- id="r444"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r444.end"
- id="r443"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r443.end"
- id="r442"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-46.4185 0 162"
- to="-46.4185 0 162" />
- <animateTransform
- begin="r442.end"
- id="r441"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-46.4185 0 162"
- to="-48.2538 0 162" />
- <animateTransform
- begin="r441.end"
- id="r440"
- attributeName="transform"
- type="rotate"
- dur="0.36939s"
- from="-48.2538 0 162"
- to="-55.5948 0 162" />
- <animateTransform
- begin="r440.end"
- id="r439"
- attributeName="transform"
- type="rotate"
- dur="0.277043s"
- from="-55.5948 0 162"
- to="-61.1006 0 162" />
- <animateTransform
- begin="r439.end"
- id="r438"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-61.1006 0 162"
- to="-61.1006 0 162" />
- <animateTransform
- begin="r438.end"
- id="r437"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-61.1006 0 162"
- to="-62.9358 0 162" />
- <animateTransform
- begin="r437.end"
- id="r436"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-62.9358 0 162"
- to="-62.9358 0 162" />
- <animateTransform
- begin="r436.end"
- id="r435"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-62.9358 0 162"
- to="-62.9358 0 162" />
- <animateTransform
- begin="r435.end"
- id="r434"
- attributeName="transform"
- type="rotate"
- dur="0.277043s"
- from="-62.9358 0 162"
- to="-68.4416 0 162" />
- <animateTransform
- begin="r434.end"
- id="r433"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-68.4416 0 162"
- to="-70.2769 0 162" />
- <animateTransform
- begin="r433.end"
- id="r432"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-70.2769 0 162"
- to="-70.2769 0 162" />
- <animateTransform
- begin="r432.end"
- id="r431"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-70.2769 0 162"
- to="-70.2769 0 162" />
- <animateTransform
- begin="r431.end"
- id="r430"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-70.2769 0 162"
- to="-70.2769 0 162" />
- <animateTransform
- begin="r430.end"
- id="r429"
- attributeName="transform"
- type="rotate"
- dur="0.277043s"
- from="-70.2769 0 162"
- to="-75.7826 0 162" />
- <animateTransform
- begin="r429.end"
- id="r428"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-75.7826 0 162"
- to="-75.7826 0 162" />
- <animateTransform
- begin="r428.end"
- id="r427"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-75.7826 0 162"
- to="-77.6179 0 162" />
- <animateTransform
- begin="r427.end"
- id="r426"
- attributeName="transform"
- type="rotate"
- dur="0.230869s"
- from="-77.6179 0 162"
- to="-82.206 0 162" />
- <animateTransform
- begin="r426.end"
- id="r425"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-82.206 0 162"
- to="-82.206 0 162" />
- <animateTransform
- begin="r425.end"
- id="r424"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-82.206 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r424.end"
- id="r423"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r423.end"
- id="r422"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r422.end"
- id="r421"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r421.end"
- id="r420"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r420.end"
- id="r419"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r419.end"
- id="r418"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r418.end"
- id="r417"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-83.1236 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r417.end"
- id="r416"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-83.1236 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r416.end"
- id="r415"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r415.end"
- id="r414"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r414.end"
- id="r413"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r413.end"
- id="r412"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r412.end"
- id="r411"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r411.end"
- id="r410"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r410.end"
- id="r409"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r409.end"
- id="r408"
- attributeName="transform"
- type="rotate"
- dur="0.18816s"
- from="-84.9589 0 162"
- to="-88.6294 0 162" />
- <animateTransform
- begin="r408.end"
- id="r407"
- attributeName="transform"
- type="rotate"
- dur="0.0622559s"
- from="-88.6294 0 162"
- to="-88.6294 0 162" />
- <animateTransform
- begin="r407.end"
- id="r406"
- attributeName="transform"
- type="rotate"
- dur="0.415564s"
- from="-88.6294 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r406.end"
- id="r405"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r405.end"
- id="r404"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r404.end"
- id="r403"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r403.end"
- id="r402"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r402.end"
- id="r401"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-96.8881 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r401.end"
- id="r400"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r400.end"
- id="r399"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r399.end"
- id="r398"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r398.end"
- id="r397"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r397.end"
- id="r396"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r396.end"
- id="r395"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r395.end"
- id="r394"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r394.end"
- id="r393"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r393.end"
- id="r392"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r392.end"
- id="r391"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r391.end"
- id="r390"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-97.8057 0 162"
- to="-99.6409 0 162" />
- <animateTransform
- begin="r390.end"
- id="r389"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-99.6409 0 162"
- to="-99.6409 0 162" />
- <animateTransform
- begin="r389.end"
- id="r388"
- attributeName="transform"
- type="rotate"
- dur="0.207782s"
- from="-99.6409 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r388.end"
- id="r387"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r387.end"
- id="r386"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r386.end"
- id="r385"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r385.end"
- id="r384"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r384.end"
- id="r383"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r383.end"
- id="r382"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r382.end"
- id="r381"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-103.77 0 162"
- to="-103.77 0 162" />
- <animateTransform
- begin="r381.end"
- id="r380"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-103.77 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r380.end"
- id="r379"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-104.229 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r379.end"
- id="r378"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r378.end"
- id="r377"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r377.end"
- id="r376"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r376.end"
- id="r375"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r375.end"
- id="r374"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r374.end"
- id="r373"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-106.064 0 162"
- to="-106.523 0 162" />
- <animateTransform
- begin="r373.end"
- id="r372"
- attributeName="transform"
- type="rotate"
- dur="0.115434s"
- from="-106.523 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r372.end"
- id="r371"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r371.end"
- id="r370"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r370.end"
- id="r369"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r369.end"
- id="r368"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r368.end"
- id="r367"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r367.end"
- id="r366"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r366.end"
- id="r365"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r365.end"
- id="r364"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r364.end"
- id="r363"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r363.end"
- id="r362"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r362.end"
- id="r361"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r361.end"
- id="r360"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r360.end"
- id="r359"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-108.817 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r359.end"
- id="r358"
- attributeName="transform"
- type="rotate"
- dur="0.138521s"
- from="-109.735 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r358.end"
- id="r357"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-112.488 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r357.end"
- id="r356"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-112.488 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r356.end"
- id="r355"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-112.488 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r355.end"
- id="r354"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-112.488 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r354.end"
- id="r353"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-112.488 0 162"
- to="-112.488 0 162" />
- <animateTransform
- begin="r353.end"
- id="r352"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-112.488 0 162"
- to="-114.323 0 162" />
- <animateTransform
- begin="r352.end"
- id="r351"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-114.323 0 162"
- to="-114.323 0 162" />
- <animateTransform
- begin="r351.end"
- id="r350"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-114.323 0 162"
- to="-114.323 0 162" />
- <animateTransform
- begin="r350.end"
- id="r349"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-114.323 0 162"
- to="-114.323 0 162" />
- <animateTransform
- begin="r349.end"
- id="r348"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-114.323 0 162"
- to="-116.158 0 162" />
- <animateTransform
- begin="r348.end"
- id="r347"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-116.158 0 162"
- to="-116.158 0 162" />
- <animateTransform
- begin="r347.end"
- id="r346"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-116.158 0 162"
- to="-116.158 0 162" />
- <animateTransform
- begin="r346.end"
- id="r345"
- attributeName="transform"
- type="rotate"
- dur="0.138521s"
- from="-116.158 0 162"
- to="-118.911 0 162" />
- <animateTransform
- begin="r345.end"
- id="r344"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-118.911 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r344.end"
- id="r343"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r343.end"
- id="r342"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r342.end"
- id="r341"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r341.end"
- id="r340"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r340.end"
- id="r339"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r339.end"
- id="r338"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r338.end"
- id="r337"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r337.end"
- id="r336"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r336.end"
- id="r335"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r335.end"
- id="r334"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r334.end"
- id="r333"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r333.end"
- id="r332"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r332.end"
- id="r331"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r331.end"
- id="r330"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r330.end"
- id="r329"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r329.end"
- id="r328"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r328.end"
- id="r327"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r327.end"
- id="r326"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r326.end"
- id="r325"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r325.end"
- id="r324"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-119.829 0 162"
- to="-121.664 0 162" />
- <animateTransform
- begin="r324.end"
- id="r323"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-121.664 0 162"
- to="-121.664 0 162" />
- <animateTransform
- begin="r323.end"
- id="r322"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-121.664 0 162"
- to="-121.664 0 162" />
- <animateTransform
- begin="r322.end"
- id="r321"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-121.664 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r321.end"
- id="r320"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r320.end"
- id="r319"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r319.end"
- id="r318"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r318.end"
- id="r317"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r317.end"
- id="r316"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r316.end"
- id="r315"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r315.end"
- id="r314"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r314.end"
- id="r313"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r313.end"
- id="r312"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r312.end"
- id="r311"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r311.end"
- id="r310"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r310.end"
- id="r309"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r309.end"
- id="r308"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r308.end"
- id="r307"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r307.end"
- id="r306"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r306.end"
- id="r305"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-123.499 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r305.end"
- id="r304"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r304.end"
- id="r303"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r303.end"
- id="r302"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r302.end"
- id="r301"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r301.end"
- id="r300"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r300.end"
- id="r299"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r299.end"
- id="r298"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r298.end"
- id="r297"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r297.end"
- id="r296"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r296.end"
- id="r295"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r295.end"
- id="r294"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r294.end"
- id="r293"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r293.end"
- id="r292"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r292.end"
- id="r291"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r291.end"
- id="r290"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r290.end"
- id="r289"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r289.end"
- id="r288"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r288.end"
- id="r287"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r287.end"
- id="r286"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r286.end"
- id="r285"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r285.end"
- id="r284"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r284.end"
- id="r283"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-124.417 0 162"
- to="-124.417 0 162" />
- <animateTransform
- begin="r283.end"
- id="r282"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-124.417 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r282.end"
- id="r281"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r281.end"
- id="r280"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r280.end"
- id="r279"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r279.end"
- id="r278"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r278.end"
- id="r277"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r277.end"
- id="r276"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r276.end"
- id="r275"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-123.499 0 162"
- to="-123.499 0 162" />
- <animateTransform
- begin="r275.end"
- id="r274"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-123.499 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r274.end"
- id="r273"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r273.end"
- id="r272"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r272.end"
- id="r271"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r271.end"
- id="r270"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r270.end"
- id="r269"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r269.end"
- id="r268"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r268.end"
- id="r267"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r267.end"
- id="r266"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r266.end"
- id="r265"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r265.end"
- id="r264"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-122.582 0 162"
- to="-122.582 0 162" />
- <animateTransform
- begin="r264.end"
- id="r263"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-122.582 0 162"
- to="-120.746 0 162" />
- <animateTransform
- begin="r263.end"
- id="r262"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-120.746 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r262.end"
- id="r261"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r261.end"
- id="r260"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r260.end"
- id="r259"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r259.end"
- id="r258"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r258.end"
- id="r257"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r257.end"
- id="r256"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-119.829 0 162"
- to="-119.829 0 162" />
- <animateTransform
- begin="r256.end"
- id="r255"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-119.829 0 162"
- to="-118.911 0 162" />
- <animateTransform
- begin="r255.end"
- id="r254"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-118.911 0 162"
- to="-118.911 0 162" />
- <animateTransform
- begin="r254.end"
- id="r253"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-118.911 0 162"
- to="-118.911 0 162" />
- <animateTransform
- begin="r253.end"
- id="r252"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-118.911 0 162"
- to="-117.076 0 162" />
- <animateTransform
- begin="r252.end"
- id="r251"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-117.076 0 162"
- to="-117.076 0 162" />
- <animateTransform
- begin="r251.end"
- id="r250"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-117.076 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r250.end"
- id="r249"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r249.end"
- id="r248"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r248.end"
- id="r247"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r247.end"
- id="r246"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r246.end"
- id="r245"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r245.end"
- id="r244"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r244.end"
- id="r243"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-116.617 0 162"
- to="-116.617 0 162" />
- <animateTransform
- begin="r243.end"
- id="r242"
- attributeName="transform"
- type="rotate"
- dur="0.0461738s"
- from="-116.617 0 162"
- to="-115.699 0 162" />
- <animateTransform
- begin="r242.end"
- id="r241"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-115.699 0 162"
- to="-115.699 0 162" />
- <animateTransform
- begin="r241.end"
- id="r240"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-115.699 0 162"
- to="-115.699 0 162" />
- <animateTransform
- begin="r240.end"
- id="r239"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-115.699 0 162"
- to="-115.699 0 162" />
- <animateTransform
- begin="r239.end"
- id="r238"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-115.699 0 162"
- to="-115.241 0 162" />
- <animateTransform
- begin="r238.end"
- id="r237"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-115.241 0 162"
- to="-115.241 0 162" />
- <animateTransform
- begin="r237.end"
- id="r236"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-115.241 0 162"
- to="-115.241 0 162" />
- <animateTransform
- begin="r236.end"
- id="r235"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-115.241 0 162"
- to="-115.241 0 162" />
- <animateTransform
- begin="r235.end"
- id="r234"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-115.241 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r234.end"
- id="r233"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r233.end"
- id="r232"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r232.end"
- id="r231"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r231.end"
- id="r230"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r230.end"
- id="r229"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r229.end"
- id="r228"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r228.end"
- id="r227"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r227.end"
- id="r226"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r226.end"
- id="r225"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r225.end"
- id="r224"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r224.end"
- id="r223"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r223.end"
- id="r222"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r222.end"
- id="r221"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r221.end"
- id="r220"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r220.end"
- id="r219"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-114.782 0 162"
- to="-114.782 0 162" />
- <animateTransform
- begin="r219.end"
- id="r218"
- attributeName="transform"
- type="rotate"
- dur="0.0461738s"
- from="-114.782 0 162"
- to="-113.864 0 162" />
- <animateTransform
- begin="r218.end"
- id="r217"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-113.864 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r217.end"
- id="r216"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r216.end"
- id="r215"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r215.end"
- id="r214"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r214.end"
- id="r213"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r213.end"
- id="r212"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r212.end"
- id="r211"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r211.end"
- id="r210"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-113.405 0 162"
- to="-113.405 0 162" />
- <animateTransform
- begin="r210.end"
- id="r209"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-113.405 0 162"
- to="-112.947 0 162" />
- <animateTransform
- begin="r209.end"
- id="r208"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-112.947 0 162"
- to="-112.947 0 162" />
- <animateTransform
- begin="r208.end"
- id="r207"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-112.947 0 162"
- to="-112.947 0 162" />
- <animateTransform
- begin="r207.end"
- id="r206"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-112.947 0 162"
- to="-112.947 0 162" />
- <animateTransform
- begin="r206.end"
- id="r205"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-112.947 0 162"
- to="-112.947 0 162" />
- <animateTransform
- begin="r205.end"
- id="r204"
- attributeName="transform"
- type="rotate"
- dur="0.0461738s"
- from="-112.947 0 162"
- to="-112.029 0 162" />
- <animateTransform
- begin="r204.end"
- id="r203"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-112.029 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r203.end"
- id="r202"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r202.end"
- id="r201"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r201.end"
- id="r200"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r200.end"
- id="r199"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r199.end"
- id="r198"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r198.end"
- id="r197"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r197.end"
- id="r196"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r196.end"
- id="r195"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r195.end"
- id="r194"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r194.end"
- id="r193"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r193.end"
- id="r192"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r192.end"
- id="r191"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-111.57 0 162"
- to="-111.57 0 162" />
- <animateTransform
- begin="r191.end"
- id="r190"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-111.57 0 162"
- to="-111.111 0 162" />
- <animateTransform
- begin="r190.end"
- id="r189"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-111.111 0 162"
- to="-111.111 0 162" />
- <animateTransform
- begin="r189.end"
- id="r188"
- attributeName="transform"
- type="rotate"
- dur="0.0692607s"
- from="-111.111 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r188.end"
- id="r187"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r187.end"
- id="r186"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r186.end"
- id="r185"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r185.end"
- id="r184"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r184.end"
- id="r183"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r183.end"
- id="r182"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-109.735 0 162"
- to="-109.735 0 162" />
- <animateTransform
- begin="r182.end"
- id="r181"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-109.735 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r181.end"
- id="r180"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r180.end"
- id="r179"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r179.end"
- id="r178"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-108.817 0 162"
- to="-108.817 0 162" />
- <animateTransform
- begin="r178.end"
- id="r177"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-108.817 0 162"
- to="-107.9 0 162" />
- <animateTransform
- begin="r177.end"
- id="r176"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-107.9 0 162"
- to="-107.9 0 162" />
- <animateTransform
- begin="r176.end"
- id="r175"
- attributeName="transform"
- type="rotate"
- dur="0.0692607s"
- from="-107.9 0 162"
- to="-106.523 0 162" />
- <animateTransform
- begin="r175.end"
- id="r174"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-106.523 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r174.end"
- id="r173"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r173.end"
- id="r172"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r172.end"
- id="r171"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r171.end"
- id="r170"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r170.end"
- id="r169"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r169.end"
- id="r168"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r168.end"
- id="r167"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r167.end"
- id="r166"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r166.end"
- id="r165"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-106.064 0 162"
- to="-106.064 0 162" />
- <animateTransform
- begin="r165.end"
- id="r164"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-106.064 0 162"
- to="-105.147 0 162" />
- <animateTransform
- begin="r164.end"
- id="r163"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-105.147 0 162"
- to="-105.147 0 162" />
- <animateTransform
- begin="r163.end"
- id="r162"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-105.147 0 162"
- to="-105.147 0 162" />
- <animateTransform
- begin="r162.end"
- id="r161"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-105.147 0 162"
- to="-105.147 0 162" />
- <animateTransform
- begin="r161.end"
- id="r160"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-105.147 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r160.end"
- id="r159"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r159.end"
- id="r158"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r158.end"
- id="r157"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r157.end"
- id="r156"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r156.end"
- id="r155"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r155.end"
- id="r154"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r154.end"
- id="r153"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r153.end"
- id="r152"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-104.229 0 162"
- to="-104.229 0 162" />
- <animateTransform
- begin="r152.end"
- id="r151"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-104.229 0 162"
- to="-102.394 0 162" />
- <animateTransform
- begin="r151.end"
- id="r150"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-102.394 0 162"
- to="-101.476 0 162" />
- <animateTransform
- begin="r150.end"
- id="r149"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-101.476 0 162"
- to="-101.476 0 162" />
- <animateTransform
- begin="r149.end"
- id="r148"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-101.476 0 162"
- to="-101.476 0 162" />
- <animateTransform
- begin="r148.end"
- id="r147"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-101.476 0 162"
- to="-101.476 0 162" />
- <animateTransform
- begin="r147.end"
- id="r146"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-101.476 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r146.end"
- id="r145"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r145.end"
- id="r144"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r144.end"
- id="r143"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r143.end"
- id="r142"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r142.end"
- id="r141"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r141.end"
- id="r140"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r140.end"
- id="r139"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-100.559 0 162"
- to="-100.559 0 162" />
- <animateTransform
- begin="r139.end"
- id="r138"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-100.559 0 162"
- to="-98.7233 0 162" />
- <animateTransform
- begin="r138.end"
- id="r137"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-98.7233 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r137.end"
- id="r136"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r136.end"
- id="r135"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r135.end"
- id="r134"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-97.8057 0 162"
- to="-97.8057 0 162" />
- <animateTransform
- begin="r134.end"
- id="r133"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-97.8057 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r133.end"
- id="r132"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r132.end"
- id="r131"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r131.end"
- id="r130"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r130.end"
- id="r129"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r129.end"
- id="r128"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r128.end"
- id="r127"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r127.end"
- id="r126"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-96.8881 0 162"
- to="-96.8881 0 162" />
- <animateTransform
- begin="r126.end"
- id="r125"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-96.8881 0 162"
- to="-95.0528 0 162" />
- <animateTransform
- begin="r125.end"
- id="r124"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-95.0528 0 162"
- to="-94.1352 0 162" />
- <animateTransform
- begin="r124.end"
- id="r123"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-94.1352 0 162"
- to="-94.1352 0 162" />
- <animateTransform
- begin="r123.end"
- id="r122"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-94.1352 0 162"
- to="-94.1352 0 162" />
- <animateTransform
- begin="r122.end"
- id="r121"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-94.1352 0 162"
- to="-94.1352 0 162" />
- <animateTransform
- begin="r121.end"
- id="r120"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-94.1352 0 162"
- to="-94.1352 0 162" />
- <animateTransform
- begin="r120.end"
- id="r119"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-94.1352 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r119.end"
- id="r118"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r118.end"
- id="r117"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r117.end"
- id="r116"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r116.end"
- id="r115"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r115.end"
- id="r114"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r114.end"
- id="r113"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-93.2175 0 162"
- to="-93.2175 0 162" />
- <animateTransform
- begin="r113.end"
- id="r112"
- attributeName="transform"
- type="rotate"
- dur="0.0923475s"
- from="-93.2175 0 162"
- to="-91.3823 0 162" />
- <animateTransform
- begin="r112.end"
- id="r111"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-91.3823 0 162"
- to="-90.4647 0 162" />
- <animateTransform
- begin="r111.end"
- id="r110"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-90.4647 0 162"
- to="-90.4647 0 162" />
- <animateTransform
- begin="r110.end"
- id="r109"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-90.4647 0 162"
- to="-90.4647 0 162" />
- <animateTransform
- begin="r109.end"
- id="r108"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-90.4647 0 162"
- to="-90.4647 0 162" />
- <animateTransform
- begin="r108.end"
- id="r107"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-90.4647 0 162"
- to="-89.547 0 162" />
- <animateTransform
- begin="r107.end"
- id="r106"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-89.547 0 162"
- to="-89.547 0 162" />
- <animateTransform
- begin="r106.end"
- id="r105"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-89.547 0 162"
- to="-89.547 0 162" />
- <animateTransform
- begin="r105.end"
- id="r104"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-89.547 0 162"
- to="-89.547 0 162" />
- <animateTransform
- begin="r104.end"
- id="r103"
- attributeName="transform"
- type="rotate"
- dur="0.230869s"
- from="-89.547 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r103.end"
- id="r102"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r102.end"
- id="r101"
- attributeName="transform"
- type="rotate"
- dur="0.0311279s"
- from="-84.9589 0 162"
- to="-84.9589 0 162" />
- <animateTransform
- begin="r101.end"
- id="r100"
- attributeName="transform"
- type="rotate"
- dur="0.09408s"
- from="-84.9589 0 162"
- to="-83.1236 0 162" />
- <animateTransform
- begin="r100.end"
- id="r99"
- attributeName="transform"
- type="rotate"
- dur="0.461738s"
- from="-83.1236 0 162"
- to="-73.9474 0 162" />
- <animateTransform
- begin="r99.end"
- id="r98"
- attributeName="transform"
- type="rotate"
- dur="0.73878s"
- from="-73.9474 0 162"
- to="-59.2653 0 162" />
- <animateTransform
- begin="r98.end"
- id="r97"
- attributeName="transform"
- type="rotate"
- dur="0.387595s"
- from="-59.2653 0 162"
- to="-51.9243 0 162" />
- <animateTransform
- begin="r97.end"
- id="r96"
- attributeName="transform"
- type="rotate"
- dur="0.166016s"
- from="-51.9243 0 162"
- to="-51.9243 0 162" />
- <animateTransform
- begin="r96.end"
- id="r95"
- attributeName="transform"
- type="rotate"
- dur="0.387595s"
- from="-51.9243 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r95.end"
- id="r94"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r94.end"
- id="r93"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r93.end"
- id="r92"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r92.end"
- id="r91"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r91.end"
- id="r90"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r90.end"
- id="r89"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-44.5833 0 162"
- to="-44.5833 0 162" />
- <animateTransform
- begin="r89.end"
- id="r88"
- attributeName="transform"
- type="rotate"
- dur="0.193797s"
- from="-44.5833 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r88.end"
- id="r87"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r87.end"
- id="r86"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r86.end"
- id="r85"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r85.end"
- id="r84"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r84.end"
- id="r83"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r83.end"
- id="r82"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-40.9128 0 162"
- to="-40.9128 0 162" />
- <animateTransform
- begin="r82.end"
- id="r81"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-40.9128 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r81.end"
- id="r80"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-39.0775 0 162"
- to="-39.0775 0 162" />
- <animateTransform
- begin="r80.end"
- id="r79"
- attributeName="transform"
- type="rotate"
- dur="0.461738s"
- from="-39.0775 0 162"
- to="-29.9012 0 162" />
- <animateTransform
- begin="r79.end"
- id="r78"
- attributeName="transform"
- type="rotate"
- dur="0.193797s"
- from="-29.9012 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r78.end"
- id="r77"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r77.end"
- id="r76"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r76.end"
- id="r75"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r75.end"
- id="r74"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r74.end"
- id="r73"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r73.end"
- id="r72"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="-26.2307 0 162"
- to="-26.2307 0 162" />
- <animateTransform
- begin="r72.end"
- id="r71"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-26.2307 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r71.end"
- id="r70"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r70.end"
- id="r69"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r69.end"
- id="r68"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r68.end"
- id="r67"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r67.end"
- id="r66"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r66.end"
- id="r65"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r65.end"
- id="r64"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-24.3955 0 162"
- to="-24.3955 0 162" />
- <animateTransform
- begin="r64.end"
- id="r63"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-24.3955 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r63.end"
- id="r62"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r62.end"
- id="r61"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r61.end"
- id="r60"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-23.4778 0 162"
- to="-23.4778 0 162" />
- <animateTransform
- begin="r60.end"
- id="r59"
- attributeName="transform"
- type="rotate"
- dur="0.230869s"
- from="-23.4778 0 162"
- to="-18.8897 0 162" />
- <animateTransform
- begin="r59.end"
- id="r58"
- attributeName="transform"
- type="rotate"
- dur="0.0968987s"
- from="-18.8897 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r58.end"
- id="r57"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r57.end"
- id="r56"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r56.end"
- id="r55"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r55.end"
- id="r54"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r54.end"
- id="r53"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r53.end"
- id="r52"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r52.end"
- id="r51"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-17.0544 0 162"
- to="-17.0544 0 162" />
- <animateTransform
- begin="r51.end"
- id="r50"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-17.0544 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r50.end"
- id="r49"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r49.end"
- id="r48"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r48.end"
- id="r47"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r47.end"
- id="r46"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r46.end"
- id="r45"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r45.end"
- id="r44"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r44.end"
- id="r43"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-16.1368 0 162"
- to="-16.1368 0 162" />
- <animateTransform
- begin="r43.end"
- id="r42"
- attributeName="transform"
- type="rotate"
- dur="0.0242247s"
- from="-16.1368 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r42.end"
- id="r41"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-15.678 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r41.end"
- id="r40"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-15.678 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r40.end"
- id="r39"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-15.678 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r39.end"
- id="r38"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-15.678 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r38.end"
- id="r37"
- attributeName="transform"
- type="rotate"
- dur="0.00518799s"
- from="-15.678 0 162"
- to="-15.678 0 162" />
- <animateTransform
- begin="r37.end"
- id="r36"
- attributeName="transform"
- type="rotate"
- dur="0.115434s"
- from="-15.678 0 162"
- to="-13.3839 0 162" />
- <animateTransform
- begin="r36.end"
- id="r35"
- attributeName="transform"
- type="rotate"
- dur="0.0484493s"
- from="-13.3839 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r35.end"
- id="r34"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r34.end"
- id="r33"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r33.end"
- id="r32"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r32.end"
- id="r31"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r31.end"
- id="r30"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r30.end"
- id="r29"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r29.end"
- id="r28"
- attributeName="transform"
- type="rotate"
- dur="0.00778198s"
- from="-12.4663 0 162"
- to="-12.4663 0 162" />
- <animateTransform
- begin="r28.end"
- id="r27"
- attributeName="transform"
- type="rotate"
- dur="0.02352s"
- from="-12.4663 0 162"
- to="-12.0075 0 162" />
- <animateTransform
- begin="r27.end"
- id="r26"
- attributeName="transform"
- type="rotate"
- dur="0.115434s"
- from="-12.0075 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r26.end"
- id="r25"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r25.end"
- id="r24"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r24.end"
- id="r23"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r23.end"
- id="r22"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r22.end"
- id="r21"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r21.end"
- id="r20"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r20.end"
- id="r19"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r19.end"
- id="r18"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r18.end"
- id="r17"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r17.end"
- id="r16"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r16.end"
- id="r15"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r15.end"
- id="r14"
- attributeName="transform"
- type="rotate"
- dur="0.020752s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r14.end"
- id="r13"
- attributeName="transform"
- type="rotate"
- dur="0.015564s"
- from="-9.71343 0 162"
- to="-9.71343 0 162" />
- <animateTransform
- begin="r13.end"
- id="r12"
- attributeName="transform"
- type="rotate"
- dur="0.04704s"
- from="-9.71343 0 162"
- to="-8.7958 0 162" />
- <animateTransform
- begin="r12.end"
- id="r11"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
- <animateTransform
- begin="r11.end"
- id="r10"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
- <animateTransform
- begin="r10.end"
- id="r9"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
- <animateTransform
- begin="r9.end"
- id="r8"
- attributeName="transform"
- type="rotate"
- dur="0.010376s"
- from="-8.7958 0 162"
- to="-8.7958 0 162" />
- <animateTransform
- begin="r8.end"
- id="r7"
- attributeName="transform"
- type="rotate"
- dur="0.415564s"
- from="-8.7958 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r7.end"
- id="r6"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r6.end"
- id="r5"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r5.end"
- id="r4"
- attributeName="transform"
- type="rotate"
- dur="0.0830078s"
- from="-0.537148 0 162"
- to="-0.537148 0 162" />
- <animateTransform
- begin="r4.end"
- id="r3"
- attributeName="transform"
- type="rotate"
- dur="0.193797s"
- from="-0.537148 0 162"
- to="3.13336 0 162" />
- <animateTransform
- begin="r3.end"
- id="r2"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="3.13336 0 162"
- to="3.13336 0 162" />
- <animateTransform
- begin="r2.end"
- id="r1"
- attributeName="transform"
- type="rotate"
- dur="0.0415039s"
- from="3.13336 0 162"
- to="3.13336 0 162" />
- </path>
- <animateTransform
- begin="r950.begin"
- id="t950"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="164.653 117.75"
- to="166.147 117.75" />
- <animateTransform
- begin="r949.begin"
- id="t949"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="166.147 117.75"
- to="167.641 117.75" />
- <animateTransform
- begin="r948.begin"
- id="t948"
- attributeName="transform"
- type="translate"
- dur="0.18816s"
- from="167.641 117.75"
- to="169.135 117.75" />
- <animateTransform
- begin="r947.begin"
- id="t947"
- attributeName="transform"
- type="translate"
- dur="0.0622559s"
- from="169.135 117.75"
- to="171.376 117.75" />
- <animateTransform
- begin="r946.begin"
- id="t946"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="171.376 117.75"
- to="174.365 117.75" />
- <animateTransform
- begin="r945.begin"
- id="t945"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="174.365 117.75"
- to="177.353 117.75" />
- <animateTransform
- begin="r944.begin"
- id="t944"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="177.353 117.75"
- to="180.341 117.75" />
- <animateTransform
- begin="r943.begin"
- id="t943"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="180.341 117.75"
- to="183.329 117.75" />
- <animateTransform
- begin="r942.begin"
- id="t942"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="183.329 117.75"
- to="186.318 117.75" />
- <animateTransform
- begin="r941.begin"
- id="t941"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="186.318 117.75"
- to="189.306 117.75" />
- <animateTransform
- begin="r940.begin"
- id="t940"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="189.306 117.75"
- to="192.294 117.75" />
- <animateTransform
- begin="r939.begin"
- id="t939"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="192.294 117.75"
- to="195.283 117.75" />
- <animateTransform
- begin="r938.begin"
- id="t938"
- attributeName="transform"
- type="translate"
- dur="0.193797s"
- from="195.283 117.75"
- to="197.524 117.75" />
- <animateTransform
- begin="r937.begin"
- id="t937"
- attributeName="transform"
- type="translate"
- dur="0.36939s"
- from="197.524 117.75"
- to="199.018 117.75" />
- <animateTransform
- begin="r936.begin"
- id="t936"
- attributeName="transform"
- type="translate"
- dur="0.230869s"
- from="199.018 117.75"
- to="199.952 117.75" />
- <animateTransform
- begin="r935.begin"
- id="t935"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="199.952 117.75"
- to="200.325 117.75" />
- <animateTransform
- begin="r934.begin"
- id="t934"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="200.325 117.75"
- to="200.699 117.75" />
- <animateTransform
- begin="r933.begin"
- id="t933"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="200.699 117.75"
- to="201.072 117.75" />
- <animateTransform
- begin="r932.begin"
- id="t932"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="201.072 117.75"
- to="201.633 117.75" />
- <animateTransform
- begin="r931.begin"
- id="t931"
- attributeName="transform"
- type="translate"
- dur="0.115434s"
- from="201.633 117.75"
- to="202.1 117.75" />
- <animateTransform
- begin="r930.begin"
- id="t930"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="202.1 117.75"
- to="202.286 117.75" />
- <animateTransform
- begin="r929.begin"
- id="t929"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="202.286 117.75"
- to="202.473 117.75" />
- <animateTransform
- begin="r928.begin"
- id="t928"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="202.473 117.75"
- to="202.66 117.75" />
- <animateTransform
- begin="r927.begin"
- id="t927"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="202.66 117.75"
- to="202.94 117.75" />
- <animateTransform
- begin="r926.begin"
- id="t926"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="202.94 117.75"
- to="203.314 117.75" />
- <animateTransform
- begin="r925.begin"
- id="t925"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="203.314 117.75"
- to="203.687 117.75" />
- <animateTransform
- begin="r924.begin"
- id="t924"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="203.687 117.75"
- to="204.061 117.75" />
- <animateTransform
- begin="r923.begin"
- id="t923"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="204.061 117.75"
- to="204.434 117.75" />
- <animateTransform
- begin="r922.begin"
- id="t922"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="204.434 117.75"
- to="204.808 117.75" />
- <animateTransform
- begin="r921.begin"
- id="t921"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="204.808 117.75"
- to="205.181 117.75" />
- <animateTransform
- begin="r920.begin"
- id="t920"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="205.181 117.75"
- to="205.555 117.75" />
- <animateTransform
- begin="r919.begin"
- id="t919"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="205.555 117.75"
- to="206.115 117.75" />
- <animateTransform
- begin="r918.begin"
- id="t918"
- attributeName="transform"
- type="translate"
- dur="0.115434s"
- from="206.115 117.75"
- to="206.582 117.75" />
- <animateTransform
- begin="r917.begin"
- id="t917"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="206.582 117.75"
- to="206.769 117.75" />
- <animateTransform
- begin="r916.begin"
- id="t916"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="206.769 117.75"
- to="207.049 117.75" />
- <animateTransform
- begin="r915.begin"
- id="t915"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="207.049 117.75"
- to="207.422 117.75" />
- <animateTransform
- begin="r914.begin"
- id="t914"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="207.422 117.75"
- to="207.796 117.75" />
- <animateTransform
- begin="r913.begin"
- id="t913"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="207.796 117.75"
- to="208.17 117.75" />
- <animateTransform
- begin="r912.begin"
- id="t912"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="208.17 117.75"
- to="208.543 117.75" />
- <animateTransform
- begin="r911.begin"
- id="t911"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="208.543 117.75"
- to="208.917 117.75" />
- <animateTransform
- begin="r910.begin"
- id="t910"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="208.917 117.75"
- to="209.29 117.75" />
- <animateTransform
- begin="r909.begin"
- id="t909"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="209.29 117.75"
- to="209.664 117.75" />
- <animateTransform
- begin="r908.begin"
- id="t908"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="209.664 117.75"
- to="210.037 117.75" />
- <animateTransform
- begin="r907.begin"
- id="t907"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="210.037 117.75"
- to="210.598 117.75" />
- <animateTransform
- begin="r906.begin"
- id="t906"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="210.598 117.75"
- to="211.345 117.75" />
- <animateTransform
- begin="r905.begin"
- id="t905"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="211.345 117.75"
- to="211.905 117.75" />
- <animateTransform
- begin="r904.begin"
- id="t904"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="211.905 117.75"
- to="212.278 117.75" />
- <animateTransform
- begin="r903.begin"
- id="t903"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="212.278 117.75"
- to="212.559 117.75" />
- <animateTransform
- begin="r902.begin"
- id="t902"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="212.559 117.75"
- to="212.745 117.75" />
- <animateTransform
- begin="r901.begin"
- id="t901"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="212.745 117.75"
- to="213.025 117.75" />
- <animateTransform
- begin="r900.begin"
- id="t900"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="213.025 117.75"
- to="213.399 117.75" />
- <animateTransform
- begin="r899.begin"
- id="t899"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="213.399 117.75"
- to="213.679 117.75" />
- <animateTransform
- begin="r898.begin"
- id="t898"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="213.679 117.75"
- to="213.866 117.75" />
- <animateTransform
- begin="r897.begin"
- id="t897"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="213.866 117.75"
- to="214.053 117.75" />
- <animateTransform
- begin="r896.begin"
- id="t896"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="214.053 117.75"
- to="214.239 117.75" />
- <animateTransform
- begin="r895.begin"
- id="t895"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="214.239 117.75"
- to="214.426 117.75" />
- <animateTransform
- begin="r894.begin"
- id="t894"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="214.426 117.75"
- to="214.613 117.75" />
- <animateTransform
- begin="r893.begin"
- id="t893"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="214.613 117.75"
- to="214.893 117.75" />
- <animateTransform
- begin="r892.begin"
- id="t892"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="214.893 117.75"
- to="215.267 117.75" />
- <animateTransform
- begin="r891.begin"
- id="t891"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="215.267 117.75"
- to="215.64 117.75" />
- <animateTransform
- begin="r890.begin"
- id="t890"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="215.64 117.75"
- to="216.014 117.75" />
- <animateTransform
- begin="r889.begin"
- id="t889"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="216.014 117.75"
- to="216.387 117.75" />
- <animateTransform
- begin="r888.begin"
- id="t888"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="216.387 117.75"
- to="216.761 117.75" />
- <animateTransform
- begin="r887.begin"
- id="t887"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="216.761 117.75"
- to="217.134 117.75" />
- <animateTransform
- begin="r886.begin"
- id="t886"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="217.134 117.75"
- to="217.508 117.75" />
- <animateTransform
- begin="r885.begin"
- id="t885"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="217.508 117.75"
- to="218.068 117.75" />
- <animateTransform
- begin="r884.begin"
- id="t884"
- attributeName="transform"
- type="translate"
- dur="0.115434s"
- from="218.068 117.75"
- to="218.535 117.75" />
- <animateTransform
- begin="r883.begin"
- id="t883"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="218.535 117.75"
- to="218.722 117.75" />
- <animateTransform
- begin="r882.begin"
- id="t882"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="218.722 117.75"
- to="219.002 117.75" />
- <animateTransform
- begin="r881.begin"
- id="t881"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="219.002 117.75"
- to="219.376 117.75" />
- <animateTransform
- begin="r880.begin"
- id="t880"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="219.376 117.75"
- to="219.749 117.75" />
- <animateTransform
- begin="r879.begin"
- id="t879"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="219.749 117.75"
- to="220.123 117.75" />
- <animateTransform
- begin="r878.begin"
- id="t878"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="220.123 117.75"
- to="220.496 117.75" />
- <animateTransform
- begin="r877.begin"
- id="t877"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="220.496 117.75"
- to="220.87 117.75" />
- <animateTransform
- begin="r876.begin"
- id="t876"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="220.87 117.75"
- to="221.243 117.75" />
- <animateTransform
- begin="r875.begin"
- id="t875"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="221.243 117.75"
- to="221.804 117.75" />
- <animateTransform
- begin="r874.begin"
- id="t874"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="221.804 117.75"
- to="222.551 117.75" />
- <animateTransform
- begin="r873.begin"
- id="t873"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="222.551 117.75"
- to="223.111 117.75" />
- <animateTransform
- begin="r872.begin"
- id="t872"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="223.111 117.75"
- to="223.484 117.75" />
- <animateTransform
- begin="r871.begin"
- id="t871"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="223.484 117.75"
- to="223.858 117.75" />
- <animateTransform
- begin="r870.begin"
- id="t870"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="223.858 117.75"
- to="224.232 117.75" />
- <animateTransform
- begin="r869.begin"
- id="t869"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="224.232 117.75"
- to="224.605 117.75" />
- <animateTransform
- begin="r868.begin"
- id="t868"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="224.605 117.75"
- to="224.979 117.75" />
- <animateTransform
- begin="r867.begin"
- id="t867"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="224.979 117.75"
- to="225.539 117.75" />
- <animateTransform
- begin="r866.begin"
- id="t866"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="225.539 117.75"
- to="226.286 117.75" />
- <animateTransform
- begin="r865.begin"
- id="t865"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="226.286 117.75"
- to="226.846 117.75" />
- <animateTransform
- begin="r864.begin"
- id="t864"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="226.846 117.75"
- to="227.126 117.75" />
- <animateTransform
- begin="r863.begin"
- id="t863"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="227.126 117.75"
- to="227.313 117.75" />
- <animateTransform
- begin="r862.begin"
- id="t862"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="227.313 117.75"
- to="227.593 117.75" />
- <animateTransform
- begin="r861.begin"
- id="t861"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="227.593 117.75"
- to="227.967 117.75" />
- <animateTransform
- begin="r860.begin"
- id="t860"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="227.967 117.75"
- to="228.34 117.75" />
- <animateTransform
- begin="r859.begin"
- id="t859"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="228.34 117.75"
- to="228.621 117.75" />
- <animateTransform
- begin="r858.begin"
- id="t858"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="228.621 117.75"
- to="228.807 117.75" />
- <animateTransform
- begin="r857.begin"
- id="t857"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="228.807 117.75"
- to="228.994 117.75" />
- <animateTransform
- begin="r856.begin"
- id="t856"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="228.994 117.75"
- to="229.181 117.75" />
- <animateTransform
- begin="r855.begin"
- id="t855"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="229.181 117.75"
- to="229.461 117.75" />
- <animateTransform
- begin="r854.begin"
- id="t854"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="229.461 117.75"
- to="229.835 117.75" />
- <animateTransform
- begin="r853.begin"
- id="t853"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="229.835 117.75"
- to="230.208 117.75" />
- <animateTransform
- begin="r852.begin"
- id="t852"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="230.208 117.75"
- to="230.488 117.75" />
- <animateTransform
- begin="r851.begin"
- id="t851"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="230.488 117.75"
- to="230.675 117.75" />
- <animateTransform
- begin="r850.begin"
- id="t850"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="230.675 117.75"
- to="230.955 117.75" />
- <animateTransform
- begin="r849.begin"
- id="t849"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="230.955 117.75"
- to="231.329 117.75" />
- <animateTransform
- begin="r848.begin"
- id="t848"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="231.329 117.75"
- to="231.609 117.75" />
- <animateTransform
- begin="r847.begin"
- id="t847"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="231.609 117.75"
- to="231.796 117.75" />
- <animateTransform
- begin="r846.begin"
- id="t846"
- attributeName="transform"
- type="translate"
- dur="0.0461738s"
- from="231.796 117.75"
- to="231.982 117.75" />
- <animateTransform
- begin="r845.begin"
- id="t845"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="231.982 117.75"
- to="231.702 117.75" />
- <animateTransform
- begin="r844.begin"
- id="t844"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="231.702 117.75"
- to="231.329 117.75" />
- <animateTransform
- begin="r843.begin"
- id="t843"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="231.329 117.75"
- to="230.955 117.75" />
- <animateTransform
- begin="r842.begin"
- id="t842"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="230.955 117.75"
- to="230.582 117.75" />
- <animateTransform
- begin="r841.begin"
- id="t841"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="230.582 117.75"
- to="230.208 117.75" />
- <animateTransform
- begin="r840.begin"
- id="t840"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="230.208 117.75"
- to="229.835 117.75" />
- <animateTransform
- begin="r839.begin"
- id="t839"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="229.835 117.75"
- to="229.461 117.75" />
- <animateTransform
- begin="r838.begin"
- id="t838"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="229.461 117.75"
- to="229.088 117.75" />
- <animateTransform
- begin="r837.begin"
- id="t837"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="229.088 117.75"
- to="228.527 117.75" />
- <animateTransform
- begin="r836.begin"
- id="t836"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="228.527 117.75"
- to="227.78 117.75" />
- <animateTransform
- begin="r835.begin"
- id="t835"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="227.78 117.75"
- to="227.033 117.75" />
- <animateTransform
- begin="r834.begin"
- id="t834"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="227.033 117.75"
- to="226.286 117.75" />
- <animateTransform
- begin="r833.begin"
- id="t833"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="226.286 117.75"
- to="225.539 117.75" />
- <animateTransform
- begin="r832.begin"
- id="t832"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="225.539 117.75"
- to="224.792 117.75" />
- <animateTransform
- begin="r831.begin"
- id="t831"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="224.792 117.75"
- to="224.045 117.75" />
- <animateTransform
- begin="r830.begin"
- id="t830"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="224.045 117.75"
- to="223.298 117.75" />
- <animateTransform
- begin="r829.begin"
- id="t829"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="223.298 117.75"
- to="222.551 117.75" />
- <animateTransform
- begin="r828.begin"
- id="t828"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="222.551 117.75"
- to="221.43 117.75" />
- <animateTransform
- begin="r827.begin"
- id="t827"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="221.43 117.75"
- to="219.936 117.75" />
- <animateTransform
- begin="r826.begin"
- id="t826"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="219.936 117.75"
- to="218.442 117.75" />
- <animateTransform
- begin="r825.begin"
- id="t825"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="218.442 117.75"
- to="217.321 117.75" />
- <animateTransform
- begin="r824.begin"
- id="t824"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="217.321 117.75"
- to="216.574 117.75" />
- <animateTransform
- begin="r823.begin"
- id="t823"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="216.574 117.75"
- to="216.014 117.75" />
- <animateTransform
- begin="r822.begin"
- id="t822"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="216.014 117.75"
- to="215.64 117.75" />
- <animateTransform
- begin="r821.begin"
- id="t821"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="215.64 117.75"
- to="215.08 117.75" />
- <animateTransform
- begin="r820.begin"
- id="t820"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="215.08 117.75"
- to="214.333 117.75" />
- <animateTransform
- begin="r819.begin"
- id="t819"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="214.333 117.75"
- to="213.586 117.75" />
- <animateTransform
- begin="r818.begin"
- id="t818"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="213.586 117.75"
- to="212.839 117.75" />
- <animateTransform
- begin="r817.begin"
- id="t817"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="212.839 117.75"
- to="212.092 117.75" />
- <animateTransform
- begin="r816.begin"
- id="t816"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="212.092 117.75"
- to="211.345 117.75" />
- <animateTransform
- begin="r815.begin"
- id="t815"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="211.345 117.75"
- to="210.598 117.75" />
- <animateTransform
- begin="r814.begin"
- id="t814"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="210.598 117.75"
- to="209.85 117.75" />
- <animateTransform
- begin="r813.begin"
- id="t813"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="209.85 117.75"
- to="209.103 117.75" />
- <animateTransform
- begin="r812.begin"
- id="t812"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="209.103 117.75"
- to="208.356 117.75" />
- <animateTransform
- begin="r811.begin"
- id="t811"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="208.356 117.75"
- to="207.609 117.75" />
- <animateTransform
- begin="r810.begin"
- id="t810"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="207.609 117.75"
- to="206.489 117.75" />
- <animateTransform
- begin="r809.begin"
- id="t809"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="206.489 117.75"
- to="204.994 117.75" />
- <animateTransform
- begin="r808.begin"
- id="t808"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="204.994 117.75"
- to="203.5 117.75" />
- <animateTransform
- begin="r807.begin"
- id="t807"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="203.5 117.75"
- to="202.006 117.75" />
- <animateTransform
- begin="r806.begin"
- id="t806"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="202.006 117.75"
- to="200.512 117.75" />
- <animateTransform
- begin="r805.begin"
- id="t805"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="200.512 117.75"
- to="199.018 117.75" />
- <animateTransform
- begin="r804.begin"
- id="t804"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="199.018 117.75"
- to="197.897 117.75" />
- <animateTransform
- begin="r803.begin"
- id="t803"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="197.897 117.75"
- to="197.15 117.75" />
- <animateTransform
- begin="r802.begin"
- id="t802"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="197.15 117.75"
- to="196.403 117.75" />
- <animateTransform
- begin="r801.begin"
- id="t801"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="196.403 117.75"
- to="195.656 117.75" />
- <animateTransform
- begin="r800.begin"
- id="t800"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="195.656 117.75"
- to="194.909 117.75" />
- <animateTransform
- begin="r799.begin"
- id="t799"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="194.909 117.75"
- to="194.162 117.75" />
- <animateTransform
- begin="r798.begin"
- id="t798"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="194.162 117.75"
- to="193.415 117.75" />
- <animateTransform
- begin="r797.begin"
- id="t797"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="193.415 117.75"
- to="192.668 117.75" />
- <animateTransform
- begin="r796.begin"
- id="t796"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="192.668 117.75"
- to="191.921 117.75" />
- <animateTransform
- begin="r795.begin"
- id="t795"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="191.921 117.75"
- to="191.174 117.75" />
- <animateTransform
- begin="r794.begin"
- id="t794"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="191.174 117.75"
- to="190.427 117.75" />
- <animateTransform
- begin="r793.begin"
- id="t793"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="190.427 117.75"
- to="189.68 117.75" />
- <animateTransform
- begin="r792.begin"
- id="t792"
- attributeName="transform"
- type="translate"
- dur="0.184695s"
- from="189.68 117.75"
- to="188.932 117.75" />
- <animateTransform
- begin="r791.begin"
- id="t791"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="188.932 117.75"
- to="188.185 117.75" />
- <animateTransform
- begin="r790.begin"
- id="t790"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="188.185 117.75"
- to="187.065 117.75" />
- <animateTransform
- begin="r789.begin"
- id="t789"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="187.065 117.75"
- to="185.571 117.75" />
- <animateTransform
- begin="r788.begin"
- id="t788"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="185.571 117.75"
- to="184.077 117.75" />
- <animateTransform
- begin="r787.begin"
- id="t787"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="184.077 117.75"
- to="182.582 117.75" />
- <animateTransform
- begin="r786.begin"
- id="t786"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="182.582 117.75"
- to="181.088 117.75" />
- <animateTransform
- begin="r785.begin"
- id="t785"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="181.088 117.75"
- to="179.594 117.75" />
- <animateTransform
- begin="r784.begin"
- id="t784"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="179.594 117.75"
- to="178.1 117.75" />
- <animateTransform
- begin="r783.begin"
- id="t783"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="178.1 117.75"
- to="176.606 117.75" />
- <animateTransform
- begin="r782.begin"
- id="t782"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="176.606 117.75"
- to="175.485 117.75" />
- <animateTransform
- begin="r781.begin"
- id="t781"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="175.485 117.75"
- to="174.738 117.75" />
- <animateTransform
- begin="r780.begin"
- id="t780"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="174.738 117.75"
- to="173.991 117.75" />
- <animateTransform
- begin="r779.begin"
- id="t779"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="173.991 117.75"
- to="173.244 117.75" />
- <animateTransform
- begin="r778.begin"
- id="t778"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="173.244 117.75"
- to="172.497 117.75" />
- <animateTransform
- begin="r777.begin"
- id="t777"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="172.497 117.75"
- to="171.75 117.75" />
- <animateTransform
- begin="r776.begin"
- id="t776"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="171.75 117.75"
- to="171.003 117.75" />
- <animateTransform
- begin="r775.begin"
- id="t775"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="171.003 117.75"
- to="170.256 117.75" />
- <animateTransform
- begin="r774.begin"
- id="t774"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="170.256 117.75"
- to="169.509 117.75" />
- <animateTransform
- begin="r773.begin"
- id="t773"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="169.509 117.75"
- to="168.762 117.75" />
- <animateTransform
- begin="r772.begin"
- id="t772"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="168.762 117.75"
- to="168.015 117.75" />
- <animateTransform
- begin="r771.begin"
- id="t771"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="168.015 117.75"
- to="167.267 117.75" />
- <animateTransform
- begin="r770.begin"
- id="t770"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="167.267 117.75"
- to="166.52 117.75" />
- <animateTransform
- begin="r769.begin"
- id="t769"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="166.52 117.75"
- to="165.773 117.75" />
- <animateTransform
- begin="r768.begin"
- id="t768"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="165.773 117.75"
- to="165.026 117.75" />
- <animateTransform
- begin="r767.begin"
- id="t767"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="165.026 117.75"
- to="164.279 117.75" />
- <animateTransform
- begin="r766.begin"
- id="t766"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="164.279 117.75"
- to="163.532 117.75" />
- <animateTransform
- begin="r765.begin"
- id="t765"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="163.532 117.75"
- to="162.785 117.75" />
- <animateTransform
- begin="r764.begin"
- id="t764"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="162.785 117.75"
- to="162.038 117.75" />
- <animateTransform
- begin="r763.begin"
- id="t763"
- attributeName="transform"
- type="translate"
- dur="0.184695s"
- from="162.038 117.75"
- to="161.291 117.75" />
- <animateTransform
- begin="r762.begin"
- id="t762"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="161.291 117.75"
- to="160.17 117.75" />
- <animateTransform
- begin="r761.begin"
- id="t761"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="160.17 117.75"
- to="158.676 117.75" />
- <animateTransform
- begin="r760.begin"
- id="t760"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="158.676 117.75"
- to="157.182 117.75" />
- <animateTransform
- begin="r759.begin"
- id="t759"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="157.182 117.75"
- to="155.688 117.75" />
- <animateTransform
- begin="r758.begin"
- id="t758"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="155.688 117.75"
- to="154.194 117.75" />
- <animateTransform
- begin="r757.begin"
- id="t757"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="154.194 117.75"
- to="152.7 117.75" />
- <animateTransform
- begin="r756.begin"
- id="t756"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="152.7 117.75"
- to="151.205 117.75" />
- <animateTransform
- begin="r755.begin"
- id="t755"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="151.205 117.75"
- to="149.711 117.75" />
- <animateTransform
- begin="r754.begin"
- id="t754"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="149.711 117.75"
- to="148.217 117.75" />
- <animateTransform
- begin="r753.begin"
- id="t753"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="148.217 117.75"
- to="146.723 117.75" />
- <animateTransform
- begin="r752.begin"
- id="t752"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="146.723 117.75"
- to="145.229 117.75" />
- <animateTransform
- begin="r751.begin"
- id="t751"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="145.229 117.75"
- to="144.108 117.75" />
- <animateTransform
- begin="r750.begin"
- id="t750"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="144.108 117.75"
- to="143.361 117.75" />
- <animateTransform
- begin="r749.begin"
- id="t749"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="143.361 117.75"
- to="142.614 117.75" />
- <animateTransform
- begin="r748.begin"
- id="t748"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="142.614 117.75"
- to="141.867 117.75" />
- <animateTransform
- begin="r747.begin"
- id="t747"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="141.867 117.75"
- to="141.12 117.75" />
- <animateTransform
- begin="r746.begin"
- id="t746"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="141.12 117.75"
- to="140.373 117.75" />
- <animateTransform
- begin="r745.begin"
- id="t745"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="140.373 117.75"
- to="139.626 117.75" />
- <animateTransform
- begin="r744.begin"
- id="t744"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="139.626 117.75"
- to="138.879 117.75" />
- <animateTransform
- begin="r743.begin"
- id="t743"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="138.879 117.75"
- to="138.132 117.75" />
- <animateTransform
- begin="r742.begin"
- id="t742"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="138.132 117.75"
- to="137.385 117.75" />
- <animateTransform
- begin="r741.begin"
- id="t741"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="137.385 117.75"
- to="136.638 117.75" />
- <animateTransform
- begin="r740.begin"
- id="t740"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="136.638 117.75"
- to="135.89 117.75" />
- <animateTransform
- begin="r739.begin"
- id="t739"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="135.89 117.75"
- to="135.143 117.75" />
- <animateTransform
- begin="r738.begin"
- id="t738"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="135.143 117.75"
- to="134.396 117.75" />
- <animateTransform
- begin="r737.begin"
- id="t737"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="134.396 117.75"
- to="133.649 117.75" />
- <animateTransform
- begin="r736.begin"
- id="t736"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="133.649 117.75"
- to="132.902 117.75" />
- <animateTransform
- begin="r735.begin"
- id="t735"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="132.902 117.75"
- to="132.155 117.75" />
- <animateTransform
- begin="r734.begin"
- id="t734"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="132.155 117.75"
- to="131.595 117.75" />
- <animateTransform
- begin="r733.begin"
- id="t733"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="131.595 117.75"
- to="131.221 117.75" />
- <animateTransform
- begin="r732.begin"
- id="t732"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="131.221 117.75"
- to="130.661 117.75" />
- <animateTransform
- begin="r731.begin"
- id="t731"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="130.661 117.75"
- to="129.914 117.75" />
- <animateTransform
- begin="r730.begin"
- id="t730"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="129.914 117.75"
- to="129.354 117.75" />
- <animateTransform
- begin="r729.begin"
- id="t729"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="129.354 117.75"
- to="128.98 117.75" />
- <animateTransform
- begin="r728.begin"
- id="t728"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="128.98 117.75"
- to="128.607 117.75" />
- <animateTransform
- begin="r727.begin"
- id="t727"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="128.607 117.75"
- to="128.233 117.75" />
- <animateTransform
- begin="r726.begin"
- id="t726"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="128.233 117.75"
- to="127.673 117.75" />
- <animateTransform
- begin="r725.begin"
- id="t725"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="127.673 117.75"
- to="126.926 117.75" />
- <animateTransform
- begin="r724.begin"
- id="t724"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="126.926 117.75"
- to="126.365 117.75" />
- <animateTransform
- begin="r723.begin"
- id="t723"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="126.365 117.75"
- to="125.992 117.75" />
- <animateTransform
- begin="r722.begin"
- id="t722"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="125.992 117.75"
- to="125.618 117.75" />
- <animateTransform
- begin="r721.begin"
- id="t721"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="125.618 117.75"
- to="125.245 117.75" />
- <animateTransform
- begin="r720.begin"
- id="t720"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="125.245 117.75"
- to="124.871 117.75" />
- <animateTransform
- begin="r719.begin"
- id="t719"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="124.871 117.75"
- to="124.498 117.75" />
- <animateTransform
- begin="r718.begin"
- id="t718"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="124.498 117.75"
- to="123.937 117.75" />
- <animateTransform
- begin="r717.begin"
- id="t717"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="123.937 117.75"
- to="123.19 117.75" />
- <animateTransform
- begin="r716.begin"
- id="t716"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="123.19 117.75"
- to="122.63 117.75" />
- <animateTransform
- begin="r715.begin"
- id="t715"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="122.63 117.75"
- to="122.256 117.75" />
- <animateTransform
- begin="r714.begin"
- id="t714"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="122.256 117.75"
- to="121.883 117.75" />
- <animateTransform
- begin="r713.begin"
- id="t713"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="121.883 117.75"
- to="121.509 117.75" />
- <animateTransform
- begin="r712.begin"
- id="t712"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="121.509 117.75"
- to="121.136 117.75" />
- <animateTransform
- begin="r711.begin"
- id="t711"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="121.136 117.75"
- to="120.762 117.75" />
- <animateTransform
- begin="r710.begin"
- id="t710"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="120.762 117.75"
- to="120.202 117.75" />
- <animateTransform
- begin="r709.begin"
- id="t709"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="120.202 117.75"
- to="119.455 117.75" />
- <animateTransform
- begin="r708.begin"
- id="t708"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="119.455 117.75"
- to="118.895 117.75" />
- <animateTransform
- begin="r707.begin"
- id="t707"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="118.895 117.75"
- to="118.521 117.75" />
- <animateTransform
- begin="r706.begin"
- id="t706"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="118.521 117.75"
- to="118.148 117.75" />
- <animateTransform
- begin="r705.begin"
- id="t705"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="118.148 117.75"
- to="117.774 117.75" />
- <animateTransform
- begin="r704.begin"
- id="t704"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="117.774 117.75"
- to="117.4 117.75" />
- <animateTransform
- begin="r703.begin"
- id="t703"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="117.4 117.75"
- to="117.027 117.75" />
- <animateTransform
- begin="r702.begin"
- id="t702"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="117.027 117.75"
- to="116.653 117.75" />
- <animateTransform
- begin="r701.begin"
- id="t701"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="116.653 117.75"
- to="116.28 117.75" />
- <animateTransform
- begin="r700.begin"
- id="t700"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="116.28 117.75"
- to="115.72 117.75" />
- <animateTransform
- begin="r699.begin"
- id="t699"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="115.72 117.75"
- to="114.973 117.75" />
- <animateTransform
- begin="r698.begin"
- id="t698"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="114.973 117.75"
- to="114.225 117.75" />
- <animateTransform
- begin="r697.begin"
- id="t697"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="114.225 117.75"
- to="113.665 117.75" />
- <animateTransform
- begin="r696.begin"
- id="t696"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="113.665 117.75"
- to="113.292 117.75" />
- <animateTransform
- begin="r695.begin"
- id="t695"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="113.292 117.75"
- to="112.918 117.75" />
- <animateTransform
- begin="r694.begin"
- id="t694"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="112.918 117.75"
- to="112.545 117.75" />
- <animateTransform
- begin="r693.begin"
- id="t693"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="112.545 117.75"
- to="112.171 117.75" />
- <animateTransform
- begin="r692.begin"
- id="t692"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="112.171 117.75"
- to="111.797 117.75" />
- <animateTransform
- begin="r691.begin"
- id="t691"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="111.797 117.75"
- to="111.424 117.75" />
- <animateTransform
- begin="r690.begin"
- id="t690"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="111.424 117.75"
- to="111.05 117.75" />
- <animateTransform
- begin="r689.begin"
- id="t689"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="111.05 117.75"
- to="110.49 117.75" />
- <animateTransform
- begin="r688.begin"
- id="t688"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="110.49 117.75"
- to="109.743 117.75" />
- <animateTransform
- begin="r687.begin"
- id="t687"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="109.743 117.75"
- to="108.996 117.75" />
- <animateTransform
- begin="r686.begin"
- id="t686"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="108.996 117.75"
- to="108.436 117.75" />
- <animateTransform
- begin="r685.begin"
- id="t685"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="108.436 117.75"
- to="108.062 117.75" />
- <animateTransform
- begin="r684.begin"
- id="t684"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="108.062 117.75"
- to="107.689 117.75" />
- <animateTransform
- begin="r683.begin"
- id="t683"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="107.689 117.75"
- to="107.315 117.75" />
- <animateTransform
- begin="r682.begin"
- id="t682"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="107.315 117.75"
- to="106.942 117.75" />
- <animateTransform
- begin="r681.begin"
- id="t681"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="106.942 117.75"
- to="106.568 117.75" />
- <animateTransform
- begin="r680.begin"
- id="t680"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="106.568 117.75"
- to="106.194 117.75" />
- <animateTransform
- begin="r679.begin"
- id="t679"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="106.194 117.75"
- to="105.821 117.75" />
- <animateTransform
- begin="r678.begin"
- id="t678"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="105.821 117.75"
- to="105.261 117.75" />
- <animateTransform
- begin="r677.begin"
- id="t677"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="105.261 117.75"
- to="104.514 117.75" />
- <animateTransform
- begin="r676.begin"
- id="t676"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="104.514 117.75"
- to="103.766 117.75" />
- <animateTransform
- begin="r675.begin"
- id="t675"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="103.766 117.75"
- to="103.206 117.75" />
- <animateTransform
- begin="r674.begin"
- id="t674"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="103.206 117.75"
- to="102.833 117.75" />
- <animateTransform
- begin="r673.begin"
- id="t673"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="102.833 117.75"
- to="102.552 117.75" />
- <animateTransform
- begin="r672.begin"
- id="t672"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="102.552 117.75"
- to="102.366 117.75" />
- <animateTransform
- begin="r671.begin"
- id="t671"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="102.366 117.75"
- to="102.086 117.75" />
- <animateTransform
- begin="r670.begin"
- id="t670"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="102.086 117.75"
- to="101.712 117.75" />
- <animateTransform
- begin="r669.begin"
- id="t669"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="101.712 117.75"
- to="101.338 117.75" />
- <animateTransform
- begin="r668.begin"
- id="t668"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="101.338 117.75"
- to="100.965 117.75" />
- <animateTransform
- begin="r667.begin"
- id="t667"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="100.965 117.75"
- to="100.591 117.75" />
- <animateTransform
- begin="r666.begin"
- id="t666"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="100.591 117.75"
- to="100.218 117.75" />
- <animateTransform
- begin="r665.begin"
- id="t665"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="100.218 117.75"
- to="99.8443 117.75" />
- <animateTransform
- begin="r664.begin"
- id="t664"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="99.8443 117.75"
- to="99.4708 117.75" />
- <animateTransform
- begin="r663.begin"
- id="t663"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="99.4708 117.75"
- to="99.0973 117.75" />
- <animateTransform
- begin="r662.begin"
- id="t662"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="99.0973 117.75"
- to="98.537 117.75" />
- <animateTransform
- begin="r661.begin"
- id="t661"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="98.537 117.75"
- to="97.7899 117.75" />
- <animateTransform
- begin="r660.begin"
- id="t660"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="97.7899 117.75"
- to="97.2296 117.75" />
- <animateTransform
- begin="r659.begin"
- id="t659"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="97.2296 117.75"
- to="96.8561 117.75" />
- <animateTransform
- begin="r658.begin"
- id="t658"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="96.8561 117.75"
- to="96.4825 117.75" />
- <animateTransform
- begin="r657.begin"
- id="t657"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="96.4825 117.75"
- to="96.109 117.75" />
- <animateTransform
- begin="r656.begin"
- id="t656"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="96.109 117.75"
- to="95.8288 117.75" />
- <animateTransform
- begin="r655.begin"
- id="t655"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="95.8288 117.75"
- to="95.6421 117.75" />
- <animateTransform
- begin="r654.begin"
- id="t654"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="95.6421 117.75"
- to="95.3619 117.75" />
- <animateTransform
- begin="r653.begin"
- id="t653"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="95.3619 117.75"
- to="94.9884 117.75" />
- <animateTransform
- begin="r652.begin"
- id="t652"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="94.9884 117.75"
- to="94.6149 117.75" />
- <animateTransform
- begin="r651.begin"
- id="t651"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="94.6149 117.75"
- to="94.2413 117.75" />
- <animateTransform
- begin="r650.begin"
- id="t650"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="94.2413 117.75"
- to="93.8678 117.75" />
- <animateTransform
- begin="r649.begin"
- id="t649"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="93.8678 117.75"
- to="93.4942 117.75" />
- <animateTransform
- begin="r648.begin"
- id="t648"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="93.4942 117.75"
- to="93.1207 117.75" />
- <animateTransform
- begin="r647.begin"
- id="t647"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="93.1207 117.75"
- to="92.7472 117.75" />
- <animateTransform
- begin="r646.begin"
- id="t646"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="92.7472 117.75"
- to="92.3736 117.75" />
- <animateTransform
- begin="r645.begin"
- id="t645"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="92.3736 117.75"
- to="92.0001 117.75" />
- <animateTransform
- begin="r644.begin"
- id="t644"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="92.0001 117.75"
- to="91.6266 117.75" />
- <animateTransform
- begin="r643.begin"
- id="t643"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="91.6266 117.75"
- to="91.0663 117.75" />
- <animateTransform
- begin="r642.begin"
- id="t642"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="91.0663 117.75"
- to="90.506 117.75" />
- <animateTransform
- begin="r641.begin"
- id="t641"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="90.506 117.75"
- to="90.1324 117.75" />
- <animateTransform
- begin="r640.begin"
- id="t640"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="90.1324 117.75"
- to="89.7589 117.75" />
- <animateTransform
- begin="r639.begin"
- id="t639"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="89.7589 117.75"
- to="89.3854 117.75" />
- <animateTransform
- begin="r638.begin"
- id="t638"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="89.3854 117.75"
- to="89.0118 117.75" />
- <animateTransform
- begin="r637.begin"
- id="t637"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="89.0118 117.75"
- to="88.6383 117.75" />
- <animateTransform
- begin="r636.begin"
- id="t636"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="88.6383 117.75"
- to="88.3581 117.75" />
- <animateTransform
- begin="r635.begin"
- id="t635"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="88.3581 117.75"
- to="88.1714 117.75" />
- <animateTransform
- begin="r634.begin"
- id="t634"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="88.1714 117.75"
- to="87.8912 117.75" />
- <animateTransform
- begin="r633.begin"
- id="t633"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="87.8912 117.75"
- to="87.5177 117.75" />
- <animateTransform
- begin="r632.begin"
- id="t632"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="87.5177 117.75"
- to="87.1442 117.75" />
- <animateTransform
- begin="r631.begin"
- id="t631"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="87.1442 117.75"
- to="86.7706 117.75" />
- <animateTransform
- begin="r630.begin"
- id="t630"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="86.7706 117.75"
- to="86.3971 117.75" />
- <animateTransform
- begin="r629.begin"
- id="t629"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="86.3971 117.75"
- to="86.0235 117.75" />
- <animateTransform
- begin="r628.begin"
- id="t628"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="86.0235 117.75"
- to="85.65 117.75" />
- <animateTransform
- begin="r627.begin"
- id="t627"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="85.65 117.75"
- to="85.2765 117.75" />
- <animateTransform
- begin="r626.begin"
- id="t626"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="85.2765 117.75"
- to="84.9029 117.75" />
- <animateTransform
- begin="r625.begin"
- id="t625"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="84.9029 117.75"
- to="84.5294 117.75" />
- <animateTransform
- begin="r624.begin"
- id="t624"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="84.5294 117.75"
- to="84.1559 117.75" />
- <animateTransform
- begin="r623.begin"
- id="t623"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="84.1559 117.75"
- to="83.5956 117.75" />
- <animateTransform
- begin="r622.begin"
- id="t622"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="83.5956 117.75"
- to="83.0353 117.75" />
- <animateTransform
- begin="r621.begin"
- id="t621"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="83.0353 117.75"
- to="82.6617 117.75" />
- <animateTransform
- begin="r620.begin"
- id="t620"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="82.6617 117.75"
- to="82.2882 117.75" />
- <animateTransform
- begin="r619.begin"
- id="t619"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="82.2882 117.75"
- to="82.008 117.75" />
- <animateTransform
- begin="r618.begin"
- id="t618"
- attributeName="transform"
- type="translate"
- dur="0.0461738s"
- from="82.008 117.75"
- to="82.1948 117.75" />
- <animateTransform
- begin="r617.begin"
- id="t617"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="82.1948 117.75"
- to="82.3816 117.75" />
- <animateTransform
- begin="r616.begin"
- id="t616"
- attributeName="transform"
- type="translate"
- dur="0.0692607s"
- from="82.3816 117.75"
- to="82.6617 117.75" />
- <animateTransform
- begin="r615.begin"
- id="t615"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="82.6617 117.75"
- to="83.0353 117.75" />
- <animateTransform
- begin="r614.begin"
- id="t614"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="83.0353 117.75"
- to="83.5956 117.75" />
- <animateTransform
- begin="r613.begin"
- id="t613"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="83.5956 117.75"
- to="84.3426 117.75" />
- <animateTransform
- begin="r612.begin"
- id="t612"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="84.3426 117.75"
- to="85.0897 117.75" />
- <animateTransform
- begin="r611.begin"
- id="t611"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="85.0897 117.75"
- to="85.8368 117.75" />
- <animateTransform
- begin="r610.begin"
- id="t610"
- attributeName="transform"
- type="translate"
- dur="0.461738s"
- from="85.8368 117.75"
- to="87.7045 117.75" />
- <animateTransform
- begin="r609.begin"
- id="t609"
- attributeName="transform"
- type="translate"
- dur="0.0622559s"
- from="87.7045 117.75"
- to="89.9457 117.75" />
- <animateTransform
- begin="r608.begin"
- id="t608"
- attributeName="transform"
- type="translate"
- dur="0.18816s"
- from="89.9457 117.75"
- to="91.4398 117.75" />
- <animateTransform
- begin="r607.begin"
- id="t607"
- attributeName="transform"
- type="translate"
- dur="0.554085s"
- from="91.4398 117.75"
- to="93.681 117.75" />
- <animateTransform
- begin="r606.begin"
- id="t606"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="93.681 117.75"
- to="96.6693 117.75" />
- <animateTransform
- begin="r605.begin"
- id="t605"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="96.6693 117.75"
- to="99.6576 117.75" />
- <animateTransform
- begin="r604.begin"
- id="t604"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="99.6576 117.75"
- to="102.646 117.75" />
- <animateTransform
- begin="r603.begin"
- id="t603"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="102.646 117.75"
- to="105.634 117.75" />
- <animateTransform
- begin="r602.begin"
- id="t602"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="105.634 117.75"
- to="108.622 117.75" />
- <animateTransform
- begin="r601.begin"
- id="t601"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="108.622 117.75"
- to="111.611 117.75" />
- <animateTransform
- begin="r600.begin"
- id="t600"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="111.611 117.75"
- to="114.599 117.75" />
- <animateTransform
- begin="r599.begin"
- id="t599"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="114.599 117.75"
- to="117.587 117.75" />
- <animateTransform
- begin="r598.begin"
- id="t598"
- attributeName="transform"
- type="translate"
- dur="0.193797s"
- from="117.587 117.75"
- to="119.828 117.75" />
- <animateTransform
- begin="r597.begin"
- id="t597"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="119.828 117.75"
- to="121.323 117.75" />
- <animateTransform
- begin="r596.begin"
- id="t596"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="121.323 117.75"
- to="122.817 117.75" />
- <animateTransform
- begin="r595.begin"
- id="t595"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="122.817 117.75"
- to="124.311 117.75" />
- <animateTransform
- begin="r594.begin"
- id="t594"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="124.311 117.75"
- to="125.805 117.75" />
- <animateTransform
- begin="r593.begin"
- id="t593"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="125.805 117.75"
- to="127.299 117.75" />
- <animateTransform
- begin="r592.begin"
- id="t592"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="127.299 117.75"
- to="128.793 117.75" />
- <animateTransform
- begin="r591.begin"
- id="t591"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="128.793 117.75"
- to="130.287 117.75" />
- <animateTransform
- begin="r590.begin"
- id="t590"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="130.287 117.75"
- to="131.782 117.75" />
- <animateTransform
- begin="r589.begin"
- id="t589"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="131.782 117.75"
- to="133.276 117.75" />
- <animateTransform
- begin="r588.begin"
- id="t588"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="133.276 117.75"
- to="134.77 117.75" />
- <animateTransform
- begin="r587.begin"
- id="t587"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="134.77 117.75"
- to="135.89 117.75" />
- <animateTransform
- begin="r586.begin"
- id="t586"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="135.89 117.75"
- to="136.638 117.75" />
- <animateTransform
- begin="r585.begin"
- id="t585"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="136.638 117.75"
- to="137.385 117.75" />
- <animateTransform
- begin="r584.begin"
- id="t584"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="137.385 117.75"
- to="138.132 117.75" />
- <animateTransform
- begin="r583.begin"
- id="t583"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="138.132 117.75"
- to="138.879 117.75" />
- <animateTransform
- begin="r582.begin"
- id="t582"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="138.879 117.75"
- to="139.626 117.75" />
- <animateTransform
- begin="r581.begin"
- id="t581"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="139.626 117.75"
- to="140.373 117.75" />
- <animateTransform
- begin="r580.begin"
- id="t580"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="140.373 117.75"
- to="141.12 117.75" />
- <animateTransform
- begin="r579.begin"
- id="t579"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="141.12 117.75"
- to="141.867 117.75" />
- <animateTransform
- begin="r578.begin"
- id="t578"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="141.867 117.75"
- to="142.427 117.75" />
- <animateTransform
- begin="r577.begin"
- id="t577"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="142.427 117.75"
- to="142.801 117.75" />
- <animateTransform
- begin="r576.begin"
- id="t576"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="142.801 117.75"
- to="143.174 117.75" />
- <animateTransform
- begin="r575.begin"
- id="t575"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="143.174 117.75"
- to="143.548 117.75" />
- <animateTransform
- begin="r574.begin"
- id="t574"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="143.548 117.75"
- to="143.921 117.75" />
- <animateTransform
- begin="r573.begin"
- id="t573"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="143.921 117.75"
- to="144.202 117.75" />
- <animateTransform
- begin="r572.begin"
- id="t572"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="144.202 117.75"
- to="144.388 117.75" />
- <animateTransform
- begin="r571.begin"
- id="t571"
- attributeName="transform"
- type="translate"
- dur="0.115434s"
- from="144.388 117.75"
- to="144.855 117.75" />
- <animateTransform
- begin="r570.begin"
- id="t570"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="144.855 117.75"
- to="145.602 117.75" />
- <animateTransform
- begin="r569.begin"
- id="t569"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="145.602 117.75"
- to="146.349 117.75" />
- <animateTransform
- begin="r568.begin"
- id="t568"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="146.349 117.75"
- to="147.097 117.75" />
- <animateTransform
- begin="r567.begin"
- id="t567"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="147.097 117.75"
- to="147.844 117.75" />
- <animateTransform
- begin="r566.begin"
- id="t566"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="147.844 117.75"
- to="148.591 117.75" />
- <animateTransform
- begin="r565.begin"
- id="t565"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="148.591 117.75"
- to="149.338 117.75" />
- <animateTransform
- begin="r564.begin"
- id="t564"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="149.338 117.75"
- to="150.085 117.75" />
- <animateTransform
- begin="r563.begin"
- id="t563"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="150.085 117.75"
- to="150.832 117.75" />
- <animateTransform
- begin="r562.begin"
- id="t562"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="150.832 117.75"
- to="151.579 117.75" />
- <animateTransform
- begin="r561.begin"
- id="t561"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="151.579 117.75"
- to="152.326 117.75" />
- <animateTransform
- begin="r560.begin"
- id="t560"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="152.326 117.75"
- to="153.073 117.75" />
- <animateTransform
- begin="r559.begin"
- id="t559"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="153.073 117.75"
- to="154.194 117.75" />
- <animateTransform
- begin="r558.begin"
- id="t558"
- attributeName="transform"
- type="translate"
- dur="0.372293s"
- from="154.194 117.75"
- to="156.435 117.75" />
- <animateTransform
- begin="r557.begin"
- id="t557"
- attributeName="transform"
- type="translate"
- dur="0.124512s"
- from="156.435 117.75"
- to="160.917 117.75" />
- <animateTransform
- begin="r556.begin"
- id="t556"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="160.917 117.75"
- to="166.894 117.75" />
- <animateTransform
- begin="r555.begin"
- id="t555"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="166.894 117.75"
- to="172.87 117.75" />
- <animateTransform
- begin="r554.begin"
- id="t554"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="172.87 117.75"
- to="178.847 117.75" />
- <animateTransform
- begin="r553.begin"
- id="t553"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="178.847 117.75"
- to="184.824 117.75" />
- <animateTransform
- begin="r552.begin"
- id="t552"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="184.824 117.75"
- to="190.8 117.75" />
- <animateTransform
- begin="r551.begin"
- id="t551"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="190.8 117.75"
- to="196.777 117.75" />
- <animateTransform
- begin="r550.begin"
- id="t550"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="196.777 117.75"
- to="202.753 117.75" />
- <animateTransform
- begin="r549.begin"
- id="t549"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="202.753 117.75"
- to="208.73 117.75" />
- <animateTransform
- begin="r548.begin"
- id="t548"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="208.73 117.75"
- to="214.706 117.75" />
- <animateTransform
- begin="r547.begin"
- id="t547"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="214.706 117.75"
- to="220.683 117.75" />
- <animateTransform
- begin="r546.begin"
- id="t546"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="220.683 117.75"
- to="226.66 117.75" />
- <animateTransform
- begin="r545.begin"
- id="t545"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="226.66 117.75"
- to="232.636 117.75" />
- <animateTransform
- begin="r544.begin"
- id="t544"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="232.636 117.75"
- to="238.613 117.75" />
- <animateTransform
- begin="r543.begin"
- id="t543"
- attributeName="transform"
- type="translate"
- dur="0.124512s"
- from="238.613 117.75"
- to="243.095 117.75" />
- <animateTransform
- begin="r542.begin"
- id="t542"
- attributeName="transform"
- type="translate"
- dur="0.37632s"
- from="243.095 117.75"
- to="246.083 117.75" />
- <animateTransform
- begin="r541.begin"
- id="t541"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="246.083 117.75"
- to="249.072 117.75" />
- <animateTransform
- begin="r540.begin"
- id="t540"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="249.072 117.75"
- to="252.06 117.75" />
- <animateTransform
- begin="r539.begin"
- id="t539"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="252.06 117.75"
- to="255.048 117.75" />
- <animateTransform
- begin="r538.begin"
- id="t538"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="255.048 117.75"
- to="258.036 117.75" />
- <animateTransform
- begin="r537.begin"
- id="t537"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="258.036 117.75"
- to="261.025 117.75" />
- <animateTransform
- begin="r536.begin"
- id="t536"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="261.025 117.75"
- to="264.013 117.75" />
- <animateTransform
- begin="r535.begin"
- id="t535"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="264.013 117.75"
- to="267.001 117.75" />
- <animateTransform
- begin="r534.begin"
- id="t534"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="267.001 117.75"
- to="269.99 117.75" />
- <animateTransform
- begin="r533.begin"
- id="t533"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="269.99 117.75"
- to="272.978 117.75" />
- <animateTransform
- begin="r532.begin"
- id="t532"
- attributeName="transform"
- type="translate"
- dur="0.193797s"
- from="272.978 117.75"
- to="275.219 117.75" />
- <animateTransform
- begin="r531.begin"
- id="t531"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="275.219 117.75"
- to="276.713 117.75" />
- <animateTransform
- begin="r530.begin"
- id="t530"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="276.713 117.75"
- to="278.207 117.75" />
- <animateTransform
- begin="r529.begin"
- id="t529"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="278.207 117.75"
- to="279.702 117.75" />
- <animateTransform
- begin="r528.begin"
- id="t528"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="279.702 117.75"
- to="281.196 117.75" />
- <animateTransform
- begin="r527.begin"
- id="t527"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="281.196 117.75"
- to="282.69 117.75" />
- <animateTransform
- begin="r526.begin"
- id="t526"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="282.69 117.75"
- to="284.184 117.75" />
- <animateTransform
- begin="r525.begin"
- id="t525"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="284.184 117.75"
- to="285.678 117.75" />
- <animateTransform
- begin="r524.begin"
- id="t524"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="285.678 117.75"
- to="287.172 117.75" />
- <animateTransform
- begin="r523.begin"
- id="t523"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="287.172 117.75"
- to="288.666 117.75" />
- <animateTransform
- begin="r522.begin"
- id="t522"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="288.666 117.75"
- to="290.161 117.75" />
- <animateTransform
- begin="r521.begin"
- id="t521"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="290.161 117.75"
- to="291.655 117.75" />
- <animateTransform
- begin="r520.begin"
- id="t520"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="291.655 117.75"
- to="293.149 117.75" />
- <animateTransform
- begin="r519.begin"
- id="t519"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="293.149 117.75"
- to="294.643 117.75" />
- <animateTransform
- begin="r518.begin"
- id="t518"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="294.643 117.75"
- to="296.137 117.75" />
- <animateTransform
- begin="r517.begin"
- id="t517"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="296.137 117.75"
- to="297.631 117.75" />
- <animateTransform
- begin="r516.begin"
- id="t516"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="297.631 117.75"
- to="299.125 117.75" />
- <animateTransform
- begin="r515.begin"
- id="t515"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="299.125 117.75"
- to="300.619 117.75" />
- <animateTransform
- begin="r514.begin"
- id="t514"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="300.619 117.75"
- to="302.114 117.75" />
- <animateTransform
- begin="r513.begin"
- id="t513"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="302.114 117.75"
- to="303.608 117.75" />
- <animateTransform
- begin="r512.begin"
- id="t512"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="303.608 117.75"
- to="305.102 117.75" />
- <animateTransform
- begin="r511.begin"
- id="t511"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="305.102 117.75"
- to="306.596 117.75" />
- <animateTransform
- begin="r510.begin"
- id="t510"
- attributeName="transform"
- type="translate"
- dur="0.210826s"
- from="306.596 117.75"
- to="310.331 117.75" />
- <animateTransform
- begin="r509.begin"
- id="t509"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="310.331 117.75"
- to="316.308 117.75" />
- <animateTransform
- begin="r508.begin"
- id="t508"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="316.308 117.75"
- to="322.285 117.75" />
- <animateTransform
- begin="r507.begin"
- id="t507"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="322.285 117.75"
- to="328.261 117.75" />
- <animateTransform
- begin="r506.begin"
- id="t506"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="328.261 117.75"
- to="334.238 117.75" />
- <animateTransform
- begin="r505.begin"
- id="t505"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="334.238 117.75"
- to="340.214 117.75" />
- <animateTransform
- begin="r504.begin"
- id="t504"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="340.214 117.75"
- to="346.191 117.75" />
- <animateTransform
- begin="r503.begin"
- id="t503"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="346.191 117.75"
- to="352.167 117.75" />
- <animateTransform
- begin="r502.begin"
- id="t502"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="352.167 117.75"
- to="358.144 117.75" />
- <animateTransform
- begin="r501.begin"
- id="t501"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="358.144 117.75"
- to="364.12 117.75" />
- <animateTransform
- begin="r500.begin"
- id="t500"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="364.12 117.75"
- to="370.097 117.75" />
- <animateTransform
- begin="r499.begin"
- id="t499"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="370.097 117.75"
- to="376.074 117.75" />
- <animateTransform
- begin="r498.begin"
- id="t498"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="376.074 117.75"
- to="382.05 117.75" />
- <animateTransform
- begin="r497.begin"
- id="t497"
- attributeName="transform"
- type="translate"
- dur="0.75264s"
- from="382.05 117.75"
- to="388.027 117.75" />
- <animateTransform
- begin="r496.begin"
- id="t496"
- attributeName="transform"
- type="translate"
- dur="0.249023s"
- from="388.027 117.75"
- to="396.992 117.75" />
- <animateTransform
- begin="r495.begin"
- id="t495"
- attributeName="transform"
- type="translate"
- dur="1.66226s"
- from="396.992 117.75"
- to="403.715 117.75" />
- <animateTransform
- begin="r494.begin"
- id="t494"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="403.715 117.75"
- to="405.209 117.75" />
- <animateTransform
- begin="r493.begin"
- id="t493"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="405.209 117.75"
- to="406.703 117.75" />
- <animateTransform
- begin="r492.begin"
- id="t492"
- attributeName="transform"
- type="translate"
- dur="0.18816s"
- from="406.703 117.75"
- to="408.198 117.75" />
- <animateTransform
- begin="r491.begin"
- id="t491"
- attributeName="transform"
- type="translate"
- dur="0.0622559s"
- from="408.198 117.75"
- to="410.439 117.75" />
- <animateTransform
- begin="r490.begin"
- id="t490"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="410.439 117.75"
- to="413.427 117.75" />
- <animateTransform
- begin="r489.begin"
- id="t489"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="413.427 117.75"
- to="416.415 117.75" />
- <animateTransform
- begin="r488.begin"
- id="t488"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="416.415 117.75"
- to="419.404 117.75" />
- <animateTransform
- begin="r487.begin"
- id="t487"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="419.404 117.75"
- to="422.392 117.75" />
- <animateTransform
- begin="r486.begin"
- id="t486"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="422.392 117.75"
- to="425.38 117.75" />
- <animateTransform
- begin="r485.begin"
- id="t485"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="425.38 117.75"
- to="428.369 117.75" />
- <animateTransform
- begin="r484.begin"
- id="t484"
- attributeName="transform"
- type="translate"
- dur="0.0830078s"
- from="428.369 117.75"
- to="431.357 117.75" />
- <animateTransform
- begin="r483.begin"
- id="t483"
- attributeName="transform"
- type="translate"
- dur="0.387595s"
- from="431.357 117.75"
- to="435.839 117.75" />
- <animateTransform
- begin="r482.begin"
- id="t482"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="435.839 117.75"
- to="441.816 117.75" />
- <animateTransform
- begin="r481.begin"
- id="t481"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="441.816 117.75"
- to="447.792 117.75" />
- <animateTransform
- begin="r480.begin"
- id="t480"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="447.792 117.75"
- to="453.769 117.75" />
- <animateTransform
- begin="r479.begin"
- id="t479"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="453.769 117.75"
- to="459.745 117.75" />
- <animateTransform
- begin="r478.begin"
- id="t478"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="459.745 117.75"
- to="465.722 117.75" />
- <animateTransform
- begin="r477.begin"
- id="t477"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="465.722 117.75"
- to="471.699 117.75" />
- <animateTransform
- begin="r476.begin"
- id="t476"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="471.699 117.75"
- to="477.675 117.75" />
- <animateTransform
- begin="r475.begin"
- id="t475"
- attributeName="transform"
- type="translate"
- dur="0.166016s"
- from="477.675 117.75"
- to="483.652 117.75" />
- <animateTransform
- begin="r474.begin"
- id="t474"
- attributeName="transform"
- type="translate"
- dur="0.775189s"
- from="483.652 117.75"
- to="492.617 117.75" />
- <animateTransform
- begin="r473.begin"
- id="t473"
- attributeName="transform"
- type="translate"
- dur="1.56991s"
- from="492.617 117.75"
- to="498.967 117.75" />
- <animateTransform
- begin="r472.begin"
- id="t472"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="498.967 117.75"
- to="499.714 117.75" />
- <animateTransform
- begin="r471.begin"
- id="t471"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="499.714 117.75"
- to="500.461 117.75" />
- <animateTransform
- begin="r470.begin"
- id="t470"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="500.461 117.75"
- to="501.208 117.75" />
- <animateTransform
- begin="r469.begin"
- id="t469"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="501.208 117.75"
- to="501.955 117.75" />
- <animateTransform
- begin="r468.begin"
- id="t468"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="501.955 117.75"
- to="502.702 117.75" />
- <animateTransform
- begin="r467.begin"
- id="t467"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="502.702 117.75"
- to="503.449 117.75" />
- <animateTransform
- begin="r466.begin"
- id="t466"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="503.449 117.75"
- to="504.196 117.75" />
- <animateTransform
- begin="r465.begin"
- id="t465"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="504.196 117.75"
- to="504.943 117.75" />
- <animateTransform
- begin="r464.begin"
- id="t464"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="504.943 117.75"
- to="505.69 117.75" />
- <animateTransform
- begin="r463.begin"
- id="t463"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="505.69 117.75"
- to="506.811 117.75" />
- <animateTransform
- begin="r462.begin"
- id="t462"
- attributeName="transform"
- type="translate"
- dur="0.207782s"
- from="506.811 117.75"
- to="507.651 117.75" />
- <animateTransform
- begin="r461.begin"
- id="t461"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="507.651 117.75"
- to="507.838 117.75" />
- <animateTransform
- begin="r460.begin"
- id="t460"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="507.838 117.75"
- to="508.025 117.75" />
- <animateTransform
- begin="r459.begin"
- id="t459"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="508.025 117.75"
- to="508.212 117.75" />
- <animateTransform
- begin="r458.begin"
- id="t458"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="508.212 117.75"
- to="508.492 117.75" />
- <animateTransform
- begin="r457.begin"
- id="t457"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="508.492 117.75"
- to="508.865 117.75" />
- <animateTransform
- begin="r456.begin"
- id="t456"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="508.865 117.75"
- to="509.239 117.75" />
- <animateTransform
- begin="r455.begin"
- id="t455"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="509.239 117.75"
- to="509.612 117.75" />
- <animateTransform
- begin="r454.begin"
- id="t454"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="509.612 117.75"
- to="509.986 117.75" />
- <animateTransform
- begin="r453.begin"
- id="t453"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="509.986 117.75"
- to="510.359 117.75" />
- <animateTransform
- begin="r452.begin"
- id="t452"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="510.359 117.75"
- to="510.733 117.75" />
- <animateTransform
- begin="r451.begin"
- id="t451"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="510.733 117.75"
- to="511.107 117.75" />
- <animateTransform
- begin="r450.begin"
- id="t450"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="511.107 117.75"
- to="511.667 117.75" />
- <animateTransform
- begin="r449.begin"
- id="t449"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="511.667 117.75"
- to="512.414 117.75" />
- <animateTransform
- begin="r448.begin"
- id="t448"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="512.414 117.75"
- to="513.161 117.75" />
- <animateTransform
- begin="r447.begin"
- id="t447"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="513.161 117.75"
- to="513.908 117.75" />
- <animateTransform
- begin="r446.begin"
- id="t446"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="513.908 117.75"
- to="514.655 117.75" />
- <animateTransform
- begin="r445.begin"
- id="t445"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="514.655 117.75"
- to="515.402 117.75" />
- <animateTransform
- begin="r444.begin"
- id="t444"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="515.402 117.75"
- to="516.149 117.75" />
- <animateTransform
- begin="r443.begin"
- id="t443"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="516.149 117.75"
- to="516.896 117.75" />
- <animateTransform
- begin="r442.begin"
- id="t442"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="516.896 117.75"
- to="517.643 117.75" />
- <animateTransform
- begin="r441.begin"
- id="t441"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="517.643 117.75"
- to="518.764 117.75" />
- <animateTransform
- begin="r440.begin"
- id="t440"
- attributeName="transform"
- type="translate"
- dur="0.36939s"
- from="518.764 117.75"
- to="520.258 117.75" />
- <animateTransform
- begin="r439.begin"
- id="t439"
- attributeName="transform"
- type="translate"
- dur="0.277043s"
- from="520.258 117.75"
- to="521.379 117.75" />
- <animateTransform
- begin="r438.begin"
- id="t438"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="521.379 117.75"
- to="522.126 117.75" />
- <animateTransform
- begin="r437.begin"
- id="t437"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="522.126 117.75"
- to="523.246 117.75" />
- <animateTransform
- begin="r436.begin"
- id="t436"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="523.246 117.75"
- to="524.741 117.75" />
- <animateTransform
- begin="r435.begin"
- id="t435"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="524.741 117.75"
- to="526.235 117.75" />
- <animateTransform
- begin="r434.begin"
- id="t434"
- attributeName="transform"
- type="translate"
- dur="0.277043s"
- from="526.235 117.75"
- to="527.355 117.75" />
- <animateTransform
- begin="r433.begin"
- id="t433"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="527.355 117.75"
- to="528.102 117.75" />
- <animateTransform
- begin="r432.begin"
- id="t432"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="528.102 117.75"
- to="529.223 117.75" />
- <animateTransform
- begin="r431.begin"
- id="t431"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="529.223 117.75"
- to="530.717 117.75" />
- <animateTransform
- begin="r430.begin"
- id="t430"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="530.717 117.75"
- to="532.211 117.75" />
- <animateTransform
- begin="r429.begin"
- id="t429"
- attributeName="transform"
- type="translate"
- dur="0.277043s"
- from="532.211 117.75"
- to="533.332 117.75" />
- <animateTransform
- begin="r428.begin"
- id="t428"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="533.332 117.75"
- to="534.079 117.75" />
- <animateTransform
- begin="r427.begin"
- id="t427"
- attributeName="transform"
- type="translate"
- dur="0.0968987s"
- from="534.079 117.75"
- to="535.2 117.75" />
- <animateTransform
- begin="r426.begin"
- id="t426"
- attributeName="transform"
- type="translate"
- dur="0.230869s"
- from="535.2 117.75"
- to="536.133 117.75" />
- <animateTransform
- begin="r425.begin"
- id="t425"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="536.133 117.75"
- to="536.507 117.75" />
- <animateTransform
- begin="r424.begin"
- id="t424"
- attributeName="transform"
- type="translate"
- dur="0.0484493s"
- from="536.507 117.75"
- to="537.067 117.75" />
- <animateTransform
- begin="r423.begin"
- id="t423"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="537.067 117.75"
- to="537.814 117.75" />
- <animateTransform
- begin="r422.begin"
- id="t422"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="537.814 117.75"
- to="538.561 117.75" />
- <animateTransform
- begin="r421.begin"
- id="t421"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="538.561 117.75"
- to="539.308 117.75" />
- <animateTransform
- begin="r420.begin"
- id="t420"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="539.308 117.75"
- to="540.056 117.75" />
- <animateTransform
- begin="r419.begin"
- id="t419"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="540.056 117.75"
- to="540.803 117.75" />
- <animateTransform
- begin="r418.begin"
- id="t418"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="540.803 117.75"
- to="541.55 117.75" />
- <animateTransform
- begin="r417.begin"
- id="t417"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="541.55 117.75"
- to="542.297 117.75" />
- <animateTransform
- begin="r416.begin"
- id="t416"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="542.297 117.75"
- to="543.044 117.75" />
- <animateTransform
- begin="r415.begin"
- id="t415"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="543.044 117.75"
- to="544.164 117.75" />
- <animateTransform
- begin="r414.begin"
- id="t414"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="544.164 117.75"
- to="545.659 117.75" />
- <animateTransform
- begin="r413.begin"
- id="t413"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="545.659 117.75"
- to="547.153 117.75" />
- <animateTransform
- begin="r412.begin"
- id="t412"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="547.153 117.75"
- to="548.647 117.75" />
- <animateTransform
- begin="r411.begin"
- id="t411"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="548.647 117.75"
- to="550.141 117.75" />
- <animateTransform
- begin="r410.begin"
- id="t410"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="550.141 117.75"
- to="551.635 117.75" />
- <animateTransform
- begin="r409.begin"
- id="t409"
- attributeName="transform"
- type="translate"
- dur="0.0415039s"
- from="551.635 117.75"
- to="553.129 117.75" />
- <animateTransform
- begin="r408.begin"
- id="t408"
- attributeName="transform"
- type="translate"
- dur="0.18816s"
- from="553.129 117.75"
- to="554.623 117.75" />
- <animateTransform
- begin="r407.begin"
- id="t407"
- attributeName="transform"
- type="translate"
- dur="0.0622559s"
- from="554.623 117.75"
- to="556.865 117.75" />
- <animateTransform
- begin="r406.begin"
- id="t406"
- attributeName="transform"
- type="translate"
- dur="0.415564s"
- from="556.865 117.75"
- to="558.546 117.75" />
- <animateTransform
- begin="r405.begin"
- id="t405"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="558.546 117.75"
- to="558.919 117.75" />
- <animateTransform
- begin="r404.begin"
- id="t404"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="558.919 117.75"
- to="559.293 117.75" />
- <animateTransform
- begin="r403.begin"
- id="t403"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="559.293 117.75"
- to="559.666 117.75" />
- <animateTransform
- begin="r402.begin"
- id="t402"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="559.666 117.75"
- to="560.04 117.75" />
- <animateTransform
- begin="r401.begin"
- id="t401"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="560.04 117.75"
- to="560.413 117.75" />
- <animateTransform
- begin="r400.begin"
- id="t400"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="560.413 117.75"
- to="560.973 117.75" />
- <animateTransform
- begin="r399.begin"
- id="t399"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="560.973 117.75"
- to="561.721 117.75" />
- <animateTransform
- begin="r398.begin"
- id="t398"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="561.721 117.75"
- to="562.468 117.75" />
- <animateTransform
- begin="r397.begin"
- id="t397"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="562.468 117.75"
- to="563.215 117.75" />
- <animateTransform
- begin="r396.begin"
- id="t396"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="563.215 117.75"
- to="563.962 117.75" />
- <animateTransform
- begin="r395.begin"
- id="t395"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="563.962 117.75"
- to="564.709 117.75" />
- <animateTransform
- begin="r394.begin"
- id="t394"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="564.709 117.75"
- to="565.456 117.75" />
- <animateTransform
- begin="r393.begin"
- id="t393"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="565.456 117.75"
- to="566.203 117.75" />
- <animateTransform
- begin="r392.begin"
- id="t392"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="566.203 117.75"
- to="566.95 117.75" />
- <animateTransform
- begin="r391.begin"
- id="t391"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="566.95 117.75"
- to="567.697 117.75" />
- <animateTransform
- begin="r390.begin"
- id="t390"
- attributeName="transform"
- type="translate"
- dur="0.09408s"
- from="567.697 117.75"
- to="568.444 117.75" />
- <animateTransform
- begin="r389.begin"
- id="t389"
- attributeName="transform"
- type="translate"
- dur="0.0311279s"
- from="568.444 117.75"
- to="569.565 117.75" />
- <animateTransform
- begin="r388.begin"
- id="t388"
- attributeName="transform"
- type="translate"
- dur="0.207782s"
- from="569.565 117.75"
- to="570.405 117.75" />
- <animateTransform
- begin="r387.begin"
- id="t387"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="570.405 117.75"
- to="570.592 117.75" />
- <animateTransform
- begin="r386.begin"
- id="t386"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="570.592 117.75"
- to="570.779 117.75" />
- <animateTransform
- begin="r385.begin"
- id="t385"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="570.779 117.75"
- to="570.966 117.75" />
- <animateTransform
- begin="r384.begin"
- id="t384"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="570.966 117.75"
- to="571.152 117.75" />
- <animateTransform
- begin="r383.begin"
- id="t383"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="571.152 117.75"
- to="571.339 117.75" />
- <animateTransform
- begin="r382.begin"
- id="t382"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="571.339 117.75"
- to="571.526 117.75" />
- <animateTransform
- begin="r381.begin"
- id="t381"
- attributeName="transform"
- type="translate"
- dur="0.00518799s"
- from="571.526 117.75"
- to="571.713 117.75" />
- <animateTransform
- begin="r380.begin"
- id="t380"
- attributeName="transform"
- type="translate"
- dur="0.0242247s"
- from="571.713 117.75"
- to="571.993 117.75" />
- <animateTransform
- begin="r379.begin"
- id="t379"
- attributeName="transform"
- type="translate"
- dur="0.0923475s"
- from="571.993 117.75"
- to="571.619 117.75" />
- <animateTransform
- begin="r378.begin"
- id="t378"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="571.619 117.75"
- to="571.246 117.75" />
- <animateTransform
- begin="r377.begin"
- id="t377"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="571.246 117.75"
- to="570.872 117.75" />
- <animateTransform
- begin="r376.begin"
- id="t376"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="570.872 117.75"
- to="570.499 117.75" />
- <animateTransform
- begin="r375.begin"
- id="t375"
- attributeName="transform"
- type="translate"
- dur="0.010376s"
- from="570.499 117.75"
- to="570.125 117.75" />
- <animateTransform
- begin="r374.begin"
- id="t374"
- attributeName="transform"
- type="translate"
- dur="0.00778198s"
- from="570.125 117.75"
- to="569.845 117.75" />
- <animateTransform
- begin="r373.begin"
- id="t373"
- attributeName="transform"
- type="translate"
- dur="0.02352s"
- from="569.845 117.75"
- to="569.658 117.75" />
- <animateTransform
- begin="r372.begin"
- id="t372"
- attributeName="transform"
- type="translate"
- dur="0.115434s"
- from="569.658 117.75"
- to="569.191 117.75" />
- <animateTransform
- begin="r371.begin"
- id="t371"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="569.191 117.75"
- to="568.444 117.75" />
- <animateTransform
- begin="r370.begin"
- id="t370"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="568.444 117.75"
- to="567.697 117.75" />
- <animateTransform
- begin="r369.begin"
- id="t369"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="567.697 117.75"
- to="566.95 117.75" />
- <animateTransform
- begin="r368.begin"
- id="t368"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="566.95 117.75"
- to="566.203 117.75" />
- <animateTransform
- begin="r367.begin"
- id="t367"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="566.203 117.75"
- to="565.456 117.75" />
- <animateTransform
- begin="r366.begin"
- id="t366"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="565.456 117.75"
- to="564.709 117.75" />
- <animateTransform
- begin="r365.begin"
- id="t365"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="564.709 117.75"
- to="563.962 117.75" />
- <animateTransform
- begin="r364.begin"
- id="t364"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="563.962 117.75"
- to="563.215 117.75" />
- <animateTransform
- begin="r363.begin"
- id="t363"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="563.215 117.75"
- to="562.468 117.75" />
- <animateTransform
- begin="r362.begin"
- id="t362"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="562.468 117.75"
- to="561.721 117.75" />
- <animateTransform
- begin="r361.begin"
- id="t361"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="561.721 117.75"
- to="560.973 117.75" />
- <animateTransform
- begin="r360.begin"
- id="t360"
- attributeName="transform"
- type="translate"
- dur="0.015564s"
- from="560.973 117.75"
- to="560.413 117.75" />
- <animateTransform
- begin="r359.begin"
- id="t359"
- attributeName="transform"
- type="translate"
- dur="0.04704s"
- from="560.413 117.75"
- to="560.04 117.75" />
- <animateTransform
- begin="r358.begin"
- id="t358"
- attributeName="transform"
- type="translate"
- dur="0.138521s"
- from="560.04 117.75"
- to="559.479 117.75" />
- <animateTransform
- begin="r357.begin"
- id="t357"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="559.479 117.75"
- to="558.732 117.75" />
- <animateTransform
- begin="r356.begin"
- id="t356"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="558.732 117.75"
- to="557.985 117.75" />
- <animateTransform
- begin="r355.begin"
- id="t355"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="557.985 117.75"
- to="557.238 117.75" />
- <animateTransform
- begin="r354.begin"
- id="t354"
- attributeName="transform"
- type="translate"
- dur="0.020752s"
- from="557.238 117.75"
- to="556.491 117.75" />
+ dur="0.083008s"
+ from="3.13336 0 162"
+ to="3.13336 0 162" />
+ </path>
<animateTransform
- begin="r353.begin"
+ begin="playing.begin"
id="t353"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="556.491 117.75"
- to="555.744 117.75" />
+ dur="0.0830078s"
+ from="164.653 117.75"
+ to="167.641 117.75" />
<animateTransform
- begin="r352.begin"
+ begin="t353.end"
id="t352"
attributeName="transform"
type="translate"
- dur="0.0968987s"
- from="555.744 117.75"
- to="554.623 117.75" />
+ dur="0.18816s"
+ from="167.641 117.75"
+ to="169.135 117.75" />
<animateTransform
- begin="r351.begin"
+ begin="t352.end"
id="t351"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="554.623 117.75"
- to="553.129 117.75" />
+ dur="0.726318s"
+ from="169.135 117.75"
+ to="195.283 117.75" />
<animateTransform
- begin="r350.begin"
+ begin="t351.end"
id="t350"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="553.129 117.75"
- to="551.635 117.75" />
+ dur="0.193797s"
+ from="195.283 117.75"
+ to="197.524 117.75" />
<animateTransform
- begin="r349.begin"
+ begin="t350.end"
id="t349"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="551.635 117.75"
- to="550.141 117.75" />
+ dur="0.600259s"
+ from="197.524 117.75"
+ to="199.952 117.75" />
<animateTransform
- begin="r348.begin"
+ begin="t349.end"
id="t348"
attributeName="transform"
type="translate"
- dur="0.0968987s"
- from="550.141 117.75"
- to="549.02 117.75" />
+ dur="0.020752s"
+ from="199.952 117.75"
+ to="200.699 117.75" />
<animateTransform
- begin="r347.begin"
+ begin="t348.end"
id="t347"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="549.02 117.75"
- to="548.273 117.75" />
+ dur="0.04704s"
+ from="200.699 117.75"
+ to="201.072 117.75" />
<animateTransform
- begin="r346.begin"
+ begin="t347.end"
id="t346"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="548.273 117.75"
- to="547.526 117.75" />
+ dur="0.015564s"
+ from="201.072 117.75"
+ to="201.633 117.75" />
<animateTransform
- begin="r345.begin"
+ begin="t346.end"
id="t345"
attributeName="transform"
type="translate"
- dur="0.138521s"
- from="547.526 117.75"
- to="546.966 117.75" />
+ dur="0.115434s"
+ from="201.633 117.75"
+ to="202.1 117.75" />
<animateTransform
- begin="r344.begin"
+ begin="t345.end"
id="t344"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="546.966 117.75"
- to="546.592 117.75" />
+ dur="0.00518799s"
+ from="202.1 117.75"
+ to="202.286 117.75" />
<animateTransform
- begin="r343.begin"
+ begin="t344.end"
id="t343"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="546.592 117.75"
- to="546.032 117.75" />
+ dur="0.00518799s"
+ from="202.286 117.75"
+ to="202.473 117.75" />
<animateTransform
- begin="r342.begin"
+ begin="t343.end"
id="t342"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="546.032 117.75"
- to="545.285 117.75" />
+ dur="0.02352s"
+ from="202.473 117.75"
+ to="202.66 117.75" />
<animateTransform
- begin="r341.begin"
+ begin="t342.end"
id="t341"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="545.285 117.75"
- to="544.538 117.75" />
+ dur="0.070038s"
+ from="202.66 117.75"
+ to="205.181 117.75" />
<animateTransform
- begin="r340.begin"
+ begin="t341.end"
id="t340"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="544.538 117.75"
- to="543.791 117.75" />
+ dur="0.04704s"
+ from="205.181 117.75"
+ to="205.555 117.75" />
<animateTransform
- begin="r339.begin"
+ begin="t340.end"
id="t339"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="543.791 117.75"
- to="543.044 117.75" />
+ dur="0.015564s"
+ from="205.555 117.75"
+ to="206.115 117.75" />
<animateTransform
- begin="r338.begin"
+ begin="t339.end"
id="t338"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="543.044 117.75"
- to="542.297 117.75" />
+ dur="0.115434s"
+ from="206.115 117.75"
+ to="206.582 117.75" />
<animateTransform
- begin="r337.begin"
+ begin="t338.end"
id="t337"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="542.297 117.75"
- to="541.55 117.75" />
+ dur="0.00518799s"
+ from="206.582 117.75"
+ to="206.769 117.75" />
<animateTransform
- begin="r336.begin"
+ begin="t337.end"
id="t336"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="541.55 117.75"
- to="540.803 117.75" />
+ dur="0.0242247s"
+ from="206.769 117.75"
+ to="207.049 117.75" />
<animateTransform
- begin="r335.begin"
+ begin="t336.end"
id="t335"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="540.803 117.75"
- to="540.056 117.75" />
+ dur="0.072632s"
+ from="207.049 117.75"
+ to="209.664 117.75" />
<animateTransform
- begin="r334.begin"
+ begin="t335.end"
id="t334"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="540.056 117.75"
- to="539.308 117.75" />
+ dur="0.04704s"
+ from="209.664 117.75"
+ to="210.037 117.75" />
<animateTransform
- begin="r333.begin"
+ begin="t334.end"
id="t333"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="539.308 117.75"
- to="538.561 117.75" />
+ dur="0.036316s"
+ from="210.037 117.75"
+ to="211.345 117.75" />
<animateTransform
- begin="r332.begin"
+ begin="t333.end"
id="t332"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="538.561 117.75"
- to="537.814 117.75" />
+ dur="0.138521s"
+ from="211.345 117.75"
+ to="211.905 117.75" />
<animateTransform
- begin="r331.begin"
+ begin="t332.end"
id="t331"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="537.814 117.75"
- to="537.067 117.75" />
+ dur="0.010376s"
+ from="211.905 117.75"
+ to="212.278 117.75" />
<animateTransform
- begin="r330.begin"
+ begin="t331.end"
id="t330"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="537.067 117.75"
- to="536.32 117.75" />
+ dur="0.0692607s"
+ from="212.278 117.75"
+ to="212.559 117.75" />
<animateTransform
- begin="r329.begin"
+ begin="t330.end"
id="t329"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="536.32 117.75"
- to="535.573 117.75" />
+ dur="0.00518799s"
+ from="212.559 117.75"
+ to="212.745 117.75" />
<animateTransform
- begin="r328.begin"
+ begin="t329.end"
id="t328"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="535.573 117.75"
- to="534.826 117.75" />
+ dur="0.0242247s"
+ from="212.745 117.75"
+ to="213.025 117.75" />
<animateTransform
- begin="r327.begin"
+ begin="t328.end"
id="t327"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="534.826 117.75"
- to="534.079 117.75" />
+ dur="0.010376s"
+ from="213.025 117.75"
+ to="213.399 117.75" />
<animateTransform
- begin="r326.begin"
+ begin="t327.end"
id="t326"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="534.079 117.75"
- to="533.332 117.75" />
+ dur="0.0692607s"
+ from="213.399 117.75"
+ to="213.679 117.75" />
<animateTransform
- begin="r325.begin"
+ begin="t326.end"
id="t325"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="533.332 117.75"
- to="532.585 117.75" />
+ dur="0.010376s"
+ from="213.679 117.75"
+ to="214.053 117.75" />
<animateTransform
- begin="r324.begin"
+ begin="t325.end"
id="t324"
attributeName="transform"
type="translate"
- dur="0.09408s"
- from="532.585 117.75"
- to="531.838 117.75" />
+ dur="0.00518799s"
+ from="214.053 117.75"
+ to="214.239 117.75" />
<animateTransform
- begin="r323.begin"
+ begin="t324.end"
id="t323"
attributeName="transform"
type="translate"
- dur="0.0311279s"
- from="531.838 117.75"
- to="530.717 117.75" />
+ dur="0.010376s"
+ from="214.239 117.75"
+ to="214.613 117.75" />
<animateTransform
- begin="r322.begin"
+ begin="t323.end"
id="t322"
attributeName="transform"
type="translate"
- dur="0.0311279s"
- from="530.717 117.75"
- to="529.597 117.75" />
+ dur="0.0242247s"
+ from="214.613 117.75"
+ to="214.893 117.75" />
<animateTransform
- begin="r321.begin"
+ begin="t322.end"
id="t321"
attributeName="transform"
type="translate"
- dur="0.09408s"
- from="529.597 117.75"
- to="528.849 117.75" />
+ dur="0.072632s"
+ from="214.893 117.75"
+ to="217.508 117.75" />
<animateTransform
- begin="r320.begin"
+ begin="t321.end"
id="t320"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="528.849 117.75"
- to="528.102 117.75" />
+ dur="0.0484493s"
+ from="217.508 117.75"
+ to="218.068 117.75" />
<animateTransform
- begin="r319.begin"
+ begin="t320.end"
id="t319"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="528.102 117.75"
- to="527.355 117.75" />
+ dur="0.115434s"
+ from="218.068 117.75"
+ to="218.535 117.75" />
<animateTransform
- begin="r318.begin"
+ begin="t319.end"
id="t318"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="527.355 117.75"
- to="526.608 117.75" />
+ dur="0.02352s"
+ from="218.535 117.75"
+ to="218.722 117.75" />
<animateTransform
- begin="r317.begin"
+ begin="t318.end"
id="t317"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="526.608 117.75"
- to="525.861 117.75" />
+ dur="0.070038s"
+ from="218.722 117.75"
+ to="221.243 117.75" />
<animateTransform
- begin="r316.begin"
+ begin="t317.end"
id="t316"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="525.861 117.75"
- to="525.114 117.75" />
+ dur="0.0484493s"
+ from="221.243 117.75"
+ to="221.804 117.75" />
<animateTransform
- begin="r315.begin"
+ begin="t316.end"
id="t315"
attributeName="transform"
type="translate"
dur="0.020752s"
- from="525.114 117.75"
- to="524.367 117.75" />
+ from="221.804 117.75"
+ to="222.551 117.75" />
<animateTransform
- begin="r314.begin"
+ begin="t315.end"
id="t314"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="524.367 117.75"
- to="523.62 117.75" />
+ dur="0.138521s"
+ from="222.551 117.75"
+ to="223.111 117.75" />
<animateTransform
- begin="r313.begin"
+ begin="t314.end"
id="t313"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="523.62 117.75"
- to="522.873 117.75" />
+ dur="0.05188s"
+ from="223.111 117.75"
+ to="224.979 117.75" />
<animateTransform
- begin="r312.begin"
+ begin="t313.end"
id="t312"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="522.873 117.75"
- to="522.126 117.75" />
+ dur="0.0484493s"
+ from="224.979 117.75"
+ to="225.539 117.75" />
<animateTransform
- begin="r311.begin"
+ begin="t312.end"
id="t311"
attributeName="transform"
type="translate"
dur="0.020752s"
- from="522.126 117.75"
- to="521.379 117.75" />
+ from="225.539 117.75"
+ to="226.286 117.75" />
<animateTransform
- begin="r310.begin"
+ begin="t311.end"
id="t310"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="521.379 117.75"
- to="520.632 117.75" />
+ dur="0.207782s"
+ from="226.286 117.75"
+ to="227.126 117.75" />
<animateTransform
- begin="r309.begin"
+ begin="t310.end"
id="t309"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="520.632 117.75"
- to="519.885 117.75" />
+ dur="0.00518799s"
+ from="227.126 117.75"
+ to="227.313 117.75" />
<animateTransform
- begin="r308.begin"
+ begin="t309.end"
id="t308"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="519.885 117.75"
- to="519.138 117.75" />
+ dur="0.0242247s"
+ from="227.313 117.75"
+ to="227.593 117.75" />
<animateTransform
- begin="r307.begin"
+ begin="t308.end"
id="t307"
attributeName="transform"
type="translate"
dur="0.020752s"
- from="519.138 117.75"
- to="518.39 117.75" />
+ from="227.593 117.75"
+ to="228.34 117.75" />
<animateTransform
- begin="r306.begin"
+ begin="t307.end"
id="t306"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="518.39 117.75"
- to="517.643 117.75" />
+ dur="0.0692607s"
+ from="228.34 117.75"
+ to="228.621 117.75" />
<animateTransform
- begin="r305.begin"
+ begin="t306.end"
id="t305"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="517.643 117.75"
- to="517.083 117.75" />
+ dur="0.00518799s"
+ from="228.621 117.75"
+ to="228.807 117.75" />
<animateTransform
- begin="r304.begin"
+ begin="t305.end"
id="t304"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="517.083 117.75"
- to="516.71 117.75" />
+ dur="0.00518799s"
+ from="228.807 117.75"
+ to="228.994 117.75" />
<animateTransform
- begin="r303.begin"
+ begin="t304.end"
id="t303"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="516.71 117.75"
- to="516.336 117.75" />
+ dur="0.02352s"
+ from="228.994 117.75"
+ to="229.181 117.75" />
<animateTransform
- begin="r302.begin"
+ begin="t303.end"
id="t302"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="516.336 117.75"
- to="515.963 117.75" />
+ dur="0.028534s"
+ from="229.181 117.75"
+ to="230.208 117.75" />
<animateTransform
- begin="r301.begin"
+ begin="t302.end"
id="t301"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="515.963 117.75"
- to="515.589 117.75" />
+ dur="0.0692607s"
+ from="230.208 117.75"
+ to="230.488 117.75" />
<animateTransform
- begin="r300.begin"
+ begin="t301.end"
id="t300"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="515.589 117.75"
- to="515.215 117.75" />
+ dur="0.00518799s"
+ from="230.488 117.75"
+ to="230.675 117.75" />
<animateTransform
- begin="r299.begin"
+ begin="t300.end"
id="t299"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="515.215 117.75"
- to="514.842 117.75" />
+ dur="0.0242247s"
+ from="230.675 117.75"
+ to="230.955 117.75" />
<animateTransform
- begin="r298.begin"
+ begin="t299.end"
id="t298"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="514.842 117.75"
- to="514.468 117.75" />
+ from="230.955 117.75"
+ to="231.329 117.75" />
<animateTransform
- begin="r297.begin"
+ begin="t298.end"
id="t297"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="514.468 117.75"
- to="514.095 117.75" />
+ dur="0.0692607s"
+ from="231.329 117.75"
+ to="231.609 117.75" />
<animateTransform
- begin="r296.begin"
+ begin="t297.end"
id="t296"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="514.095 117.75"
- to="513.721 117.75" />
+ dur="0.00518799s"
+ from="231.609 117.75"
+ to="231.796 117.75" />
<animateTransform
- begin="r295.begin"
+ begin="t296.end"
id="t295"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="513.721 117.75"
- to="513.348 117.75" />
+ dur="0.0461738s"
+ from="231.796 117.75"
+ to="231.982 117.75" />
<animateTransform
- begin="r294.begin"
+ begin="t295.end"
id="t294"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="513.348 117.75"
- to="512.974 117.75" />
+ dur="0.0692607s"
+ from="231.982 117.75"
+ to="231.702 117.75" />
<animateTransform
- begin="r293.begin"
+ begin="t294.end"
id="t293"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="512.974 117.75"
- to="512.601 117.75" />
+ dur="0.072632s"
+ from="231.702 117.75"
+ to="229.088 117.75" />
<animateTransform
- begin="r292.begin"
+ begin="t293.end"
id="t292"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="512.601 117.75"
- to="512.227 117.75" />
+ dur="0.0484493s"
+ from="229.088 117.75"
+ to="228.527 117.75" />
<animateTransform
- begin="r291.begin"
+ begin="t292.end"
id="t291"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="512.227 117.75"
- to="511.854 117.75" />
+ dur="0.166016s"
+ from="228.527 117.75"
+ to="222.551 117.75" />
<animateTransform
- begin="r290.begin"
+ begin="t291.end"
id="t290"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="511.854 117.75"
- to="511.48 117.75" />
+ dur="0.0968987s"
+ from="222.551 117.75"
+ to="221.43 117.75" />
<animateTransform
- begin="r289.begin"
+ begin="t290.end"
id="t289"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="511.48 117.75"
- to="511.107 117.75" />
+ dur="0.114136s"
+ from="221.43 117.75"
+ to="217.321 117.75" />
<animateTransform
- begin="r288.begin"
+ begin="t289.end"
id="t288"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="511.107 117.75"
- to="510.733 117.75" />
+ dur="0.09408s"
+ from="217.321 117.75"
+ to="216.574 117.75" />
<animateTransform
- begin="r287.begin"
+ begin="t288.end"
id="t287"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="510.733 117.75"
- to="510.359 117.75" />
+ dur="0.138521s"
+ from="216.574 117.75"
+ to="216.014 117.75" />
<animateTransform
- begin="r286.begin"
+ begin="t287.end"
id="t286"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="510.359 117.75"
- to="509.986 117.75" />
+ from="216.014 117.75"
+ to="215.64 117.75" />
<animateTransform
- begin="r285.begin"
+ begin="t286.end"
id="t285"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="509.986 117.75"
- to="509.612 117.75" />
+ dur="0.0484493s"
+ from="215.64 117.75"
+ to="215.08 117.75" />
<animateTransform
- begin="r284.begin"
+ begin="t285.end"
id="t284"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="509.612 117.75"
- to="509.239 117.75" />
+ dur="0.20752s"
+ from="215.08 117.75"
+ to="207.609 117.75" />
<animateTransform
- begin="r283.begin"
+ begin="t284.end"
id="t283"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="509.239 117.75"
- to="508.865 117.75" />
+ dur="0.0968987s"
+ from="207.609 117.75"
+ to="206.489 117.75" />
<animateTransform
- begin="r282.begin"
+ begin="t283.end"
id="t282"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="508.865 117.75"
- to="508.492 117.75" />
+ dur="0.20752s"
+ from="206.489 117.75"
+ to="199.018 117.75" />
<animateTransform
- begin="r281.begin"
+ begin="t282.end"
id="t281"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="508.492 117.75"
- to="507.932 117.75" />
+ dur="0.0968987s"
+ from="199.018 117.75"
+ to="197.897 117.75" />
<animateTransform
- begin="r280.begin"
+ begin="t281.end"
id="t280"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="507.932 117.75"
- to="507.184 117.75" />
+ dur="0.228272s"
+ from="197.897 117.75"
+ to="189.68 117.75" />
<animateTransform
- begin="r279.begin"
+ begin="t280.end"
id="t279"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="507.184 117.75"
- to="506.437 117.75" />
+ dur="0.184695s"
+ from="189.68 117.75"
+ to="188.932 117.75" />
<animateTransform
- begin="r278.begin"
+ begin="t279.end"
id="t278"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="506.437 117.75"
- to="505.69 117.75" />
+ dur="0.09408s"
+ from="188.932 117.75"
+ to="188.185 117.75" />
<animateTransform
- begin="r277.begin"
+ begin="t278.end"
id="t277"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="505.69 117.75"
- to="504.943 117.75" />
+ dur="0.321655s"
+ from="188.185 117.75"
+ to="176.606 117.75" />
<animateTransform
- begin="r276.begin"
+ begin="t277.end"
id="t276"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="504.943 117.75"
- to="504.196 117.75" />
+ dur="0.0968987s"
+ from="176.606 117.75"
+ to="175.485 117.75" />
<animateTransform
- begin="r275.begin"
+ begin="t276.end"
id="t275"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="504.196 117.75"
- to="503.449 117.75" />
+ dur="0.373536s"
+ from="175.485 117.75"
+ to="162.038 117.75" />
<animateTransform
- begin="r274.begin"
+ begin="t275.end"
id="t274"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="503.449 117.75"
- to="502.889 117.75" />
+ dur="0.184695s"
+ from="162.038 117.75"
+ to="161.291 117.75" />
<animateTransform
- begin="r273.begin"
+ begin="t274.end"
id="t273"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="502.889 117.75"
- to="502.515 117.75" />
+ dur="0.0968987s"
+ from="161.291 117.75"
+ to="160.17 117.75" />
<animateTransform
- begin="r272.begin"
+ begin="t273.end"
id="t272"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="502.515 117.75"
- to="502.142 117.75" />
+ dur="0.446167s"
+ from="160.17 117.75"
+ to="144.108 117.75" />
<animateTransform
- begin="r271.begin"
+ begin="t272.end"
id="t271"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="502.142 117.75"
- to="501.768 117.75" />
+ dur="0.09408s"
+ from="144.108 117.75"
+ to="143.361 117.75" />
<animateTransform
- begin="r270.begin"
+ begin="t271.end"
id="t270"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="501.768 117.75"
- to="501.395 117.75" />
+ dur="0.31128s"
+ from="143.361 117.75"
+ to="132.155 117.75" />
<animateTransform
- begin="r269.begin"
+ begin="t270.end"
id="t269"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="501.395 117.75"
- to="501.021 117.75" />
+ dur="0.0484493s"
+ from="132.155 117.75"
+ to="131.595 117.75" />
<animateTransform
- begin="r268.begin"
+ begin="t269.end"
id="t268"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="501.021 117.75"
- to="500.648 117.75" />
+ from="131.595 117.75"
+ to="131.221 117.75" />
<animateTransform
- begin="r267.begin"
+ begin="t268.end"
id="t267"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="500.648 117.75"
- to="500.274 117.75" />
+ dur="0.138521s"
+ from="131.221 117.75"
+ to="130.661 117.75" />
<animateTransform
- begin="r266.begin"
+ begin="t267.end"
id="t266"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="500.274 117.75"
- to="499.9 117.75" />
+ dur="0.036316s"
+ from="130.661 117.75"
+ to="129.354 117.75" />
<animateTransform
- begin="r265.begin"
+ begin="t266.end"
id="t265"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="499.9 117.75"
- to="499.527 117.75" />
+ dur="0.04704s"
+ from="129.354 117.75"
+ to="128.98 117.75" />
<animateTransform
- begin="r264.begin"
+ begin="t265.end"
id="t264"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="499.527 117.75"
- to="499.153 117.75" />
+ dur="0.0923475s"
+ from="128.98 117.75"
+ to="128.607 117.75" />
<animateTransform
- begin="r263.begin"
+ begin="t264.end"
id="t263"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="499.153 117.75"
- to="498.78 117.75" />
+ dur="0.04704s"
+ from="128.607 117.75"
+ to="128.233 117.75" />
<animateTransform
- begin="r262.begin"
+ begin="t263.end"
id="t262"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="498.78 117.75"
- to="498.22 117.75" />
+ dur="0.036316s"
+ from="128.233 117.75"
+ to="126.926 117.75" />
<animateTransform
- begin="r261.begin"
+ begin="t262.end"
id="t261"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="498.22 117.75"
- to="497.473 117.75" />
+ dur="0.0484493s"
+ from="126.926 117.75"
+ to="126.365 117.75" />
<animateTransform
- begin="r260.begin"
+ begin="t261.end"
id="t260"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="497.473 117.75"
- to="496.725 117.75" />
+ dur="0.031128s"
+ from="126.365 117.75"
+ to="125.245 117.75" />
<animateTransform
- begin="r259.begin"
+ begin="t260.end"
id="t259"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="496.725 117.75"
- to="495.978 117.75" />
+ dur="0.0923475s"
+ from="125.245 117.75"
+ to="124.871 117.75" />
<animateTransform
- begin="r258.begin"
+ begin="t259.end"
id="t258"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="495.978 117.75"
- to="495.231 117.75" />
+ dur="0.04704s"
+ from="124.871 117.75"
+ to="124.498 117.75" />
<animateTransform
- begin="r257.begin"
+ begin="t258.end"
id="t257"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="495.231 117.75"
- to="494.484 117.75" />
+ dur="0.036316s"
+ from="124.498 117.75"
+ to="123.19 117.75" />
<animateTransform
- begin="r256.begin"
+ begin="t257.end"
id="t256"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="494.484 117.75"
- to="493.924 117.75" />
+ dur="0.0484493s"
+ from="123.19 117.75"
+ to="122.63 117.75" />
<animateTransform
- begin="r255.begin"
+ begin="t256.end"
id="t255"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="493.924 117.75"
- to="493.55 117.75" />
+ dur="0.041504s"
+ from="122.63 117.75"
+ to="121.136 117.75" />
<animateTransform
- begin="r254.begin"
+ begin="t255.end"
id="t254"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="493.55 117.75"
- to="493.177 117.75" />
+ dur="0.0923475s"
+ from="121.136 117.75"
+ to="120.762 117.75" />
<animateTransform
- begin="r253.begin"
+ begin="t254.end"
id="t253"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="493.177 117.75"
- to="492.803 117.75" />
+ dur="0.0484493s"
+ from="120.762 117.75"
+ to="120.202 117.75" />
<animateTransform
- begin="r252.begin"
+ begin="t253.end"
id="t252"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="492.803 117.75"
- to="492.43 117.75" />
+ dur="0.036316s"
+ from="120.202 117.75"
+ to="118.895 117.75" />
<animateTransform
- begin="r251.begin"
+ begin="t252.end"
id="t251"
attributeName="transform"
type="translate"
- dur="0.00778198s"
- from="492.43 117.75"
- to="492.15 117.75" />
+ dur="0.04704s"
+ from="118.895 117.75"
+ to="118.521 117.75" />
<animateTransform
- begin="r250.begin"
+ begin="t251.end"
id="t250"
attributeName="transform"
type="translate"
- dur="0.02352s"
- from="492.15 117.75"
- to="491.963 117.75" />
+ dur="0.05188s"
+ from="118.521 117.75"
+ to="116.653 117.75" />
<animateTransform
- begin="r249.begin"
+ begin="t250.end"
id="t249"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.963 117.75"
- to="491.776 117.75" />
+ dur="0.0923475s"
+ from="116.653 117.75"
+ to="116.28 117.75" />
<animateTransform
- begin="r248.begin"
+ begin="t249.end"
id="t248"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.776 117.75"
- to="491.589 117.75" />
+ dur="0.0484493s"
+ from="116.28 117.75"
+ to="115.72 117.75" />
<animateTransform
- begin="r247.begin"
+ begin="t248.end"
id="t247"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.589 117.75"
- to="491.403 117.75" />
+ dur="0.041504s"
+ from="115.72 117.75"
+ to="114.225 117.75" />
<animateTransform
- begin="r246.begin"
+ begin="t247.end"
id="t246"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.403 117.75"
- to="491.216 117.75" />
+ dur="0.0484493s"
+ from="114.225 117.75"
+ to="113.665 117.75" />
<animateTransform
- begin="r245.begin"
+ begin="t246.end"
id="t245"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.216 117.75"
- to="491.029 117.75" />
+ dur="0.05188s"
+ from="113.665 117.75"
+ to="111.797 117.75" />
<animateTransform
- begin="r244.begin"
+ begin="t245.end"
id="t244"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="491.029 117.75"
- to="490.842 117.75" />
+ dur="0.0923475s"
+ from="111.797 117.75"
+ to="111.424 117.75" />
<animateTransform
- begin="r243.begin"
+ begin="t244.end"
id="t243"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="490.842 117.75"
- to="490.656 117.75" />
+ dur="0.04704s"
+ from="111.424 117.75"
+ to="111.05 117.75" />
<animateTransform
- begin="r242.begin"
+ begin="t243.end"
id="t242"
attributeName="transform"
type="translate"
- dur="0.0461738s"
- from="490.656 117.75"
- to="490.469 117.75" />
+ dur="0.057068s"
+ from="111.05 117.75"
+ to="108.996 117.75" />
<animateTransform
- begin="r241.begin"
+ begin="t242.end"
id="t241"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="490.469 117.75"
- to="490.282 117.75" />
+ dur="0.0484493s"
+ from="108.996 117.75"
+ to="108.436 117.75" />
<animateTransform
- begin="r240.begin"
+ begin="t241.end"
id="t240"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="490.282 117.75"
- to="490.095 117.75" />
+ dur="0.062256s"
+ from="108.436 117.75"
+ to="106.194 117.75" />
<animateTransform
- begin="r239.begin"
+ begin="t240.end"
id="t239"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="490.095 117.75"
- to="489.908 117.75" />
+ dur="0.0923475s"
+ from="106.194 117.75"
+ to="105.821 117.75" />
<animateTransform
- begin="r238.begin"
+ begin="t239.end"
id="t238"
attributeName="transform"
type="translate"
- dur="0.02352s"
- from="489.908 117.75"
- to="489.722 117.75" />
+ dur="0.0484493s"
+ from="105.821 117.75"
+ to="105.261 117.75" />
<animateTransform
- begin="r237.begin"
+ begin="t238.end"
id="t237"
attributeName="transform"
type="translate"
- dur="0.00778198s"
- from="489.722 117.75"
- to="489.442 117.75" />
+ dur="0.057068s"
+ from="105.261 117.75"
+ to="103.206 117.75" />
<animateTransform
- begin="r236.begin"
+ begin="t237.end"
id="t236"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="489.442 117.75"
- to="489.068 117.75" />
+ dur="0.04704s"
+ from="103.206 117.75"
+ to="102.833 117.75" />
<animateTransform
- begin="r235.begin"
+ begin="t236.end"
id="t235"
attributeName="transform"
type="translate"
- dur="0.00778198s"
- from="489.068 117.75"
- to="488.788 117.75" />
+ dur="0.0692607s"
+ from="102.833 117.75"
+ to="102.552 117.75" />
<animateTransform
- begin="r234.begin"
+ begin="t235.end"
id="t234"
attributeName="transform"
type="translate"
dur="0.02352s"
- from="488.788 117.75"
- to="488.601 117.75" />
+ from="102.552 117.75"
+ to="102.366 117.75" />
<animateTransform
- begin="r233.begin"
+ begin="t234.end"
id="t233"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="488.601 117.75"
- to="488.414 117.75" />
+ dur="0.09079s"
+ from="102.366 117.75"
+ to="99.0973 117.75" />
<animateTransform
- begin="r232.begin"
+ begin="t233.end"
id="t232"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="488.414 117.75"
- to="488.228 117.75" />
+ dur="0.0484493s"
+ from="99.0973 117.75"
+ to="98.537 117.75" />
<animateTransform
- begin="r231.begin"
+ begin="t232.end"
id="t231"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="488.228 117.75"
- to="488.041 117.75" />
+ dur="0.036316s"
+ from="98.537 117.75"
+ to="97.2296 117.75" />
<animateTransform
- begin="r230.begin"
+ begin="t231.end"
id="t230"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="488.041 117.75"
- to="487.854 117.75" />
+ dur="0.04704s"
+ from="97.2296 117.75"
+ to="96.8561 117.75" />
<animateTransform
- begin="r229.begin"
+ begin="t230.end"
id="t229"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="487.854 117.75"
- to="487.667 117.75" />
+ dur="0.020752s"
+ from="96.8561 117.75"
+ to="96.109 117.75" />
<animateTransform
- begin="r228.begin"
+ begin="t229.end"
id="t228"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="487.667 117.75"
- to="487.48 117.75" />
+ dur="0.0692607s"
+ from="96.109 117.75"
+ to="95.8288 117.75" />
<animateTransform
- begin="r227.begin"
+ begin="t228.end"
id="t227"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="487.48 117.75"
- to="487.294 117.75" />
+ dur="0.02352s"
+ from="95.8288 117.75"
+ to="95.6421 117.75" />
<animateTransform
- begin="r226.begin"
+ begin="t227.end"
id="t226"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="487.294 117.75"
- to="487.107 117.75" />
+ dur="0.101166s"
+ from="95.6421 117.75"
+ to="92.0001 117.75" />
<animateTransform
- begin="r225.begin"
+ begin="t226.end"
id="t225"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="487.107 117.75"
- to="486.92 117.75" />
+ dur="0.04704s"
+ from="92.0001 117.75"
+ to="91.6266 117.75" />
<animateTransform
- begin="r224.begin"
+ begin="t225.end"
id="t224"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="486.92 117.75"
- to="486.733 117.75" />
+ dur="0.031128s"
+ from="91.6266 117.75"
+ to="90.506 117.75" />
<animateTransform
- begin="r223.begin"
+ begin="t224.end"
id="t223"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="486.733 117.75"
- to="486.547 117.75" />
+ dur="0.04704s"
+ from="90.506 117.75"
+ to="90.1324 117.75" />
<animateTransform
- begin="r222.begin"
+ begin="t223.end"
id="t222"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="486.547 117.75"
- to="486.36 117.75" />
+ dur="0.041504s"
+ from="90.1324 117.75"
+ to="88.6383 117.75" />
<animateTransform
- begin="r221.begin"
+ begin="t222.end"
id="t221"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="486.36 117.75"
- to="486.173 117.75" />
+ dur="0.0692607s"
+ from="88.6383 117.75"
+ to="88.3581 117.75" />
<animateTransform
- begin="r220.begin"
+ begin="t221.end"
id="t220"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="486.173 117.75"
- to="485.986 117.75" />
+ dur="0.02352s"
+ from="88.3581 117.75"
+ to="88.1714 117.75" />
<animateTransform
- begin="r219.begin"
+ begin="t220.end"
id="t219"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="485.986 117.75"
- to="485.8 117.75" />
+ dur="0.111542s"
+ from="88.1714 117.75"
+ to="84.1559 117.75" />
<animateTransform
- begin="r218.begin"
+ begin="t219.end"
id="t218"
attributeName="transform"
type="translate"
- dur="0.0461738s"
- from="485.8 117.75"
- to="485.613 117.75" />
+ dur="0.0484493s"
+ from="84.1559 117.75"
+ to="83.5956 117.75" />
<animateTransform
- begin="r217.begin"
+ begin="t218.end"
id="t217"
attributeName="transform"
type="translate"
- dur="0.0242247s"
- from="485.613 117.75"
- to="485.333 117.75" />
+ dur="0.015564s"
+ from="83.5956 117.75"
+ to="83.0353 117.75" />
<animateTransform
- begin="r216.begin"
+ begin="t217.end"
id="t216"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="485.333 117.75"
- to="484.959 117.75" />
+ dur="0.04704s"
+ from="83.0353 117.75"
+ to="82.6617 117.75" />
<animateTransform
- begin="r215.begin"
+ begin="t216.end"
id="t215"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="484.959 117.75"
- to="484.586 117.75" />
+ from="82.6617 117.75"
+ to="82.2882 117.75" />
<animateTransform
- begin="r214.begin"
+ begin="t215.end"
id="t214"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="484.586 117.75"
- to="484.212 117.75" />
+ dur="0.0692607s"
+ from="82.2882 117.75"
+ to="82.008 117.75" />
<animateTransform
- begin="r213.begin"
+ begin="t214.end"
id="t213"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="484.212 117.75"
- to="483.838 117.75" />
+ dur="0.0461738s"
+ from="82.008 117.75"
+ to="82.1948 117.75" />
<animateTransform
- begin="r212.begin"
+ begin="t213.end"
id="t212"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="483.838 117.75"
- to="483.465 117.75" />
+ dur="0.00518799s"
+ from="82.1948 117.75"
+ to="82.3816 117.75" />
<animateTransform
- begin="r211.begin"
+ begin="t212.end"
id="t211"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="483.465 117.75"
- to="483.091 117.75" />
+ dur="0.0692607s"
+ from="82.3816 117.75"
+ to="82.6617 117.75" />
<animateTransform
- begin="r210.begin"
+ begin="t211.end"
id="t210"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="483.091 117.75"
- to="482.718 117.75" />
+ from="82.6617 117.75"
+ to="83.0353 117.75" />
<animateTransform
- begin="r209.begin"
+ begin="t210.end"
id="t209"
attributeName="transform"
type="translate"
- dur="0.0242247s"
- from="482.718 117.75"
- to="482.438 117.75" />
+ dur="0.138521s"
+ from="83.0353 117.75"
+ to="83.5956 117.75" />
<animateTransform
- begin="r208.begin"
+ begin="t209.end"
id="t208"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="482.438 117.75"
- to="482.251 117.75" />
+ dur="0.062256s"
+ from="83.5956 117.75"
+ to="85.8368 117.75" />
<animateTransform
- begin="r207.begin"
+ begin="t208.end"
id="t207"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="482.251 117.75"
- to="482.064 117.75" />
+ dur="0.461738s"
+ from="85.8368 117.75"
+ to="87.7045 117.75" />
<animateTransform
- begin="r206.begin"
+ begin="t207.end"
id="t206"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="482.064 117.75"
- to="481.877 117.75" />
+ dur="0.0622559s"
+ from="87.7045 117.75"
+ to="89.9457 117.75" />
<animateTransform
- begin="r205.begin"
+ begin="t206.end"
id="t205"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="481.877 117.75"
- to="481.691 117.75" />
+ dur="0.18816s"
+ from="89.9457 117.75"
+ to="91.4398 117.75" />
<animateTransform
- begin="r204.begin"
+ begin="t205.end"
id="t204"
attributeName="transform"
type="translate"
- dur="0.0461738s"
- from="481.691 117.75"
- to="481.504 117.75" />
+ dur="0.554085s"
+ from="91.4398 117.75"
+ to="93.681 117.75" />
<animateTransform
- begin="r203.begin"
+ begin="t204.end"
id="t203"
attributeName="transform"
type="translate"
- dur="0.0242247s"
- from="481.504 117.75"
- to="481.224 117.75" />
+ dur="0.664062s"
+ from="93.681 117.75"
+ to="117.587 117.75" />
<animateTransform
- begin="r202.begin"
+ begin="t203.end"
id="t202"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="481.224 117.75"
- to="480.85 117.75" />
+ dur="0.193797s"
+ from="117.587 117.75"
+ to="119.828 117.75" />
<animateTransform
- begin="r201.begin"
+ begin="t202.end"
id="t201"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="480.85 117.75"
- to="480.477 117.75" />
+ dur="0.446167s"
+ from="119.828 117.75"
+ to="135.89 117.75" />
<animateTransform
- begin="r200.begin"
+ begin="t201.end"
id="t200"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="480.477 117.75"
- to="480.103 117.75" />
+ dur="0.09408s"
+ from="135.89 117.75"
+ to="136.638 117.75" />
<animateTransform
- begin="r199.begin"
+ begin="t200.end"
id="t199"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="480.103 117.75"
- to="479.73 117.75" />
+ dur="0.145264s"
+ from="136.638 117.75"
+ to="141.867 117.75" />
<animateTransform
- begin="r198.begin"
+ begin="t199.end"
id="t198"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="479.73 117.75"
- to="479.356 117.75" />
+ dur="0.0484493s"
+ from="141.867 117.75"
+ to="142.427 117.75" />
<animateTransform
- begin="r197.begin"
+ begin="t198.end"
id="t197"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="479.356 117.75"
- to="478.983 117.75" />
+ dur="0.020752s"
+ from="142.427 117.75"
+ to="143.174 117.75" />
<animateTransform
- begin="r196.begin"
+ begin="t197.end"
id="t196"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="478.983 117.75"
- to="478.609 117.75" />
+ dur="0.184695s"
+ from="143.174 117.75"
+ to="143.921 117.75" />
<animateTransform
- begin="r195.begin"
+ begin="t196.end"
id="t195"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="478.609 117.75"
- to="478.235 117.75" />
+ dur="0.0242247s"
+ from="143.921 117.75"
+ to="144.202 117.75" />
<animateTransform
- begin="r194.begin"
+ begin="t195.end"
id="t194"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="478.235 117.75"
- to="477.862 117.75" />
+ dur="0.00518799s"
+ from="144.202 117.75"
+ to="144.388 117.75" />
<animateTransform
- begin="r193.begin"
+ begin="t194.end"
id="t193"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="477.862 117.75"
- to="477.488 117.75" />
+ dur="0.115434s"
+ from="144.388 117.75"
+ to="144.855 117.75" />
<animateTransform
- begin="r192.begin"
+ begin="t193.end"
id="t192"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="477.488 117.75"
- to="477.115 117.75" />
+ dur="0.228272s"
+ from="144.855 117.75"
+ to="153.073 117.75" />
<animateTransform
- begin="r191.begin"
+ begin="t192.end"
id="t191"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="477.115 117.75"
- to="476.741 117.75" />
+ dur="0.0968987s"
+ from="153.073 117.75"
+ to="154.194 117.75" />
<animateTransform
- begin="r190.begin"
+ begin="t191.end"
id="t190"
attributeName="transform"
type="translate"
- dur="0.0242247s"
- from="476.741 117.75"
- to="476.461 117.75" />
+ dur="0.372293s"
+ from="154.194 117.75"
+ to="156.435 117.75" />
<animateTransform
- begin="r189.begin"
+ begin="t190.end"
id="t189"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="476.461 117.75"
- to="476.274 117.75" />
+ dur="2.40723s"
+ from="156.435 117.75"
+ to="243.095 117.75" />
<animateTransform
- begin="r188.begin"
+ begin="t189.end"
id="t188"
attributeName="transform"
type="translate"
- dur="0.0692607s"
- from="476.274 117.75"
- to="475.994 117.75" />
+ dur="0.37632s"
+ from="243.095 117.75"
+ to="246.083 117.75" />
<animateTransform
- begin="r187.begin"
+ begin="t188.end"
id="t187"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="475.994 117.75"
- to="475.621 117.75" />
+ dur="0.74707s"
+ from="246.083 117.75"
+ to="272.978 117.75" />
<animateTransform
- begin="r186.begin"
+ begin="t187.end"
id="t186"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="475.621 117.75"
- to="475.247 117.75" />
+ dur="0.193797s"
+ from="272.978 117.75"
+ to="275.219 117.75" />
<animateTransform
- begin="r185.begin"
+ begin="t186.end"
id="t185"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="475.247 117.75"
- to="474.874 117.75" />
+ dur="0.871582s"
+ from="275.219 117.75"
+ to="306.596 117.75" />
<animateTransform
- begin="r184.begin"
+ begin="t185.end"
id="t184"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="474.874 117.75"
- to="474.5 117.75" />
+ dur="0.210826s"
+ from="306.596 117.75"
+ to="310.331 117.75" />
<animateTransform
- begin="r183.begin"
+ begin="t184.end"
id="t183"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="474.5 117.75"
- to="474.127 117.75" />
+ dur="1.99219s"
+ from="310.331 117.75"
+ to="382.05 117.75" />
<animateTransform
- begin="r182.begin"
+ begin="t183.end"
id="t182"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="474.127 117.75"
- to="473.753 117.75" />
+ dur="0.75264s"
+ from="382.05 117.75"
+ to="388.027 117.75" />
<animateTransform
- begin="r181.begin"
+ begin="t182.end"
id="t181"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="473.753 117.75"
- to="473.38 117.75" />
+ dur="0.249023s"
+ from="388.027 117.75"
+ to="396.992 117.75" />
<animateTransform
- begin="r180.begin"
+ begin="t181.end"
id="t180"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="473.38 117.75"
- to="472.819 117.75" />
+ dur="1.66226s"
+ from="396.992 117.75"
+ to="403.715 117.75" />
<animateTransform
- begin="r179.begin"
+ begin="t180.end"
id="t179"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="472.819 117.75"
- to="472.072 117.75" />
+ dur="0.0830078s"
+ from="403.715 117.75"
+ to="406.703 117.75" />
<animateTransform
- begin="r178.begin"
+ begin="t179.end"
id="t178"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="472.072 117.75"
- to="471.325 117.75" />
+ dur="0.18816s"
+ from="406.703 117.75"
+ to="408.198 117.75" />
<animateTransform
- begin="r177.begin"
+ begin="t178.end"
id="t177"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="471.325 117.75"
- to="470.765 117.75" />
+ dur="0.643311s"
+ from="408.198 117.75"
+ to="431.357 117.75" />
<animateTransform
- begin="r176.begin"
+ begin="t177.end"
id="t176"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="470.765 117.75"
- to="470.391 117.75" />
+ dur="0.387595s"
+ from="431.357 117.75"
+ to="435.839 117.75" />
<animateTransform
- begin="r175.begin"
+ begin="t176.end"
id="t175"
attributeName="transform"
type="translate"
- dur="0.0692607s"
- from="470.391 117.75"
- to="470.111 117.75" />
+ dur="1.32813s"
+ from="435.839 117.75"
+ to="483.652 117.75" />
<animateTransform
- begin="r174.begin"
+ begin="t175.end"
id="t174"
attributeName="transform"
type="translate"
- dur="0.02352s"
- from="470.111 117.75"
- to="469.924 117.75" />
+ dur="0.775189s"
+ from="483.652 117.75"
+ to="492.617 117.75" />
<animateTransform
- begin="r173.begin"
+ begin="t174.end"
id="t173"
attributeName="transform"
type="translate"
- dur="0.00778198s"
- from="469.924 117.75"
- to="469.644 117.75" />
+ dur="1.56991s"
+ from="492.617 117.75"
+ to="498.967 117.75" />
<animateTransform
- begin="r172.begin"
+ begin="t173.end"
id="t172"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="469.644 117.75"
- to="469.271 117.75" />
+ dur="0.186768s"
+ from="498.967 117.75"
+ to="505.69 117.75" />
<animateTransform
- begin="r171.begin"
+ begin="t172.end"
id="t171"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="469.271 117.75"
- to="468.897 117.75" />
+ dur="0.0968987s"
+ from="505.69 117.75"
+ to="506.811 117.75" />
<animateTransform
- begin="r170.begin"
+ begin="t171.end"
id="t170"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="468.897 117.75"
- to="468.524 117.75" />
+ dur="0.207782s"
+ from="506.811 117.75"
+ to="507.651 117.75" />
<animateTransform
- begin="r169.begin"
+ begin="t170.end"
id="t169"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="468.524 117.75"
- to="468.15 117.75" />
+ from="507.651 117.75"
+ to="508.025 117.75" />
<animateTransform
- begin="r168.begin"
+ begin="t169.end"
id="t168"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="468.15 117.75"
- to="467.776 117.75" />
+ dur="0.02352s"
+ from="508.025 117.75"
+ to="508.212 117.75" />
<animateTransform
- begin="r167.begin"
+ begin="t168.end"
id="t167"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="467.776 117.75"
- to="467.403 117.75" />
+ dur="0.080414s"
+ from="508.212 117.75"
+ to="511.107 117.75" />
<animateTransform
- begin="r166.begin"
+ begin="t167.end"
id="t166"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="467.403 117.75"
- to="467.029 117.75" />
+ dur="0.0484493s"
+ from="511.107 117.75"
+ to="511.667 117.75" />
<animateTransform
- begin="r165.begin"
+ begin="t166.end"
id="t165"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="467.029 117.75"
- to="466.656 117.75" />
+ dur="0.166016s"
+ from="511.667 117.75"
+ to="517.643 117.75" />
<animateTransform
- begin="r164.begin"
+ begin="t165.end"
id="t164"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="466.656 117.75"
- to="466.096 117.75" />
+ dur="0.0968987s"
+ from="517.643 117.75"
+ to="518.764 117.75" />
<animateTransform
- begin="r163.begin"
+ begin="t164.end"
id="t163"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="466.096 117.75"
- to="465.348 117.75" />
+ dur="0.646433s"
+ from="518.764 117.75"
+ to="521.379 117.75" />
<animateTransform
- begin="r162.begin"
+ begin="t163.end"
id="t162"
attributeName="transform"
type="translate"
dur="0.020752s"
- from="465.348 117.75"
- to="464.601 117.75" />
+ from="521.379 117.75"
+ to="522.126 117.75" />
<animateTransform
- begin="r161.begin"
+ begin="t162.end"
id="t161"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="464.601 117.75"
- to="463.854 117.75" />
+ dur="0.0968987s"
+ from="522.126 117.75"
+ to="523.246 117.75" />
<animateTransform
- begin="r160.begin"
+ begin="t161.end"
id="t160"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="463.854 117.75"
- to="463.294 117.75" />
+ dur="0.0830078s"
+ from="523.246 117.75"
+ to="526.235 117.75" />
<animateTransform
- begin="r159.begin"
+ begin="t160.end"
id="t159"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="463.294 117.75"
- to="462.921 117.75" />
+ dur="0.277043s"
+ from="526.235 117.75"
+ to="527.355 117.75" />
<animateTransform
- begin="r158.begin"
+ begin="t159.end"
id="t158"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="462.921 117.75"
- to="462.547 117.75" />
+ dur="0.09408s"
+ from="527.355 117.75"
+ to="528.102 117.75" />
<animateTransform
- begin="r157.begin"
+ begin="t158.end"
id="t157"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="462.547 117.75"
- to="462.173 117.75" />
+ dur="0.114136s"
+ from="528.102 117.75"
+ to="532.211 117.75" />
<animateTransform
- begin="r156.begin"
+ begin="t157.end"
id="t156"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="462.173 117.75"
- to="461.8 117.75" />
+ dur="0.277043s"
+ from="532.211 117.75"
+ to="533.332 117.75" />
<animateTransform
- begin="r155.begin"
+ begin="t156.end"
id="t155"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="461.8 117.75"
- to="461.426 117.75" />
+ dur="0.020752s"
+ from="533.332 117.75"
+ to="534.079 117.75" />
<animateTransform
- begin="r154.begin"
+ begin="t155.end"
id="t154"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="461.426 117.75"
- to="461.053 117.75" />
+ dur="0.0968987s"
+ from="534.079 117.75"
+ to="535.2 117.75" />
<animateTransform
- begin="r153.begin"
+ begin="t154.end"
id="t153"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="461.053 117.75"
- to="460.679 117.75" />
+ dur="0.230869s"
+ from="535.2 117.75"
+ to="536.133 117.75" />
<animateTransform
- begin="r152.begin"
+ begin="t153.end"
id="t152"
attributeName="transform"
type="translate"
dur="0.010376s"
- from="460.679 117.75"
- to="460.306 117.75" />
+ from="536.133 117.75"
+ to="536.507 117.75" />
<animateTransform
- begin="r151.begin"
+ begin="t152.end"
id="t151"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="460.306 117.75"
- to="459.932 117.75" />
+ dur="0.0484493s"
+ from="536.507 117.75"
+ to="537.067 117.75" />
<animateTransform
- begin="r150.begin"
+ begin="t151.end"
id="t150"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="459.932 117.75"
- to="459.372 117.75" />
+ dur="0.145264s"
+ from="537.067 117.75"
+ to="542.297 117.75" />
<animateTransform
- begin="r149.begin"
+ begin="t150.end"
id="t149"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="459.372 117.75"
- to="458.625 117.75" />
+ dur="0.09408s"
+ from="542.297 117.75"
+ to="543.044 117.75" />
<animateTransform
- begin="r148.begin"
+ begin="t149.end"
id="t148"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="458.625 117.75"
- to="457.878 117.75" />
+ dur="0.280151s"
+ from="543.044 117.75"
+ to="553.129 117.75" />
<animateTransform
- begin="r147.begin"
+ begin="t148.end"
id="t147"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="457.878 117.75"
- to="457.131 117.75" />
+ dur="0.18816s"
+ from="553.129 117.75"
+ to="554.623 117.75" />
<animateTransform
- begin="r146.begin"
+ begin="t147.end"
id="t146"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="457.131 117.75"
- to="456.57 117.75" />
+ dur="0.0622559s"
+ from="554.623 117.75"
+ to="556.865 117.75" />
<animateTransform
- begin="r145.begin"
+ begin="t146.end"
id="t145"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="456.57 117.75"
- to="456.197 117.75" />
+ dur="0.415564s"
+ from="556.865 117.75"
+ to="558.546 117.75" />
<animateTransform
- begin="r144.begin"
+ begin="t145.end"
id="t144"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="456.197 117.75"
- to="455.823 117.75" />
+ dur="0.041504s"
+ from="558.546 117.75"
+ to="560.04 117.75" />
<animateTransform
- begin="r143.begin"
+ begin="t144.end"
id="t143"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="455.823 117.75"
- to="455.45 117.75" />
+ dur="0.04704s"
+ from="560.04 117.75"
+ to="560.413 117.75" />
<animateTransform
- begin="r142.begin"
+ begin="t143.end"
id="t142"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="455.45 117.75"
- to="455.076 117.75" />
+ dur="0.202332s"
+ from="560.413 117.75"
+ to="567.697 117.75" />
<animateTransform
- begin="r141.begin"
+ begin="t142.end"
id="t141"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="455.076 117.75"
- to="454.703 117.75" />
+ dur="0.09408s"
+ from="567.697 117.75"
+ to="568.444 117.75" />
<animateTransform
- begin="r140.begin"
+ begin="t141.end"
id="t140"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="454.703 117.75"
- to="454.329 117.75" />
+ dur="0.0311279s"
+ from="568.444 117.75"
+ to="569.565 117.75" />
<animateTransform
- begin="r139.begin"
+ begin="t140.end"
id="t139"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="454.329 117.75"
- to="453.956 117.75" />
+ dur="0.207782s"
+ from="569.565 117.75"
+ to="570.405 117.75" />
<animateTransform
- begin="r138.begin"
+ begin="t139.end"
id="t138"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="453.956 117.75"
- to="453.582 117.75" />
+ dur="0.015564s"
+ from="570.405 117.75"
+ to="570.966 117.75" />
<animateTransform
- begin="r137.begin"
+ begin="t138.end"
id="t137"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="453.582 117.75"
- to="453.209 117.75" />
+ dur="0.00518799s"
+ from="570.966 117.75"
+ to="571.152 117.75" />
<animateTransform
- begin="r136.begin"
+ begin="t137.end"
id="t136"
attributeName="transform"
type="translate"
dur="0.015564s"
- from="453.209 117.75"
- to="452.648 117.75" />
+ from="571.152 117.75"
+ to="571.713 117.75" />
<animateTransform
- begin="r135.begin"
+ begin="t136.end"
id="t135"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="452.648 117.75"
- to="451.901 117.75" />
+ dur="0.0242247s"
+ from="571.713 117.75"
+ to="571.993 117.75" />
<animateTransform
- begin="r134.begin"
+ begin="t135.end"
id="t134"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="451.901 117.75"
- to="451.154 117.75" />
+ dur="0.0923475s"
+ from="571.993 117.75"
+ to="571.619 117.75" />
<animateTransform
- begin="r133.begin"
+ begin="t134.end"
id="t133"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="451.154 117.75"
- to="450.594 117.75" />
+ dur="0.049286s"
+ from="571.619 117.75"
+ to="569.845 117.75" />
<animateTransform
- begin="r132.begin"
+ begin="t133.end"
id="t132"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="450.594 117.75"
- to="450.22 117.75" />
+ dur="0.02352s"
+ from="569.845 117.75"
+ to="569.658 117.75" />
<animateTransform
- begin="r131.begin"
+ begin="t132.end"
id="t131"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="450.22 117.75"
- to="449.847 117.75" />
+ dur="0.115434s"
+ from="569.658 117.75"
+ to="569.191 117.75" />
<animateTransform
- begin="r130.begin"
+ begin="t131.end"
id="t130"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="449.847 117.75"
- to="449.473 117.75" />
+ dur="0.243836s"
+ from="569.191 117.75"
+ to="560.413 117.75" />
<animateTransform
- begin="r129.begin"
+ begin="t130.end"
id="t129"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="449.473 117.75"
- to="449.1 117.75" />
+ dur="0.04704s"
+ from="560.413 117.75"
+ to="560.04 117.75" />
<animateTransform
- begin="r128.begin"
+ begin="t129.end"
id="t128"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="449.1 117.75"
- to="448.726 117.75" />
+ dur="0.138521s"
+ from="560.04 117.75"
+ to="559.479 117.75" />
<animateTransform
- begin="r127.begin"
+ begin="t128.end"
id="t127"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="448.726 117.75"
- to="448.353 117.75" />
+ dur="0.10376s"
+ from="559.479 117.75"
+ to="555.744 117.75" />
<animateTransform
- begin="r126.begin"
+ begin="t127.end"
id="t126"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="448.353 117.75"
- to="447.979 117.75" />
+ dur="0.0968987s"
+ from="555.744 117.75"
+ to="554.623 117.75" />
<animateTransform
- begin="r125.begin"
+ begin="t126.end"
id="t125"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="447.979 117.75"
- to="447.606 117.75" />
+ dur="0.124512s"
+ from="554.623 117.75"
+ to="550.141 117.75" />
<animateTransform
- begin="r124.begin"
+ begin="t125.end"
id="t124"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="447.606 117.75"
- to="447.232 117.75" />
+ dur="0.0968987s"
+ from="550.141 117.75"
+ to="549.02 117.75" />
<animateTransform
- begin="r123.begin"
+ begin="t124.end"
id="t123"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="447.232 117.75"
- to="446.672 117.75" />
+ dur="0.041504s"
+ from="549.02 117.75"
+ to="547.526 117.75" />
<animateTransform
- begin="r122.begin"
+ begin="t123.end"
id="t122"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="446.672 117.75"
- to="445.925 117.75" />
+ dur="0.138521s"
+ from="547.526 117.75"
+ to="546.966 117.75" />
<animateTransform
- begin="r121.begin"
+ begin="t122.end"
id="t121"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="445.925 117.75"
- to="445.178 117.75" />
+ dur="0.04704s"
+ from="546.966 117.75"
+ to="546.592 117.75" />
<animateTransform
- begin="r120.begin"
+ begin="t121.end"
id="t120"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="445.178 117.75"
- to="444.617 117.75" />
+ dur="0.3891s"
+ from="546.592 117.75"
+ to="532.585 117.75" />
<animateTransform
- begin="r119.begin"
+ begin="t120.end"
id="t119"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="444.617 117.75"
- to="444.244 117.75" />
+ dur="0.09408s"
+ from="532.585 117.75"
+ to="531.838 117.75" />
<animateTransform
- begin="r118.begin"
+ begin="t119.end"
id="t118"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="444.244 117.75"
- to="443.87 117.75" />
+ dur="0.0622558s"
+ from="531.838 117.75"
+ to="529.597 117.75" />
<animateTransform
- begin="r117.begin"
+ begin="t118.end"
id="t117"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="443.87 117.75"
- to="443.497 117.75" />
+ dur="0.09408s"
+ from="529.597 117.75"
+ to="528.849 117.75" />
<animateTransform
- begin="r116.begin"
+ begin="t117.end"
id="t116"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="443.497 117.75"
- to="443.123 117.75" />
+ dur="0.31128s"
+ from="528.849 117.75"
+ to="517.643 117.75" />
<animateTransform
- begin="r115.begin"
+ begin="t116.end"
id="t115"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="443.123 117.75"
- to="442.75 117.75" />
+ dur="0.0484493s"
+ from="517.643 117.75"
+ to="517.083 117.75" />
<animateTransform
- begin="r114.begin"
+ begin="t115.end"
id="t114"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="442.75 117.75"
- to="442.376 117.75" />
+ dur="0.228272s"
+ from="517.083 117.75"
+ to="508.865 117.75" />
<animateTransform
- begin="r113.begin"
+ begin="t114.end"
id="t113"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="442.376 117.75"
- to="442.003 117.75" />
+ dur="0.04704s"
+ from="508.865 117.75"
+ to="508.492 117.75" />
<animateTransform
- begin="r112.begin"
+ begin="t113.end"
id="t112"
attributeName="transform"
type="translate"
- dur="0.0923475s"
- from="442.003 117.75"
- to="441.629 117.75" />
+ dur="0.140076s"
+ from="508.492 117.75"
+ to="503.449 117.75" />
<animateTransform
- begin="r111.begin"
+ begin="t112.end"
id="t111"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="441.629 117.75"
- to="441.255 117.75" />
+ dur="0.0484493s"
+ from="503.449 117.75"
+ to="502.889 117.75" />
<animateTransform
- begin="r110.begin"
+ begin="t111.end"
id="t110"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="441.255 117.75"
- to="440.695 117.75" />
+ dur="0.10376s"
+ from="502.889 117.75"
+ to="499.153 117.75" />
<animateTransform
- begin="r109.begin"
+ begin="t110.end"
id="t109"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="440.695 117.75"
- to="439.948 117.75" />
+ dur="0.0923475s"
+ from="499.153 117.75"
+ to="498.78 117.75" />
<animateTransform
- begin="r108.begin"
+ begin="t109.end"
id="t108"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="439.948 117.75"
- to="439.201 117.75" />
+ dur="0.0484493s"
+ from="498.78 117.75"
+ to="498.22 117.75" />
<animateTransform
- begin="r107.begin"
+ begin="t108.end"
id="t107"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="439.201 117.75"
- to="438.641 117.75" />
+ dur="0.119324s"
+ from="498.22 117.75"
+ to="493.924 117.75" />
<animateTransform
- begin="r106.begin"
+ begin="t107.end"
id="t106"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="438.641 117.75"
- to="438.267 117.75" />
+ dur="0.04704s"
+ from="493.924 117.75"
+ to="493.55 117.75" />
<animateTransform
- begin="r105.begin"
+ begin="t106.end"
id="t105"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="438.267 117.75"
- to="437.894 117.75" />
+ dur="0.020752s"
+ from="493.55 117.75"
+ to="492.803 117.75" />
<animateTransform
- begin="r104.begin"
+ begin="t105.end"
id="t104"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="437.894 117.75"
- to="437.52 117.75" />
+ dur="0.0923475s"
+ from="492.803 117.75"
+ to="492.43 117.75" />
<animateTransform
- begin="r103.begin"
+ begin="t104.end"
id="t103"
attributeName="transform"
type="translate"
- dur="0.230869s"
- from="437.52 117.75"
- to="436.586 117.75" />
+ dur="0.00778198s"
+ from="492.43 117.75"
+ to="492.15 117.75" />
<animateTransform
- begin="r102.begin"
+ begin="t103.end"
id="t102"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="436.586 117.75"
- to="435.092 117.75" />
+ dur="0.02352s"
+ from="492.15 117.75"
+ to="491.963 117.75" />
<animateTransform
- begin="r101.begin"
+ begin="t102.end"
id="t101"
attributeName="transform"
type="translate"
- dur="0.0311279s"
- from="435.092 117.75"
- to="433.972 117.75" />
+ dur="0.010376s"
+ from="491.963 117.75"
+ to="491.589 117.75" />
<animateTransform
- begin="r100.begin"
+ begin="t101.end"
id="t100"
attributeName="transform"
type="translate"
- dur="0.09408s"
- from="433.972 117.75"
- to="433.224 117.75" />
+ dur="0.00518799s"
+ from="491.589 117.75"
+ to="491.403 117.75" />
<animateTransform
- begin="r99.begin"
+ begin="t100.end"
id="t99"
attributeName="transform"
type="translate"
- dur="0.461738s"
- from="433.224 117.75"
- to="431.357 117.75" />
+ dur="0.015564s"
+ from="491.403 117.75"
+ to="490.842 117.75" />
<animateTransform
- begin="r98.begin"
+ begin="t99.end"
id="t98"
attributeName="transform"
type="translate"
- dur="0.73878s"
- from="431.357 117.75"
- to="428.369 117.75" />
+ dur="0.00518799s"
+ from="490.842 117.75"
+ to="490.656 117.75" />
<animateTransform
- begin="r97.begin"
+ begin="t98.end"
id="t97"
attributeName="transform"
type="translate"
- dur="0.387595s"
- from="428.369 117.75"
- to="423.886 117.75" />
+ dur="0.0461738s"
+ from="490.656 117.75"
+ to="490.469 117.75" />
<animateTransform
- begin="r96.begin"
+ begin="t97.end"
id="t96"
attributeName="transform"
type="translate"
- dur="0.166016s"
- from="423.886 117.75"
- to="417.91 117.75" />
+ dur="0.015564s"
+ from="490.469 117.75"
+ to="489.908 117.75" />
<animateTransform
- begin="r95.begin"
+ begin="t96.end"
id="t95"
attributeName="transform"
type="translate"
- dur="0.387595s"
- from="417.91 117.75"
- to="413.427 117.75" />
+ dur="0.02352s"
+ from="489.908 117.75"
+ to="489.722 117.75" />
<animateTransform
- begin="r94.begin"
+ begin="t95.end"
id="t94"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="413.427 117.75"
- to="410.439 117.75" />
+ dur="0.02594s"
+ from="489.722 117.75"
+ to="488.788 117.75" />
<animateTransform
- begin="r93.begin"
+ begin="t94.end"
id="t93"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="410.439 117.75"
- to="407.451 117.75" />
+ dur="0.02352s"
+ from="488.788 117.75"
+ to="488.601 117.75" />
<animateTransform
- begin="r92.begin"
+ begin="t93.end"
id="t92"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="407.451 117.75"
- to="404.462 117.75" />
+ dur="0.00518799s"
+ from="488.601 117.75"
+ to="488.414 117.75" />
<animateTransform
- begin="r91.begin"
+ begin="t92.end"
id="t91"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="404.462 117.75"
- to="401.474 117.75" />
+ dur="0.00518799s"
+ from="488.414 117.75"
+ to="488.228 117.75" />
<animateTransform
- begin="r90.begin"
+ begin="t91.end"
id="t90"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="401.474 117.75"
- to="398.486 117.75" />
+ dur="0.020752s"
+ from="488.228 117.75"
+ to="487.48 117.75" />
<animateTransform
- begin="r89.begin"
+ begin="t90.end"
id="t89"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="398.486 117.75"
- to="395.497 117.75" />
+ dur="0.00518799s"
+ from="487.48 117.75"
+ to="487.294 117.75" />
<animateTransform
- begin="r88.begin"
+ begin="t89.end"
id="t88"
attributeName="transform"
type="translate"
- dur="0.193797s"
- from="395.497 117.75"
- to="393.256 117.75" />
+ dur="0.015564s"
+ from="487.294 117.75"
+ to="486.733 117.75" />
<animateTransform
- begin="r87.begin"
+ begin="t88.end"
id="t87"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="393.256 117.75"
- to="391.762 117.75" />
+ dur="0.00518799s"
+ from="486.733 117.75"
+ to="486.547 117.75" />
<animateTransform
- begin="r86.begin"
+ begin="t87.end"
id="t86"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="391.762 117.75"
- to="390.268 117.75" />
+ dur="0.015564s"
+ from="486.547 117.75"
+ to="485.986 117.75" />
<animateTransform
- begin="r85.begin"
+ begin="t86.end"
id="t85"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="390.268 117.75"
- to="388.774 117.75" />
+ dur="0.00518799s"
+ from="485.986 117.75"
+ to="485.8 117.75" />
<animateTransform
- begin="r84.begin"
+ begin="t85.end"
id="t84"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="388.774 117.75"
- to="387.28 117.75" />
+ dur="0.0461738s"
+ from="485.8 117.75"
+ to="485.613 117.75" />
<animateTransform
- begin="r83.begin"
+ begin="t84.end"
id="t83"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="387.28 117.75"
- to="385.786 117.75" />
+ dur="0.0242247s"
+ from="485.613 117.75"
+ to="485.333 117.75" />
<animateTransform
- begin="r82.begin"
+ begin="t83.end"
id="t82"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="385.786 117.75"
- to="384.291 117.75" />
+ dur="0.072632s"
+ from="485.333 117.75"
+ to="482.718 117.75" />
<animateTransform
- begin="r81.begin"
+ begin="t82.end"
id="t81"
attributeName="transform"
type="translate"
- dur="0.0968987s"
- from="384.291 117.75"
- to="383.171 117.75" />
+ dur="0.0242247s"
+ from="482.718 117.75"
+ to="482.438 117.75" />
<animateTransform
- begin="r80.begin"
+ begin="t81.end"
id="t80"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="383.171 117.75"
- to="382.424 117.75" />
+ dur="0.015564s"
+ from="482.438 117.75"
+ to="481.877 117.75" />
<animateTransform
- begin="r79.begin"
+ begin="t80.end"
id="t79"
attributeName="transform"
type="translate"
- dur="0.461738s"
- from="382.424 117.75"
- to="380.556 117.75" />
+ dur="0.00518799s"
+ from="481.877 117.75"
+ to="481.691 117.75" />
<animateTransform
- begin="r78.begin"
+ begin="t79.end"
id="t78"
attributeName="transform"
type="translate"
- dur="0.193797s"
- from="380.556 117.75"
- to="378.315 117.75" />
+ dur="0.0461738s"
+ from="481.691 117.75"
+ to="481.504 117.75" />
<animateTransform
- begin="r77.begin"
+ begin="t78.end"
id="t77"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="378.315 117.75"
- to="376.821 117.75" />
+ dur="0.0242247s"
+ from="481.504 117.75"
+ to="481.224 117.75" />
<animateTransform
- begin="r76.begin"
+ begin="t77.end"
id="t76"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="376.821 117.75"
- to="375.327 117.75" />
+ dur="0.124512s"
+ from="481.224 117.75"
+ to="476.741 117.75" />
<animateTransform
- begin="r75.begin"
+ begin="t76.end"
id="t75"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="375.327 117.75"
- to="373.832 117.75" />
+ dur="0.0242247s"
+ from="476.741 117.75"
+ to="476.461 117.75" />
<animateTransform
- begin="r74.begin"
+ begin="t75.end"
id="t74"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="373.832 117.75"
- to="372.338 117.75" />
+ dur="0.00518799s"
+ from="476.461 117.75"
+ to="476.274 117.75" />
<animateTransform
- begin="r73.begin"
+ begin="t74.end"
id="t73"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="372.338 117.75"
- to="370.844 117.75" />
+ dur="0.0692607s"
+ from="476.274 117.75"
+ to="475.994 117.75" />
<animateTransform
- begin="r72.begin"
+ begin="t73.end"
id="t72"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="370.844 117.75"
- to="369.35 117.75" />
+ dur="0.062256s"
+ from="475.994 117.75"
+ to="473.753 117.75" />
<animateTransform
- begin="r71.begin"
+ begin="t72.end"
id="t71"
attributeName="transform"
type="translate"
- dur="0.0968987s"
- from="369.35 117.75"
- to="368.229 117.75" />
+ dur="0.04704s"
+ from="473.753 117.75"
+ to="473.38 117.75" />
<animateTransform
- begin="r70.begin"
+ begin="t71.end"
id="t70"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="368.229 117.75"
- to="367.482 117.75" />
+ dur="0.057068s"
+ from="473.38 117.75"
+ to="471.325 117.75" />
<animateTransform
- begin="r69.begin"
+ begin="t70.end"
id="t69"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="367.482 117.75"
- to="366.735 117.75" />
+ dur="0.0484493s"
+ from="471.325 117.75"
+ to="470.765 117.75" />
<animateTransform
- begin="r68.begin"
+ begin="t69.end"
id="t68"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="366.735 117.75"
- to="365.988 117.75" />
+ dur="0.010376s"
+ from="470.765 117.75"
+ to="470.391 117.75" />
<animateTransform
- begin="r67.begin"
+ begin="t68.end"
id="t67"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="365.988 117.75"
- to="365.241 117.75" />
+ dur="0.0692607s"
+ from="470.391 117.75"
+ to="470.111 117.75" />
<animateTransform
- begin="r66.begin"
+ begin="t67.end"
id="t66"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="365.241 117.75"
- to="364.494 117.75" />
+ dur="0.02352s"
+ from="470.111 117.75"
+ to="469.924 117.75" />
<animateTransform
- begin="r65.begin"
+ begin="t66.end"
id="t65"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="364.494 117.75"
- to="363.747 117.75" />
+ dur="0.09079s"
+ from="469.924 117.75"
+ to="466.656 117.75" />
<animateTransform
- begin="r64.begin"
+ begin="t65.end"
id="t64"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="363.747 117.75"
- to="363 117.75" />
+ dur="0.0484493s"
+ from="466.656 117.75"
+ to="466.096 117.75" />
<animateTransform
- begin="r63.begin"
+ begin="t64.end"
id="t63"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="363 117.75"
- to="362.44 117.75" />
+ dur="0.062256s"
+ from="466.096 117.75"
+ to="463.854 117.75" />
<animateTransform
- begin="r62.begin"
+ begin="t63.end"
id="t62"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="362.44 117.75"
- to="362.066 117.75" />
+ dur="0.0484493s"
+ from="463.854 117.75"
+ to="463.294 117.75" />
<animateTransform
- begin="r61.begin"
+ begin="t62.end"
id="t61"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="362.066 117.75"
- to="361.692 117.75" />
+ dur="0.083008s"
+ from="463.294 117.75"
+ to="460.306 117.75" />
<animateTransform
- begin="r60.begin"
+ begin="t61.end"
id="t60"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="361.692 117.75"
- to="361.319 117.75" />
+ dur="0.0923475s"
+ from="460.306 117.75"
+ to="459.932 117.75" />
<animateTransform
- begin="r59.begin"
+ begin="t60.end"
id="t59"
attributeName="transform"
type="translate"
- dur="0.230869s"
- from="361.319 117.75"
- to="360.385 117.75" />
+ dur="0.0484493s"
+ from="459.932 117.75"
+ to="459.372 117.75" />
<animateTransform
- begin="r58.begin"
+ begin="t59.end"
id="t58"
attributeName="transform"
type="translate"
- dur="0.0968987s"
- from="360.385 117.75"
- to="359.265 117.75" />
+ dur="0.062256s"
+ from="459.372 117.75"
+ to="457.131 117.75" />
<animateTransform
- begin="r57.begin"
+ begin="t58.end"
id="t57"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="359.265 117.75"
- to="358.517 117.75" />
+ dur="0.0484493s"
+ from="457.131 117.75"
+ to="456.57 117.75" />
<animateTransform
- begin="r56.begin"
+ begin="t57.end"
id="t56"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="358.517 117.75"
- to="357.77 117.75" />
+ dur="0.072632s"
+ from="456.57 117.75"
+ to="453.956 117.75" />
<animateTransform
- begin="r55.begin"
+ begin="t56.end"
id="t55"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="357.77 117.75"
- to="357.023 117.75" />
+ dur="0.0923475s"
+ from="453.956 117.75"
+ to="453.582 117.75" />
<animateTransform
- begin="r54.begin"
+ begin="t55.end"
id="t54"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="357.023 117.75"
- to="356.276 117.75" />
+ dur="0.04704s"
+ from="453.582 117.75"
+ to="453.209 117.75" />
<animateTransform
- begin="r53.begin"
+ begin="t54.end"
id="t53"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="356.276 117.75"
- to="355.529 117.75" />
+ dur="0.057068s"
+ from="453.209 117.75"
+ to="451.154 117.75" />
<animateTransform
- begin="r52.begin"
+ begin="t53.end"
id="t52"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="355.529 117.75"
- to="354.782 117.75" />
+ dur="0.0484493s"
+ from="451.154 117.75"
+ to="450.594 117.75" />
<animateTransform
- begin="r51.begin"
+ begin="t52.end"
id="t51"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="354.782 117.75"
- to="354.222 117.75" />
+ dur="0.072632s"
+ from="450.594 117.75"
+ to="447.979 117.75" />
<animateTransform
- begin="r50.begin"
+ begin="t51.end"
id="t50"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="354.222 117.75"
- to="353.848 117.75" />
+ dur="0.0923475s"
+ from="447.979 117.75"
+ to="447.606 117.75" />
<animateTransform
- begin="r49.begin"
+ begin="t50.end"
id="t49"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="353.848 117.75"
- to="353.475 117.75" />
+ dur="0.04704s"
+ from="447.606 117.75"
+ to="447.232 117.75" />
<animateTransform
- begin="r48.begin"
+ begin="t49.end"
id="t48"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="353.475 117.75"
- to="353.101 117.75" />
+ dur="0.072632s"
+ from="447.232 117.75"
+ to="444.617 117.75" />
<animateTransform
- begin="r47.begin"
+ begin="t48.end"
id="t47"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="353.101 117.75"
- to="352.728 117.75" />
+ dur="0.04704s"
+ from="444.617 117.75"
+ to="444.244 117.75" />
<animateTransform
- begin="r46.begin"
+ begin="t47.end"
id="t46"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="352.728 117.75"
- to="352.354 117.75" />
+ dur="0.062256s"
+ from="444.244 117.75"
+ to="442.003 117.75" />
<animateTransform
- begin="r45.begin"
+ begin="t46.end"
id="t45"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="352.354 117.75"
- to="351.981 117.75" />
+ dur="0.0923475s"
+ from="442.003 117.75"
+ to="441.629 117.75" />
<animateTransform
- begin="r44.begin"
+ begin="t45.end"
id="t44"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="351.981 117.75"
- to="351.607 117.75" />
+ dur="0.04704s"
+ from="441.629 117.75"
+ to="441.255 117.75" />
<animateTransform
- begin="r43.begin"
+ begin="t44.end"
id="t43"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="351.607 117.75"
- to="351.234 117.75" />
+ dur="0.057068s"
+ from="441.255 117.75"
+ to="439.201 117.75" />
<animateTransform
- begin="r42.begin"
+ begin="t43.end"
id="t42"
attributeName="transform"
type="translate"
- dur="0.0242247s"
- from="351.234 117.75"
- to="350.953 117.75" />
+ dur="0.0484493s"
+ from="439.201 117.75"
+ to="438.641 117.75" />
<animateTransform
- begin="r41.begin"
+ begin="t42.end"
id="t41"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="350.953 117.75"
- to="350.767 117.75" />
+ dur="0.031128s"
+ from="438.641 117.75"
+ to="437.52 117.75" />
<animateTransform
- begin="r40.begin"
+ begin="t41.end"
id="t40"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="350.767 117.75"
- to="350.58 117.75" />
+ dur="0.230869s"
+ from="437.52 117.75"
+ to="436.586 117.75" />
<animateTransform
- begin="r39.begin"
+ begin="t40.end"
id="t39"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="350.58 117.75"
- to="350.393 117.75" />
+ dur="0.0726318s"
+ from="436.586 117.75"
+ to="433.972 117.75" />
<animateTransform
- begin="r38.begin"
+ begin="t39.end"
id="t38"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="350.393 117.75"
- to="350.206 117.75" />
+ dur="0.09408s"
+ from="433.972 117.75"
+ to="433.224 117.75" />
<animateTransform
- begin="r37.begin"
+ begin="t38.end"
id="t37"
attributeName="transform"
type="translate"
- dur="0.00518799s"
- from="350.206 117.75"
- to="350.02 117.75" />
+ dur="1.20052s"
+ from="433.224 117.75"
+ to="428.369 117.75" />
<animateTransform
- begin="r36.begin"
+ begin="t37.end"
id="t36"
attributeName="transform"
type="translate"
- dur="0.115434s"
- from="350.02 117.75"
- to="349.553 117.75" />
+ dur="0.387595s"
+ from="428.369 117.75"
+ to="423.886 117.75" />
<animateTransform
- begin="r35.begin"
+ begin="t36.end"
id="t35"
attributeName="transform"
type="translate"
- dur="0.0484493s"
- from="349.553 117.75"
- to="348.992 117.75" />
+ dur="0.166016s"
+ from="423.886 117.75"
+ to="417.91 117.75" />
<animateTransform
- begin="r34.begin"
+ begin="t35.end"
id="t34"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="348.992 117.75"
- to="348.619 117.75" />
+ dur="0.387595s"
+ from="417.91 117.75"
+ to="413.427 117.75" />
<animateTransform
- begin="r33.begin"
+ begin="t34.end"
id="t33"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="348.619 117.75"
- to="348.245 117.75" />
+ dur="0.498047s"
+ from="413.427 117.75"
+ to="395.497 117.75" />
<animateTransform
- begin="r32.begin"
+ begin="t33.end"
id="t32"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="348.245 117.75"
- to="347.872 117.75" />
+ dur="0.193797s"
+ from="395.497 117.75"
+ to="393.256 117.75" />
<animateTransform
- begin="r31.begin"
+ begin="t32.end"
id="t31"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="347.872 117.75"
- to="347.498 117.75" />
+ dur="0.249023s"
+ from="393.256 117.75"
+ to="384.291 117.75" />
<animateTransform
- begin="r30.begin"
+ begin="t31.end"
id="t30"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="347.498 117.75"
- to="347.125 117.75" />
+ dur="0.0968987s"
+ from="384.291 117.75"
+ to="383.171 117.75" />
<animateTransform
- begin="r29.begin"
+ begin="t30.end"
id="t29"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="347.125 117.75"
- to="346.751 117.75" />
+ dur="0.020752s"
+ from="383.171 117.75"
+ to="382.424 117.75" />
<animateTransform
- begin="r28.begin"
+ begin="t29.end"
id="t28"
attributeName="transform"
type="translate"
- dur="0.00778198s"
- from="346.751 117.75"
- to="346.471 117.75" />
+ dur="0.461738s"
+ from="382.424 117.75"
+ to="380.556 117.75" />
<animateTransform
- begin="r27.begin"
+ begin="t28.end"
id="t27"
attributeName="transform"
type="translate"
- dur="0.02352s"
- from="346.471 117.75"
- to="346.284 117.75" />
+ dur="0.193797s"
+ from="380.556 117.75"
+ to="378.315 117.75" />
<animateTransform
- begin="r26.begin"
+ begin="t27.end"
id="t26"
attributeName="transform"
type="translate"
- dur="0.115434s"
- from="346.284 117.75"
- to="345.817 117.75" />
+ dur="0.249023s"
+ from="378.315 117.75"
+ to="369.35 117.75" />
<animateTransform
- begin="r25.begin"
+ begin="t26.end"
id="t25"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="345.817 117.75"
- to="345.07 117.75" />
+ dur="0.0968987s"
+ from="369.35 117.75"
+ to="368.229 117.75" />
<animateTransform
- begin="r24.begin"
+ begin="t25.end"
id="t24"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="345.07 117.75"
- to="344.323 117.75" />
+ dur="0.145264s"
+ from="368.229 117.75"
+ to="363 117.75" />
<animateTransform
- begin="r23.begin"
+ begin="t24.end"
id="t23"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="344.323 117.75"
- to="343.576 117.75" />
+ dur="0.0484493s"
+ from="363 117.75"
+ to="362.44 117.75" />
<animateTransform
- begin="r22.begin"
+ begin="t23.end"
id="t22"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="343.576 117.75"
- to="342.829 117.75" />
+ dur="0.031128s"
+ from="362.44 117.75"
+ to="361.319 117.75" />
<animateTransform
- begin="r21.begin"
+ begin="t22.end"
id="t21"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="342.829 117.75"
- to="342.082 117.75" />
+ dur="0.230869s"
+ from="361.319 117.75"
+ to="360.385 117.75" />
<animateTransform
- begin="r20.begin"
+ begin="t21.end"
id="t20"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="342.082 117.75"
- to="341.335 117.75" />
+ dur="0.0968987s"
+ from="360.385 117.75"
+ to="359.265 117.75" />
<animateTransform
- begin="r19.begin"
+ begin="t20.end"
id="t19"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="341.335 117.75"
- to="340.588 117.75" />
+ dur="0.140076s"
+ from="359.265 117.75"
+ to="354.222 117.75" />
<animateTransform
- begin="r18.begin"
+ begin="t19.end"
id="t18"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="340.588 117.75"
- to="339.841 117.75" />
+ dur="0.04704s"
+ from="354.222 117.75"
+ to="353.848 117.75" />
<animateTransform
- begin="r17.begin"
+ begin="t18.end"
id="t17"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="339.841 117.75"
- to="339.094 117.75" />
+ dur="0.072632s"
+ from="353.848 117.75"
+ to="351.234 117.75" />
<animateTransform
- begin="r16.begin"
+ begin="t17.end"
id="t16"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="339.094 117.75"
- to="338.347 117.75" />
+ dur="0.0242247s"
+ from="351.234 117.75"
+ to="350.953 117.75" />
<animateTransform
- begin="r15.begin"
+ begin="t16.end"
id="t15"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="338.347 117.75"
- to="337.599 117.75" />
+ dur="0.00518799s"
+ from="350.953 117.75"
+ to="350.767 117.75" />
<animateTransform
- begin="r14.begin"
+ begin="t15.end"
id="t14"
attributeName="transform"
type="translate"
- dur="0.020752s"
- from="337.599 117.75"
- to="336.852 117.75" />
+ dur="0.015564s"
+ from="350.767 117.75"
+ to="350.206 117.75" />
<animateTransform
- begin="r13.begin"
+ begin="t14.end"
id="t13"
attributeName="transform"
type="translate"
- dur="0.015564s"
- from="336.852 117.75"
- to="336.292 117.75" />
+ dur="0.00518799s"
+ from="350.206 117.75"
+ to="350.02 117.75" />
<animateTransform
- begin="r12.begin"
+ begin="t13.end"
id="t12"
attributeName="transform"
type="translate"
- dur="0.04704s"
- from="336.292 117.75"
- to="335.919 117.75" />
+ dur="0.115434s"
+ from="350.02 117.75"
+ to="349.553 117.75" />
<animateTransform
- begin="r11.begin"
+ begin="t12.end"
id="t11"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="335.919 117.75"
- to="335.545 117.75" />
+ dur="0.0484493s"
+ from="349.553 117.75"
+ to="348.992 117.75" />
<animateTransform
- begin="r10.begin"
+ begin="t11.end"
id="t10"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="335.545 117.75"
- to="335.171 117.75" />
+ dur="0.070038s"
+ from="348.992 117.75"
+ to="346.471 117.75" />
<animateTransform
- begin="r9.begin"
+ begin="t10.end"
id="t9"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="335.171 117.75"
- to="334.798 117.75" />
+ dur="0.02352s"
+ from="346.471 117.75"
+ to="346.284 117.75" />
<animateTransform
- begin="r8.begin"
+ begin="t9.end"
id="t8"
attributeName="transform"
type="translate"
- dur="0.010376s"
- from="334.798 117.75"
- to="334.424 117.75" />
+ dur="0.115434s"
+ from="346.284 117.75"
+ to="345.817 117.75" />
<animateTransform
- begin="r7.begin"
+ begin="t8.end"
id="t7"
attributeName="transform"
type="translate"
- dur="0.415564s"
- from="334.424 117.75"
- to="332.744 117.75" />
+ dur="0.264588s"
+ from="345.817 117.75"
+ to="336.292 117.75" />
<animateTransform
- begin="r6.begin"
+ begin="t7.end"
id="t6"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="332.744 117.75"
- to="329.755 117.75" />
+ dur="0.04704s"
+ from="336.292 117.75"
+ to="335.919 117.75" />
<animateTransform
- begin="r5.begin"
+ begin="t6.end"
id="t5"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="329.755 117.75"
- to="326.767 117.75" />
+ dur="0.041504s"
+ from="335.919 117.75"
+ to="334.424 117.75" />
<animateTransform
- begin="r4.begin"
+ begin="t5.end"
id="t4"
attributeName="transform"
type="translate"
- dur="0.0830078s"
- from="326.767 117.75"
- to="323.779 117.75" />
+ dur="0.415564s"
+ from="334.424 117.75"
+ to="332.744 117.75" />
<animateTransform
- begin="r3.begin"
+ begin="t4.end"
id="t3"
attributeName="transform"
type="translate"
- dur="0.193797s"
- from="323.779 117.75"
- to="321.537 117.75" />
+ dur="0.249023s"
+ from="332.744 117.75"
+ to="323.779 117.75" />
<animateTransform
- begin="r2.begin"
+ begin="t3.end"
id="t2"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="321.537 117.75"
- to="320.043 117.75" />
+ dur="0.193797s"
+ from="323.779 117.75"
+ to="321.537 117.75" />
<animateTransform
- begin="r1.begin"
+ begin="t2.end"
id="t1"
attributeName="transform"
type="translate"
- dur="0.0415039s"
- from="320.043 117.75"
+ dur="0.0830078s"
+ from="321.537 117.75"
to="318.549 117.75" />
+ <set
+ id="show-while-playing"
+ begin="playing.begin"
+ end="t1.end"
+ attributeName="visibility"
+ to="visible" />
</g>
<path
style="fill:none;stroke:#002b36;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
@@ -15316,5 +5658,25 @@
id="path3789"
d="m 389.88954,189.74505 27,0"
style="fill:none;stroke:#002b36;stroke-width:1.79999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+ <text
+ style="fill:#d70000;fill-opacity:1;font-family:'Roboto Condensed',sans-serif;font-weight:bold"
+ xml:space="preserve"
+ x="0"
+ y="436"
+ id="text3682"
+ sodipodi:linespacing="125%">
+ <tspan
+ sodipodi:role="line"
+ id="tspan3684"
+ x="0"
+ y="436">Hover/click to start animation</tspan>
+ <set
+ id="playing"
+ begin="svg2.mouseover;svg2.click;svg2.activate"
+ dur="48s"
+ restart="whenNotActive"
+ attributeName="visibility"
+ to="hidden" />
+ </text>
</g>
</svg>
diff --git a/doc/image/cameleon-start-end.svg.eps b/doc/image/cameleon-start-end.svg.eps
index 1b16415..e47b391 100644
--- a/doc/image/cameleon-start-end.svg.eps
+++ b/doc/image/cameleon-start-end.svg.eps
@@ -1,6 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.0 (http://cairographics.org)
-%%CreationDate: Tue May 31 08:23:55 2016
+%%CreationDate: Sun Nov 20 14:47:50 2016
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
diff --git a/doc/image/cameleon-transition.svg.eps b/doc/image/cameleon-transition.svg.eps
index 95ba02c..0173811 100644
--- a/doc/image/cameleon-transition.svg.eps
+++ b/doc/image/cameleon-transition.svg.eps
@@ -1,6 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.0 (http://cairographics.org)
-%%CreationDate: Tue May 31 08:23:56 2016
+%%CreationDate: Sun Nov 20 14:47:50 2016
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
diff --git a/doc/image/inverse-power.svg.eps b/doc/image/inverse-power.svg.eps
index 9ab3cbc..9dcae33 100644
--- a/doc/image/inverse-power.svg.eps
+++ b/doc/image/inverse-power.svg.eps
@@ -1,6 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.0 (http://cairographics.org)
-%%CreationDate: Tue May 31 08:23:56 2016
+%%CreationDate: Sun Nov 20 14:47:50 2016
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
diff --git a/doc/image/octave-interval.ly.pdf b/doc/image/octave-interval.ly.pdf
index 825c2cf..26dec18 100644
Binary files a/doc/image/octave-interval.ly.pdf and b/doc/image/octave-interval.ly.pdf differ
diff --git a/inst/@infsup/abs.m b/inst/@infsup/abs.m
index baee778..e0645c6 100644
--- a/inst/@infsup/abs.m
+++ b/inst/@infsup/abs.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = abs (x)
+function x = abs (x)
if (nargin ~= 1)
print_usage ();
@@ -48,42 +48,54 @@ l = x.inf;
u = x.sup;
## This is even correct, if the interval(s) are empty.
-notpositive = x.sup <= 0;
-l (notpositive) = -x.sup (notpositive);
-u (notpositive) = -x.inf (notpositive);
+notpositive = (x.sup <= 0);
+l(notpositive) = -x.sup(notpositive);
+u(notpositive) = -x.inf(notpositive);
-zerointerior = x.inf < 0 & not (notpositive);
-l (zerointerior) = 0;
-u (zerointerior) = max (-x.inf (zerointerior), x.sup (zerointerior));
+zerointerior = (x.inf < 0 & not (notpositive));
+l(zerointerior) = -0;
+u(zerointerior) = max (-x.inf(zerointerior), x.sup(zerointerior));
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "Empty interval";
-%! assert (abs (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (abs (infsup (1)) == infsup (1));
-%! assert (abs (infsup (0)) == infsup (0));
-%! assert (abs (infsup (-1)) == infsup (1));
-%! assert (abs (infsup (realmax)) == infsup (realmax));
-%! assert (abs (infsup (realmin)) == infsup (realmin));
-%! assert (abs (infsup (-realmin)) == infsup (realmin));
-%! assert (abs (infsup (-realmax)) == infsup (realmax));
-%!test "Bounded intervals";
-%! assert (abs (infsup (1, 2)) == infsup (1, 2));
-%! assert (abs (infsup (0, 1)) == infsup (0, 1));
-%! assert (abs (infsup (-1, 1)) == infsup (0, 1));
-%! assert (abs (infsup (-1, 0)) == infsup (0, 1));
-%! assert (abs (infsup (-2, -1)) == infsup (1, 2));
-%!test "Unbounded intervals";
-%! assert (abs (infsup (0, inf)) == infsup (0, inf));
-%! assert (abs (infsup (-inf, inf)) == infsup (0, inf));
-%! assert (abs (infsup (-inf, 0)) == infsup (0, inf));
-%! assert (abs (infsup (1, inf)) == infsup (1, inf));
-%! assert (abs (infsup (-1, inf)) == infsup (0, inf));
-%! assert (abs (infsup (-inf, -1)) == infsup (1, inf));
-%! assert (abs (infsup (-inf, 1)) == infsup (0, inf));
-%!test "from the documentation string";
-%! assert (abs (infsup (2.5, 3.5)) == infsup (2.5, 3.5));
-%! assert (abs (infsup (-0.5, 5.5)) == infsup (0, 5.5));
+%!# Empty interval
+%!assert (abs (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (abs (infsup (1)) == infsup (1));
+%!assert (abs (infsup (0)) == infsup (0));
+%!assert (abs (infsup (-1)) == infsup (1));
+%!assert (abs (infsup (realmax)) == infsup (realmax));
+%!assert (abs (infsup (realmin)) == infsup (realmin));
+%!assert (abs (infsup (-realmin)) == infsup (realmin));
+%!assert (abs (infsup (-realmax)) == infsup (realmax));
+
+%!# Bounded intervals
+%!assert (abs (infsup (1, 2)) == infsup (1, 2));
+%!assert (abs (infsup (0, 1)) == infsup (0, 1));
+%!assert (abs (infsup (-1, 1)) == infsup (0, 1));
+%!assert (abs (infsup (-1, 0)) == infsup (0, 1));
+%!assert (abs (infsup (-2, -1)) == infsup (1, 2));
+
+%!# Unbounded intervals
+%!assert (abs (infsup (0, inf)) == infsup (0, inf));
+%!assert (abs (infsup (-inf, inf)) == infsup (0, inf));
+%!assert (abs (infsup (-inf, 0)) == infsup (0, inf));
+%!assert (abs (infsup (1, inf)) == infsup (1, inf));
+%!assert (abs (infsup (-1, inf)) == infsup (0, inf));
+%!assert (abs (infsup (-inf, -1)) == infsup (1, inf));
+%!assert (abs (infsup (-inf, 1)) == infsup (0, inf));
+
+%!# from the documentation string
+%!assert (abs (infsup (2.5, 3.5)) == infsup (2.5, 3.5));
+%!assert (abs (infsup (-0.5, 5.5)) == infsup (0, 5.5));
+
+%!# correct use of signed zeros
+%!assert (signbit (inf (abs (infsup (-1, 0)))));
+%!test
+%! x = abs (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/absrev.m b/inst/@infsup/absrev.m
index fcecc69..fcf5a2a 100644
--- a/inst/@infsup/absrev.m
+++ b/inst/@infsup/absrev.m
@@ -61,33 +61,37 @@ result = union (intersect (p, x), intersect (n, x));
endfunction
-%!test "Empty interval";
-%! assert (absrev (infsup ()) == infsup ());
-%! assert (absrev (infsup (0, 1), infsup ()) == infsup ());
-%! assert (absrev (infsup (0, 1), infsup (7, 9)) == infsup ());
-%! assert (absrev (infsup (), infsup (0, 1)) == infsup ());
-%! assert (absrev (infsup (-2, -1)) == infsup ());
-%!test "Singleton intervals";
-%! assert (absrev (infsup (1)) == infsup (-1, 1));
-%! assert (absrev (infsup (0)) == infsup (0));
-%! assert (absrev (infsup (-1)) == infsup ());
-%! assert (absrev (infsup (realmax)) == infsup (-realmax, realmax));
-%! assert (absrev (infsup (realmin)) == infsup (-realmin, realmin));
-%! assert (absrev (infsup (-realmin)) == infsup ());
-%! assert (absrev (infsup (-realmax)) == infsup ());
-%!test "Bound intervals";
-%! assert (absrev (infsup (1, 2)) == infsup (-2, 2));
-%! assert (absrev (infsup (1, 2), infsup (0, 2)) == infsup (1, 2));
-%! assert (absrev (infsup (0, 1), infsup (-0.5, 2)) == infsup (-0.5, 1));
-%! assert (absrev (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (absrev (infsup (-1, 0)) == infsup (0));
-%!test "Unbound intervals";
-%! assert (absrev (infsup (0, inf)) == infsup (-inf, inf));
-%! assert (absrev (infsup (-inf, inf)) == infsup (-inf, inf));
-%! assert (absrev (infsup (-inf, 0)) == infsup (0));
-%! assert (absrev (infsup (1, inf), infsup (-inf, 0)) == infsup (-inf, -1));
-%! assert (absrev (infsup (-1, inf)) == infsup (-inf, inf));
-%! assert (absrev (infsup (-inf, -1)) == infsup ());
-%! assert (absrev (infsup (-inf, 1)) == infsup (-1, 1));
-%!test "from the documentation string";
-%! assert (absrev (infsup (-2, 1)) == infsup (-1, 1));
+%!# Empty interval
+%!assert (absrev (infsup ()) == infsup ());
+%!assert (absrev (infsup (0, 1), infsup ()) == infsup ());
+%!assert (absrev (infsup (0, 1), infsup (7, 9)) == infsup ());
+%!assert (absrev (infsup (), infsup (0, 1)) == infsup ());
+%!assert (absrev (infsup (-2, -1)) == infsup ());
+
+%!# Singleton intervals
+%!assert (absrev (infsup (1)) == infsup (-1, 1));
+%!assert (absrev (infsup (0)) == infsup (0));
+%!assert (absrev (infsup (-1)) == infsup ());
+%!assert (absrev (infsup (realmax)) == infsup (-realmax, realmax));
+%!assert (absrev (infsup (realmin)) == infsup (-realmin, realmin));
+%!assert (absrev (infsup (-realmin)) == infsup ());
+%!assert (absrev (infsup (-realmax)) == infsup ());
+
+%!# Bound intervals
+%!assert (absrev (infsup (1, 2)) == infsup (-2, 2));
+%!assert (absrev (infsup (1, 2), infsup (0, 2)) == infsup (1, 2));
+%!assert (absrev (infsup (0, 1), infsup (-0.5, 2)) == infsup (-0.5, 1));
+%!assert (absrev (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (absrev (infsup (-1, 0)) == infsup (0));
+
+%!# Unbound intervals
+%!assert (absrev (infsup (0, inf)) == infsup (-inf, inf));
+%!assert (absrev (infsup (-inf, inf)) == infsup (-inf, inf));
+%!assert (absrev (infsup (-inf, 0)) == infsup (0));
+%!assert (absrev (infsup (1, inf), infsup (-inf, 0)) == infsup (-inf, -1));
+%!assert (absrev (infsup (-1, inf)) == infsup (-inf, inf));
+%!assert (absrev (infsup (-inf, -1)) == infsup ());
+%!assert (absrev (infsup (-inf, 1)) == infsup (-1, 1));
+
+%!# from the documentation string
+%!assert (absrev (infsup (-2, 1)) == infsup (-1, 1));
diff --git a/inst/@infsup/acos.m b/inst/@infsup/acos.m
index 03305d0..8f7bd06 100644
--- a/inst/@infsup/acos.m
+++ b/inst/@infsup/acos.m
@@ -34,43 +34,56 @@
## Keywords: interval
## Created: 2014-10-06
-function result = acos (x)
+function x = acos (x)
if (nargin ~= 1)
print_usage ();
return
endif
-x = intersect (x, infsup (-1, 1));
+persistent domain = infsup (-1, 1);
+x = intersect (x, domain);
## acos is monotonically decreasing from (-1, pi) to (+1, 0)
l = mpfr_function_d ('acos', -inf, x.sup);
u = mpfr_function_d ('acos', +inf, x.inf);
+l(l == 0) = -0;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "Empty interval";
-%! assert (acos (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (acos (infsup (-1)) == infsup ("pi"));
-%! assert (subset (acos (infsup (-.5)), union ((infsup ("pi") / 2), infsup ("pi"))));
-%! assert (acos (infsup (0)) == infsup ("pi") / 2);
-%! assert (subset (acos (infsup (.5)), union ((infsup ("pi") / 2), infsup (0))));
-%! assert (acos (infsup (1)) == infsup (0));
-%!test "Bounded intervals";
-%! assert (acos (infsup (-1, 0)) == union ((infsup ("pi") / 2), infsup ("pi")));
-%! assert (acos (infsup (0, 1)) == union ((infsup ("pi") / 2), infsup (0)));
-%! assert (acos (infsup (-1, 1)) == infsup (0, "pi"));
-%! assert (acos (infsup (-2, 2)) == infsup (0, "pi"));
-%!test "Unbounded intervals";
-%! assert (acos (infsup (0, inf)) == union ((infsup ("pi") / 2), infsup (0)));
-%! assert (acos (infsup (-inf, 0)) == union ((infsup ("pi") / 2), infsup ("pi")));
-%! assert (acos (infsup (-inf, inf)) == infsup (0, "pi"));
-%!test "from the documentation string";
-%! assert (acos (infsup (.5)) == "[0x1.0C152382D7365, 0x1.0C152382D7366]");
+%!# Empty interval
+%!assert (acos (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (acos (infsup (-1)) == infsup ("pi"));
+%!assert (subset (acos (infsup (-.5)), union ((infsup ("pi") / 2), infsup ("pi"))));
+%!assert (acos (infsup (0)) == infsup ("pi") / 2);
+%!assert (subset (acos (infsup (.5)), union ((infsup ("pi") / 2), infsup (0))));
+%!assert (acos (infsup (1)) == infsup (0));
+
+%!# Bounded intervals
+%!assert (acos (infsup (-1, 0)) == union ((infsup ("pi") / 2), infsup ("pi")));
+%!assert (acos (infsup (0, 1)) == union ((infsup ("pi") / 2), infsup (0)));
+%!assert (acos (infsup (-1, 1)) == infsup (0, "pi"));
+%!assert (acos (infsup (-2, 2)) == infsup (0, "pi"));
+
+%!# Unbounded intervals
+%!assert (acos (infsup (0, inf)) == union ((infsup ("pi") / 2), infsup (0)));
+%!assert (acos (infsup (-inf, 0)) == union ((infsup ("pi") / 2), infsup ("pi")));
+%!assert (acos (infsup (-inf, inf)) == infsup (0, "pi"));
+
+%!# from the documentation string
+%!assert (acos (infsup (.5)) == "[0x1.0C152382D7365, 0x1.0C152382D7366]");
+
+%!# correct use of signed zeros
+%!test
+%! x = acos (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/acosh.m b/inst/@infsup/acosh.m
index 6cd0210..3563ed8 100644
--- a/inst/@infsup/acosh.m
+++ b/inst/@infsup/acosh.m
@@ -34,41 +34,55 @@
## Keywords: interval
## Created: 2014-10-07
-function result = acosh (x)
+function x = acosh (x)
if (nargin ~= 1)
print_usage ();
return
endif
-x = intersect (x, infsup (1, inf));
+persistent domain = infsup (1, inf);
+x = intersect (x, domain);
## acosh is monotonically increasing from (1, 0) to (inf, inf)
l = mpfr_function_d ('acosh', -inf, x.inf);
u = mpfr_function_d ('acosh', +inf, x.sup);
+l(l == 0) = -0;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "Empty interval";
-%! assert (acosh (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (acosh (infsup (0)) == infsup ());
-%! assert (acosh (infsup (1)) == infsup (0));
+%!# Empty interval
+%!assert (acosh (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (acosh (infsup (0)) == infsup ());
+%!assert (acosh (infsup (1)) == infsup (0));
+%!test
%! x = infsup (1 : 3 : 100);
%! assert (min (subset (acosh (x), log (x + sqrt (x + 1) .* sqrt (x - 1)))));
-%!test "Bounded intervals";
-%! assert (acosh (infsup (0, 1)) == infsup (0));
-%!test "Unbounded intervals";
-%! assert (acosh (infsup (-inf, 0)) == infsup ());
-%! assert (acosh (infsup (-inf, 1)) == infsup (0));
-%! assert (acosh (infsup (0, inf)) == infsup (0, inf));
-%! assert (acosh (infsup (1, inf)) == infsup (0, inf));
-%! assert (subset (acosh (infsup (2, inf)), infsup (1, inf)));
-%!test "from the documentation string";
-%! assert (acosh (infsup (2)) == "[0x1.5124271980434, 0x1.5124271980435]");
+
+%!# Bounded intervals
+%!assert (acosh (infsup (0, 1)) == infsup (0));
+
+%!# Unbounded intervals
+%!assert (acosh (infsup (-inf, 0)) == infsup ());
+%!assert (acosh (infsup (-inf, 1)) == infsup (0));
+%!assert (acosh (infsup (0, inf)) == infsup (0, inf));
+%!assert (acosh (infsup (1, inf)) == infsup (0, inf));
+%!assert (subset (acosh (infsup (2, inf)), infsup (1, inf)));
+
+%!# from the documentation string
+%!assert (acosh (infsup (2)) == "[0x1.5124271980434, 0x1.5124271980435]");
+
+%!# correct use of signed zeros
+%!test
+%! x = acosh (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/asin.m b/inst/@infsup/asin.m
index 1d80cbc..7c0c71e 100644
--- a/inst/@infsup/asin.m
+++ b/inst/@infsup/asin.m
@@ -34,28 +34,38 @@
## Keywords: interval
## Created: 2014-10-06
-function result = asin (x)
+function x = asin (x)
if (nargin ~= 1)
print_usage ();
return
endif
-x = intersect (x, infsup (-1, 1));
+persistent domain = infsup (-1, 1);
+x = intersect (x, domain);
## asin is monotonically increasing from (-1, -pi/2) to (1, pi/2)
l = mpfr_function_d ('asin', -inf, x.inf);
u = mpfr_function_d ('asin', +inf, x.sup);
+l(l == 0) = -0;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "Empty interval";
-%! assert (asin (infsup ()) == infsup ());
-%!test "from the documentation string";
-%! assert (asin (infsup (.5)) == "[0x1.0C152382D7365p-1, 0x1.0C152382D7366p-1]");
+%!# Empty interval
+%!assert (asin (infsup ()) == infsup ());
+
+%!# from the documentation string
+%!assert (asin (infsup (.5)) == "[0x1.0C152382D7365p-1, 0x1.0C152382D7366p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = asin (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/asinh.m b/inst/@infsup/asinh.m
index d4043dd..26e54a5 100644
--- a/inst/@infsup/asinh.m
+++ b/inst/@infsup/asinh.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-07
-function result = asinh (x)
+function x = asinh (x)
if (nargin ~= 1)
print_usage ();
@@ -45,10 +45,18 @@ endif
## This also works for empty intervals!
l = mpfr_function_d ('asinh', -inf, x.inf);
u = mpfr_function_d ('asinh', +inf, x.sup);
+l(l == 0) = -0;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (asinh (infsup (1)) == "[0x1.C34366179D426p-1, 0x1.C34366179D427p-1]");
+%!# from the documentation string
+%!assert (asinh (infsup (1)) == "[0x1.C34366179D426p-1, 0x1.C34366179D427p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = asinh (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/atan.m b/inst/@infsup/atan.m
index e12bd45..1ab2ae6 100644
--- a/inst/@infsup/atan.m
+++ b/inst/@infsup/atan.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-06
-function result = atan (x)
+function x = atan (x)
if (nargin ~= 1)
print_usage ();
@@ -44,14 +44,22 @@ endif
## atan is monotonically increasing
l = mpfr_function_d ('atan', -inf, x.inf);
u = mpfr_function_d ('atan', +inf, x.sup);
+l(l == 0) = -0;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (atan (infsup (1)) == "[0x1.921FB54442D18p-1, 0x1.921FB54442D19p-1]");
+%!# from the documentation string
+%!assert (atan (infsup (1)) == "[0x1.921FB54442D18p-1, 0x1.921FB54442D19p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = atan (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/atan2.m b/inst/@infsup/atan2.m
index d085918..0df745d 100644
--- a/inst/@infsup/atan2.m
+++ b/inst/@infsup/atan2.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-06
-function result = atan2 (y, x)
+function y = atan2 (y, x)
if (nargin ~= 2)
print_usage ();
@@ -48,7 +48,7 @@ if (not (isa (x, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -62,10 +62,12 @@ endif
## ------0------>
## p4 | p3 x
##
-x1 = x4 = intersect (x, infsup (-inf, 0));
-y1 = y2 = intersect (y, infsup (0, inf));
-x2 = x3 = intersect (x, infsup (0, inf));
-y3 = y4 = intersect (y, infsup (-inf, 0));
+persistent pos = infsup (0, inf);
+persistent neg = infsup (-inf, 0);
+x1 = x4 = intersect (x, neg);
+y1 = y2 = intersect (y, pos);
+x2 = x3 = intersect (x, pos);
+y3 = y4 = intersect (y, neg);
## Intersect each partition with atan2's domain
p1 = not (isempty (x1) | isempty (y1)) & (x1.inf < 0 | y1.sup > 0);
@@ -74,49 +76,64 @@ p3 = not (isempty (x3) | isempty (y3)) & (x3.sup > 0 | y3.inf < 0);
p4 = not (isempty (x4) | isempty (y4)) & (x4.inf < 0 | y4.inf < 0);
## Prevent wrong limit values of atan2 (0, 0) in cases with y = 0.
-x1.inf (p1 & y1.sup == 0) = x1.sup (p1 & y1.sup == 0) = -1;
-x2.inf (p2 & y2.sup == 0) = x2.sup (p2 & y2.sup == 0) = 1;
-x3.inf (p3 & y3.inf == 0) = x3.sup (p3 & y3.inf == 0) = 1;
-p4 (y4.inf == 0) = false (); # don't consider y >= 0 in partition 4
+select = (p1 & y1.sup == 0);
+x1.inf(select) = x1.sup(select) = -1;
+select = (p2 & y2.sup == 0);
+x2.inf(select) = x2.sup(select) = 1;
+select = (p3 & y3.inf == 0);
+x3.inf(select) = x3.sup(select) = 1;
+p4(y4.inf == 0) = false (); # don't consider y >= 0 in partition 4
## Prevent wrong limit values of atan2 (0, 0) in cases with x = 0.
-y1.inf (p1 & x1.inf == 0) = y1.sup (p1 & x1.inf == 0) = 1;
-y2.inf (p2 & x2.sup == 0) = y2.sup (p2 & x2.sup == 0) = 1;
-y3.inf (p3 & x3.sup == 0) = y3.sup (p3 & x3.sup == 0) = -1;
-y4.inf (p4 & x4.inf == 0) = y4.sup (p4 & x4.inf == 0) = -1;
+select = (p1 & x1.inf == 0);
+y1.inf(select) = y1.sup(select) = 1;
+select = (p2 & x2.sup == 0);
+y2.inf(select) = y2.sup(select) = 1;
+y3.inf(p3 & x3.sup == 0) = y3.sup(p3 & x3.sup == 0) = -1;
+select = (p4 & x4.inf == 0);
+y4.inf(select) = y4.sup(select) = -1;
## Fix interval boundaries for y = 0 and x < 0, because atan2 (±0, -eps) = ±pi
-y1.inf (p1 & y1.inf == 0) = +0;
-y4.sup (p4 & y4.sup == 0) = -0;
+y1.inf(p1 & y1.inf == 0) = +0;
+y4.sup(p4 & y4.sup == 0) = -0;
## Compute lower boundary (atan2 is increasing from p4 to p1)
l = inf (size (p1));
select = p4;
-l (select) = mpfr_function_d ('atan2', -inf, y4.sup (select), x4.inf (select));
+l(select) = mpfr_function_d ('atan2', -inf, y4.sup(select), x4.inf(select));
select = p3 & not (p4);
-l (select) = mpfr_function_d ('atan2', -inf, y3.inf (select), x3.inf (select));
+l(select) = mpfr_function_d ('atan2', -inf, y3.inf(select), x3.inf(select));
select = p2 & not (p3 | p4);
-l (select) = mpfr_function_d ('atan2', -inf, y2.inf (select), x2.sup (select));
+l(select) = mpfr_function_d ('atan2', -inf, y2.inf(select), x2.sup(select));
select = p1 & not (p2 | p3 | p4);
-l (select) = mpfr_function_d ('atan2', -inf, y1.sup (select), x1.sup (select));
+l(select) = mpfr_function_d ('atan2', -inf, y1.sup(select), x1.sup(select));
## Compute upper boundary (atan2 is decreasing from p1 to p4)
u = -inf (size (p1));
select = p1;
-u (select) = mpfr_function_d ('atan2', +inf, y1.inf (select), x1.inf (select));
+u(select) = mpfr_function_d ('atan2', +inf, y1.inf(select), x1.inf(select));
select = p2 & not (p1);
-u (select) = mpfr_function_d ('atan2', +inf, y2.sup (select), x2.inf (select));
+u(select) = mpfr_function_d ('atan2', +inf, y2.sup(select), x2.inf(select));
select = p3 & not (p1 | p2);
-u (select) = mpfr_function_d ('atan2', +inf, y3.sup (select), x3.sup (select));
+u(select) = mpfr_function_d ('atan2', +inf, y3.sup(select), x3.sup(select));
select = p4 & not (p1 | p2 | p3);
-u (select) = mpfr_function_d ('atan2', +inf, y4.inf (select), x4.sup (select));
+u(select) = mpfr_function_d ('atan2', +inf, y4.inf(select), x4.sup(select));
## Now, we have computed l and u for all cases where p1 | p2 | p3 | p4. In all
## other cases, l and u will produce an empty interval.
-result = infsup (l, u);
+l(l == 0) = -0;
+
+y.inf = l;
+y.sup = u;
endfunction
%!test "from the documentation string";
-%! assert (atan2 (infsup (1), infsup (-1)) == "[0x1.2D97C7F3321D2p1, 0x1.2D97C7F3321D3p1]");
+%!assert (atan2 (infsup (1), infsup (-1)) == "[0x1.2D97C7F3321D2p1, 0x1.2D97C7F3321D3p1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = atan2 (0, infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/atan2rev1.m b/inst/@infsup/atan2rev1.m
index 4f55c0f..1f6265f 100644
--- a/inst/@infsup/atan2rev1.m
+++ b/inst/@infsup/atan2rev1.m
@@ -59,49 +59,35 @@ if (not (isa (y, "infsup")))
endif
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (b.inf) ~= rows (c.inf))
- b.inf = ones (rows (c.inf), columns (b.inf)) .* b.inf;
- b.sup = ones (rows (c.inf), columns (b.inf)) .* b.sup;
- c.inf = ones (rows (b.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (b.inf), columns (c.inf)) .* c.sup;
+if (not (size_equal (b.inf, c.inf)))
+ b.inf = ones (size (c.inf)) .* b.inf;
+ b.sup = ones (size (c.inf)) .* b.sup;
+ c.inf = ones (size (b.inf)) .* c.inf;
+ c.sup = ones (size (b.inf)) .* c.sup;
endif
-if (rows (b.inf) ~= rows (y.inf))
- b.inf = ones (rows (y.inf), columns (b.inf)) .* b.inf;
- b.sup = ones (rows (y.inf), columns (b.inf)) .* b.sup;
- c.inf = ones (rows (y.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (y.inf), columns (c.inf)) .* c.sup;
- y.inf = ones (rows (b.inf), columns (y.inf)) .* y.inf;
- y.sup = ones (rows (b.inf), columns (y.inf)) .* y.sup;
-endif
-if (columns (b.inf) ~= columns (c.inf))
- b.inf = ones (rows (b.inf), columns (c.inf)) .* b.inf;
- b.sup = ones (rows (b.inf), columns (c.inf)) .* b.sup;
- c.inf = ones (rows (c.inf), columns (b.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (b.inf)) .* c.sup;
-endif
-if (columns (b.inf) ~= columns (y.inf))
- b.inf = ones (rows (b.inf), columns (y.inf)) .* b.inf;
- b.sup = ones (rows (b.inf), columns (y.inf)) .* b.sup;
- c.inf = ones (rows (c.inf), columns (y.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (y.inf)) .* c.sup;
- y.inf = ones (rows (y.inf), columns (b.inf)) .* y.inf;
- y.sup = ones (rows (y.inf), columns (b.inf)) .* y.sup;
+if (not (size_equal (b.inf, y.inf)))
+ b.inf = ones (size (y.inf)) .* b.inf;
+ b.sup = ones (size (y.inf)) .* b.sup;
+ c.inf = ones (size (y.inf)) .* c.inf;
+ c.sup = ones (size (y.inf)) .* c.sup;
+ y.inf = ones (size (b.inf)) .* y.inf;
+ y.sup = ones (size (b.inf)) .* y.sup;
endif
-pi = infsup ("pi");
+persistent pi = infsup ("pi");
idx.type = '()';
emptyresult = isempty (y) | isempty (b) | isempty (c) | ...
c.inf >= sup (pi) | c.sup <= inf (-pi);
-result = infsup (inf (size (y.inf)), -inf (size (y.inf)));
+result = repmat (infsup (), size (y.inf));
## c1 is the part of c where y >= 0 and x <= 0
c1 = intersect (c, infsup (inf (pi) / 2, sup (pi)));
select = not (emptyresult | isempty (c1) | ...
b.inf > 0 | y.sup < 0 | c1.sup == inf (pi) / 2 | ...
(b.inf >= 0 & y.sup <= 0) | (b.inf >= 0 & c1.inf > inf (pi) / 2));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is y = b * tan (c)
## minimum is located at b.sup, c.sup
## maximum is located at b.inf, c.inf
@@ -125,7 +111,7 @@ c2 = intersect (c, infsup (0, sup (pi) / 2));
select = not (emptyresult | isempty (c2) | b.sup < 0 | y.sup < 0 | ...
c2.inf == sup (pi) / 2 | ...
(b.sup <= 0 & y.sup <= 0) | (b.sup <= 0 & c2.sup < sup (pi) / 2));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is y = b * tan (c)
## minimum is located at b.inf, c.inf
## maximum is located at b.sup, c.sup
@@ -151,7 +137,7 @@ c3 = intersect (c, infsup (inf (-pi) / 2, 0));
select = not (emptyresult | isempty (c3) | b.sup < 0 | y.inf > 0 | ...
c3.sup == inf (-pi) / 2 | (b.sup <= 0 & y.inf >= 0) | ...
(b.sup <= 0 & c2.inf > inf (-pi) / 2));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is y = b * tan (c)
## minimum is located at b.sup, c.inf
## maximum is located at b.inf, c.sup
@@ -176,7 +162,7 @@ c4 = intersect (c, infsup (inf (-pi), sup (-pi) / 2));
select = not (emptyresult | isempty (c4) | b.inf > 0 | y.inf > 0 | ...
c4.inf == sup (-pi) / 2 | (b.inf >= 0 & y.inf >= 0) | ...
(b.inf >= 0 & c4.sup < sup (-pi) / 2));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is y = b * tan (c)
## minimum is located at b.inf, c.sup
## maximum is located at b.sup, c.inf
@@ -198,5 +184,5 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (atan2rev1 (infsup (1, 2), infsup ("pi") / 4) == "[0x1.FFFFFFFFFFFFFp-1, 0x1.0000000000001p1]");
+%!# from the documentation string
+%!assert (atan2rev1 (infsup (1, 2), infsup ("pi") / 4) == "[0x1.FFFFFFFFFFFFFp-1, 0x1.0000000000001p1]");
diff --git a/inst/@infsup/atan2rev2.m b/inst/@infsup/atan2rev2.m
index e34c354..415db54 100644
--- a/inst/@infsup/atan2rev2.m
+++ b/inst/@infsup/atan2rev2.m
@@ -59,33 +59,19 @@ if (not (isa (x, "infsup")))
endif
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (a.inf) ~= rows (c.inf))
- a.inf = ones (rows (c.inf), columns (a.inf)) .* a.inf;
- a.sup = ones (rows (c.inf), columns (a.inf)) .* a.sup;
- c.inf = ones (rows (a.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (a.inf), columns (c.inf)) .* c.sup;
+if (not (size_equal (a.inf, c.inf)))
+ a.inf = ones (size (c.inf)) .* a.inf;
+ a.sup = ones (size (c.inf)) .* a.sup;
+ c.inf = ones (size (a.inf)) .* c.inf;
+ c.sup = ones (size (a.inf)) .* c.sup;
endif
-if (rows (a.inf) ~= rows (x.inf))
- a.inf = ones (rows (x.inf), columns (a.inf)) .* a.inf;
- a.sup = ones (rows (x.inf), columns (a.inf)) .* a.sup;
- c.inf = ones (rows (x.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (x.inf), columns (c.inf)) .* c.sup;
- x.inf = ones (rows (a.inf), columns (x.inf)) .* x.inf;
- x.sup = ones (rows (a.inf), columns (x.inf)) .* x.sup;
-endif
-if (columns (a.inf) ~= columns (c.inf))
- a.inf = ones (rows (a.inf), columns (c.inf)) .* a.inf;
- a.sup = ones (rows (a.inf), columns (c.inf)) .* a.sup;
- c.inf = ones (rows (c.inf), columns (a.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (a.inf)) .* c.sup;
-endif
-if (columns (a.inf) ~= columns (x.inf))
- a.inf = ones (rows (a.inf), columns (x.inf)) .* a.inf;
- a.sup = ones (rows (a.inf), columns (x.inf)) .* a.sup;
- c.inf = ones (rows (c.inf), columns (x.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (x.inf)) .* c.sup;
- x.inf = ones (rows (x.inf), columns (a.inf)) .* x.inf;
- x.sup = ones (rows (x.inf), columns (a.inf)) .* x.sup;
+if (not (size_equal (a.inf, x.inf)))
+ a.inf = ones (size (x.inf)) .* a.inf;
+ a.sup = ones (size (x.inf)) .* a.sup;
+ c.inf = ones (size (x.inf)) .* c.inf;
+ c.sup = ones (size (x.inf)) .* c.sup;
+ x.inf = ones (size (a.inf)) .* x.inf;
+ x.sup = ones (size (a.inf)) .* x.sup;
endif
pi = infsup ("pi");
@@ -94,14 +80,14 @@ idx.type = '()';
emptyresult = isempty (x) | isempty (a) | isempty (c) | ...
c.inf >= sup (pi) | c.sup <= inf (-pi);
-result = infsup (inf (size (x.inf)), -inf (size (x.inf)));
+result = repmat (infsup (), size (x.inf));
## c1 is the part of c where y >= 0 and x <= 0
c1 = intersect (c, infsup (inf (pi) / 2, sup (pi)));
select = not (emptyresult | isempty (c1) | x.inf > 0 | a.sup < 0 | ...
c1.sup == inf (pi) / 2 | ...
(x.inf >= 0 & a.sup <= 0) | (a.sup <= 0 & c1.inf > inf (pi) / 2));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is x = a / tan (c)
## minimum is located at a.sup, c.sup
## maximum is located at a.inf, c.inf
@@ -125,7 +111,7 @@ select = not (emptyresult | isempty (c2) | x.sup < 0 | a.sup < 0 | ...
c2.inf == sup (pi) / 2 | ...
(x.sup <= 0 & a.sup <= 0) | (c2.sup <= 0 & a.inf > 0) | ...
(a.sup <= 0 & c2.inf > 0));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is x = a / tan (c)
## minimum is located at a.inf, c.sup
## maximum is located at a.sup, c.inf
@@ -150,7 +136,7 @@ c3 = intersect (c, infsup (inf (-pi) / 2, 0));
select = not (emptyresult | isempty (c3) | x.sup < 0 | a.inf > 0 | ...
c3.sup == inf (-pi) / 2 | (x.sup <= 0 & a.inf >= 0) | ...
(c3.inf >= 0 & a.sup < 0) | (a.inf >= 0 & c3.sup < 0));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is x = a / tan (c)
## minimum is located at a.sup, c.inf
## maximum is located at a.inf, c.sup
@@ -175,7 +161,7 @@ c4 = intersect (c, infsup (inf (-pi), sup (-pi) / 2));
select = not (emptyresult | isempty (c4) | x.inf > 0 | a.inf > 0 | ...
c4.inf == sup (-pi) / 2 | (x.inf >= 0 & a.inf >= 0) | ...
(a.inf >= 0 & c4.inf > inf (-pi)));
-if (any (any (select)))
+if (any (select(:)))
## The inverse function is x = a / tan (c)
## minimum is located at a.inf, c.inf
## maximum is located at a.sup, c.sup
@@ -196,5 +182,5 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (atan2rev2 (infsup (1, 2), infsup ("pi") / 4) == "[0x1.FFFFFFFFFFFFEp-1, 0x1.0000000000001p1]");
+%!# from the documentation string
+%!assert (atan2rev2 (infsup (1, 2), infsup ("pi") / 4) == "[0x1.FFFFFFFFFFFFEp-1, 0x1.0000000000001p1]");
diff --git a/inst/@infsup/atanh.m b/inst/@infsup/atanh.m
index 35332a7..1c43610 100644
--- a/inst/@infsup/atanh.m
+++ b/inst/@infsup/atanh.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-07
-function result = atanh (x)
+function x = atanh (x)
if (nargin ~= 1)
print_usage ();
@@ -48,12 +48,21 @@ l = mpfr_function_d ('atanh', -inf, x.inf);
u = mpfr_function_d ('atanh', +inf, x.sup);
emptyresult = isempty (x) | x.sup <= -1 | x.inf >= 1;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (atanh (infsup (.5)) == "[0x1.193EA7AAD030Ap-1, 0x1.193EA7AAD030Bp-1]");
+%!# from the documentation string
+%!assert (atanh (infsup (.5)) == "[0x1.193EA7AAD030Ap-1, 0x1.193EA7AAD030Bp-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = atanh (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/bisect.m b/inst/@infsup/bisect.m
index ef0e139..1cae01d 100644
--- a/inst/@infsup/bisect.m
+++ b/inst/@infsup/bisect.m
@@ -56,51 +56,56 @@ m = zeros (size (x.inf));
idx.type = '()';
positive = x.inf >= 0 & x.sup > 0;
-if (any (any (positive)))
+if (any (positive(:)))
idx.subs = {positive};
bounded = intersect (infsup (pow2 (-1074), realmax), subsref (x, idx));
- m (positive) = min (realmax (), pow2 (mid (log2 (bounded))));
+ m(positive) = min (realmax, pow2 (mid (log2 (bounded))));
endif
negative = x.inf < 0 & x.sup <= 0;
-if (any (any (negative)))
+if (any (negative(:)))
idx.subs = {negative};
bounded = intersect (infsup (-realmax, -pow2 (-1074)), subsref (x, idx));
- m (negative) = ...
- uminus (min (realmax (), pow2 (mid (log2 (uminus (bounded))))));
+ m(negative) = ...
+ uminus (min (realmax, pow2 (mid (log2 (uminus (bounded))))));
endif
both_signs = x.inf < 0 & x.sup > 0;
both_signs_p = both_signs & x.sup > -x.inf;
-if (any (any (both_signs_p)))
+if (any (both_signs_p(:)))
idx.subs = {both_signs_p};
bounded_n = intersect (infsup (-realmax, -pow2 (-1074)), subsref (x, idx));
bounded_p = intersect (infsup (pow2 (-1074), realmax), subsref (x, idx));
- m (both_signs_p) = min (realmax (), pow2 (
+ m(both_signs_p) = min (realmax, pow2 (
mid (log2 (bounded_p)) ...
- mid (log2 (uminus (bounded_n))) ...
- 1074));
endif
both_signs_n = both_signs & x.sup < -x.inf;
-if (any (any (both_signs_n)))
+if (any (both_signs_n(:)))
idx.subs = {both_signs_n};
bounded_n = intersect (infsup (-realmax, -pow2 (-1074)), subsref (x, idx));
bounded_p = intersect (infsup (pow2 (-1074), realmax), subsref (x, idx));
- m (both_signs_n) = uminus (min (realmax (), pow2 (
+ m(both_signs_n) = uminus (min (realmax, pow2 (
mid (log2 (uminus (bounded_n))) ...
- mid (log2 (bounded_p)) ...
- 1074)));
endif
-m (isempty (x)) = -inf;
-a = infsup (x.inf, min (m, x.sup));
-m (isempty (x)) = inf;
-b = infsup (max (m, x.inf), x.sup);
+m = min (max (m, x.inf), x.sup);
+
+a = b = x;
+m(isempty (x)) = -inf;
+a.sup = m;
+m(isempty (x)) = inf;
+m(m == 0) = -0;
+b.inf = m;
endfunction
-%!test "from the documentation string";
+%!test
+%! # from the documentation string
%! [a, b] = bisect (infsup (2, 32));
%! assert (a == infsup (2, 8));
%! assert (b == infsup (8, 32));
@@ -124,3 +129,10 @@ endfunction
%! [a, b] = bisect (infsup (-inf, 0));
%! assert (a == infsup (-inf, -pow2 (-25)));
%! assert (b == infsup (-pow2 (-25), 0));
+%!# correct use of signed zeros
+%!test
+%! [a, b] = bisect (infsup (0));
+%! assert (signbit (inf (a)));
+%! assert (signbit (inf (b)));
+%! assert (not (signbit (sup (a))));
+%! assert (not (signbit (sup (b))));
diff --git a/inst/@infsup/bitunpack.m b/inst/@infsup/bitunpack.m
index 7e93ac9..7f96750 100644
--- a/inst/@infsup/bitunpack.m
+++ b/inst/@infsup/bitunpack.m
@@ -60,9 +60,9 @@ endif
## Merge 64 bit blocks from l and u (alternating) together into result.
target = reshape (1 : length (result), 64, numel (x.inf) + numel (x.sup));
-target (:, 2 : 2 : size (target, 2)) = [];
-result (target) = l;
-result (target + 64) = u;
+target(:, 2 : 2 : size (target, 2)) = [];
+result(target) = l;
+result(target + 64) = u;
endfunction
diff --git a/inst/@infsup/cancelminus.m b/inst/@infsup/cancelminus.m
index ae47022..73d2eed 100644
--- a/inst/@infsup/cancelminus.m
+++ b/inst/@infsup/cancelminus.m
@@ -35,7 +35,7 @@
## Keywords: interval
## Created: 2014-10-19
-function result = cancelminus (x, y)
+function x = cancelminus (x, y)
if (nargin ~= 2)
print_usage ();
@@ -66,16 +66,19 @@ entireresult = (isempty (y) & not (isempty (x))) | ...
## for interior zero, because of rounding errors.
(iscommoninterval (x) & iscommoninterval (y) & ...
(wid_x1 - wid_y1) + (wid_x2 - wid_y2) < 0);
-l (entireresult) = -inf;
-u (entireresult) = inf;
+l(entireresult) = -inf;
+u(entireresult) = inf;
emptyresult = isempty (x) & not (entireresult);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (cancelminus (infsup (2, 3), infsup (1, 1.5)) == infsup (1, 1.5));
+%!# from the documentation string
+%!assert (cancelminus (infsup (2, 3), infsup (1, 1.5)) == infsup (1, 1.5));
diff --git a/inst/@infsup/cancelplus.m b/inst/@infsup/cancelplus.m
index 43c4cc5..72c0c90 100644
--- a/inst/@infsup/cancelplus.m
+++ b/inst/@infsup/cancelplus.m
@@ -46,5 +46,5 @@ result = cancelminus (x, -y);
endfunction
-%!test "from the documentation string";
-%! assert (cancelplus (infsup (2, 3), infsup (1, 1.5)) == infsup (3.5, 4));
+%!# from the documentation string
+%!assert (cancelplus (infsup (2, 3), infsup (1, 1.5)) == infsup (3.5, 4));
diff --git a/inst/@infsup/cat.m b/inst/@infsup/cat.m
index 942e018..0c4e846 100644
--- a/inst/@infsup/cat.m
+++ b/inst/@infsup/cat.m
@@ -41,15 +41,28 @@
function result = cat (dim, varargin)
-switch dim
- case 1
- result = vertcat (varargin {:});
- case 2
- result = horzcat (varargin {:});
- otherwise
- error ("interval:InvalidOperand", ...
- "cat: no more than 2 dimensions are supported")
-endswitch
+if (isa (dim, "infsup"))
+ print_usage ();
+ return
+endif
+
+if (dim > 2)
+ error ("interval:InvalidOperand", ...
+ "cat: no more than 2 dimensions are supported");
+endif
+
+## Conversion of non-interval parameters to intervals
+interval_idx = cellfun ("isclass", varargin, "infsup");
+to_convert_idx = not (interval_idx);
+varargin(to_convert_idx) = cellfun (@infsup, ...
+ varargin(to_convert_idx), ...
+ "UniformOutput", false);
+
+## Stack intervals along dimension dim
+s = cellfun ("struct", varargin); # struct array
+result = infsup ();
+result.inf = cat (dim, s.inf);
+result.sup = cat (dim, s.sup);
endfunction
diff --git a/inst/@infsup/cbrt.m b/inst/@infsup/cbrt.m
index f581ed0..bf28386 100644
--- a/inst/@infsup/cbrt.m
+++ b/inst/@infsup/cbrt.m
@@ -34,18 +34,23 @@
## Keywords: interval
## Created: 2015-03-15
-function result = cbrt (x)
+function x = cbrt (x)
-l = mpfr_function_d ('cbrt', -inf, x.inf);
-u = mpfr_function_d ('cbrt', +inf, x.sup);
+if (nargin ~= 1)
+ print_usage ();
+ return
+endif
-emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
-
-result = infsup (l, u);
+x.inf = mpfr_function_d ('cbrt', -inf, x.inf);
+x.sup = mpfr_function_d ('cbrt', +inf, x.sup);
endfunction
-%!test "from the documentation string";
-%! assert (cbrt (infsup (-27, 27)) == infsup (-3, 3));
+%!# from the documentation string
+%!assert (cbrt (infsup (-27, 27)) == infsup (-3, 3));
+
+%!# correct use of signed zeros
+%!test
+%! x = cbrt (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/ceil.m b/inst/@infsup/ceil.m
index e138dd2..bd0d9b7 100644
--- a/inst/@infsup/ceil.m
+++ b/inst/@infsup/ceil.m
@@ -36,37 +36,54 @@
## Keywords: interval
## Created: 2014-10-04
-function result = ceil (x)
+function x = ceil (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = infsup (ceil (x.inf), ceil (x.sup));
+x.inf = ceil (x.inf);
+x.sup = ceil (x.sup);
+
+x.sup(x.sup == 0) = +0;
endfunction
-%!test "Empty interval";
-%! assert (ceil (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (ceil (infsup (0)) == infsup (0));
-%! assert (ceil (infsup (0.5)) == infsup (1));
-%! assert (ceil (infsup (-0.5)) == infsup (0));
-%!test "Bounded intervals";
-%! assert (ceil (infsup (-0.5, 0)) == infsup (0));
-%! assert (ceil (infsup (0, 0.5)) == infsup (0, 1));
-%! assert (ceil (infsup (0.25, 0.5)) == infsup (1));
-%! assert (ceil (infsup (-1, 0)) == infsup (-1, 0));
-%! assert (ceil (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (ceil (infsup (-realmin, realmin)) == infsup (0, 1));
-%! assert (ceil (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
-%!test "Unbounded intervals";
-%! assert (ceil (infsup (-realmin, inf)) == infsup (0, inf));
-%! assert (ceil (infsup (-realmax, inf)) == infsup (-realmax, inf));
-%! assert (ceil (infsup (-inf, realmin)) == infsup (-inf, 1));
-%! assert (ceil (infsup (-inf, realmax)) == infsup (-inf, realmax));
-%! assert (ceil (infsup (-inf, inf)) == infsup (-inf, inf));
-%!test "from the documentation string";
-%! assert (ceil (infsup (2.5, 3.5)) == infsup (3, 4));
-%! assert (ceil (infsup (-.5, 5)) == infsup (0, 5));
+%!# Empty interval
+%!assert (ceil (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (ceil (infsup (0)) == infsup (0));
+%!assert (ceil (infsup (0.5)) == infsup (1));
+%!assert (ceil (infsup (-0.5)) == infsup (0));
+
+%!# Bounded intervals
+%!assert (ceil (infsup (-0.5, 0)) == infsup (0));
+%!assert (ceil (infsup (0, 0.5)) == infsup (0, 1));
+%!assert (ceil (infsup (0.25, 0.5)) == infsup (1));
+%!assert (ceil (infsup (-1, 0)) == infsup (-1, 0));
+%!assert (ceil (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (ceil (infsup (-realmin, realmin)) == infsup (0, 1));
+%!assert (ceil (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
+
+%!# Unbounded intervals
+%!assert (ceil (infsup (-realmin, inf)) == infsup (0, inf));
+%!assert (ceil (infsup (-realmax, inf)) == infsup (-realmax, inf));
+%!assert (ceil (infsup (-inf, realmin)) == infsup (-inf, 1));
+%!assert (ceil (infsup (-inf, realmax)) == infsup (-inf, realmax));
+%!assert (ceil (infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# from the documentation string
+%!assert (ceil (infsup (2.5, 3.5)) == infsup (3, 4));
+%!assert (ceil (infsup (-.5, 5)) == infsup (0, 5));
+
+%!# correct use of signed zeros
+%!test
+%! x = ceil (infsup (-0.5));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = ceil (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/chol.m b/inst/@infsup/chol.m
new file mode 100644
index 0000000..e07c898
--- /dev/null
+++ b/inst/@infsup/chol.m
@@ -0,0 +1,169 @@
+## Copyright 2008 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from verchol in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypemethod {@@infsup} {@var{R} = } chol (@var{A})
+## @deftypemethodx {@@infsup} {[@var{R}, @var{P}] = } chol (@var{A})
+## @deftypemethodx {@@infsup} {[@var{R}, @dots{}] = } chol (@dots{}, "upper")
+## @deftypemethodx {@@infsup} {[@var{L}, @dots{}] = } chol (@dots{}, "lower")
+## Compute the Cholesky factor, @var{R}, of each symmetric positive definite
+## matrix in @var{A}.
+##
+## The Cholsky factor is defined by
+## @display
+## @var{R}' * @var{R} = @var{A}.
+## @end display
+##
+## @example
+## @group
+## chol (infsup (pascal (3)))
+## @result{} ans = 3×3 interval matrix
+##
+## [1] [1] [1]
+## [0] [1] [2]
+## [0] [0] [1]
+##
+## @end group
+## @end example
+##
+## Called using the @option{lower} flag, @command{chol} returns the lower
+## triangular factorization such that
+## @display
+## @var{L} * @var{L}' = @var{A}.
+## @end display
+##
+## @example
+## @group
+## chol (infsup (pascal (3)), "lower")
+## @result{} ans = 3×3 interval matrix
+##
+## [1] [0] [0]
+## [1] [1] [0]
+## [1] [2] [1]
+##
+## @end group
+## @end example
+##
+## Warning: Output data widths may grow rapidly with increasing dimensions.
+##
+## Called with one output argument this function fails if each symmetric matrix
+## in @var{A} is guaranteed to be not positive definite. With two output
+## arguments @var{P} flags whether each symmetric matrix was guaranteed to be
+## not positive definite and the function does not fail. A positive value of
+## @var{P} indicates that each symmetric matrix in A is guaranteed to be not
+## positive definite. Otherwise @var{P} is zero.
+##
+## This function tries to guarantee that each symmetric matrix in @var{A} is
+## positive definite. If that fails, a warning is triggered.
+##
+## @example
+## @group
+## A = infsup (pascal (3));
+## A(3, 3) = "[5, 6]";
+## chol (A)
+## @print{} warning: chol: matrix is not guaranteed to be positive definite
+## @result{} ans = 3×3 interval matrix
+##
+## [1] [1] [1]
+## [0] [1] [2]
+## [0] [0] [0, 1]
+##
+## @end group
+## @end example
+##
+## @seealso{@@infsup/lu, @@infsup/qr}
+## @end deftypemethod
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2008-02-02
+
+function [fact, P] = chol (A, option)
+
+if (nargin > 2)
+ print_usage ();
+ return
+elseif (nargin < 2)
+ option = "upper";
+endif
+
+if (not (ischar (option) && any (strcmp (option, {"upper", "lower"}))))
+ print_usage ();
+ return
+endif
+
+[m, n] = size (A);
+if (m ~= n)
+ error ("chol: matrix is not square");
+endif
+
+## Matrix is symmetric by definition, eliminate illegal values
+A = intersect (A, A');
+P = 0;
+
+## columnwise computation of L done in frame of A
+for k = 1 : n
+ idx_diag = substruct ("()", {k, k});
+ ## row vector # enables vectorized computation
+ el = subsref (A, substruct ("()", {k, 1 : k - 1}));
+ ## first main formula (diagonal entry)
+ alpha = subsref (A, idx_diag) - el * el';
+ if (inf (alpha) <= 0)
+ if (sup (alpha) <= 0)
+ ## each symmetric Ao in A verified not to be PD
+ P = -alpha.sup;
+ if (nargout < 2)
+ error ("chol: matrix is not positive definite");
+ endif
+ else
+ ## continue only on PD values, but warn about it
+ warning ("chol:PD", ...
+ "chol: matrix is not guaranteed to be positive definite");
+ endif
+ endif
+ s = sqrt (alpha);
+ A = subsasgn (A, idx_diag, s);
+ ## second main formula (subdiagonal entries)
+ idx_subdiag = substruct ("()", {k + 1 : n, k});
+ A = subsasgn (A, idx_subdiag, ...
+ (subsref (A, idx_subdiag) - ...
+ subsref (A, substruct ("()", {k + 1 : n, 1 : k - 1})) * ...
+ el') ./ s);
+endfor
+## verified Cholesky decomposition found
+L = tril (A); # lower triangular part extracted
+switch (option)
+ case "lower"
+ fact = L;
+ case "upper"
+ fact = L';
+endswitch
+
+endfunction
+
+%!assert (chol (infsup (pascal (10))) == chol (pascal (10)));
+%!assert (chol (infsupdec (pascal (10))) == chol (pascal (10)));
+%!test
+%! A = infsup ([2, 1; 1, 1]);
+%! R = chol (A);
+%! assert (ismember ([sqrt(2), 1/sqrt(2); 0, 1/sqrt(2)], R));
+%! assert (wid (R) < 1e-15);
diff --git a/inst/@infsup/columns.m b/inst/@infsup/columns.m
index 7fb2463..1975801 100644
--- a/inst/@infsup/columns.m
+++ b/inst/@infsup/columns.m
@@ -36,5 +36,7 @@ result = columns (a.inf);
endfunction
-%!test;
-%! assert (columns (infsup (zeros (3, 4))), 4);
+%!assert (columns (infsup (zeros (3, 4))), 4);
+%!assert (columns (infsup (zeros (0, 4))), 4);
+%!assert (columns (infsup (zeros (3, 0))), 0);
+%!assert (columns (infsup (zeros (3, 1))), 1);
diff --git a/inst/@infsup/cos.m b/inst/@infsup/cos.m
index 966d16d..d238489 100644
--- a/inst/@infsup/cos.m
+++ b/inst/@infsup/cos.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-05
-function result = cos (x)
+function x = cos (x)
if (nargin ~= 1)
print_usage ();
@@ -46,48 +46,51 @@ l = u = sinsignl = sinsignu = zeros (size (x.inf));
## Check, if wid (x) is certainly greater than 2*pi. This can save the
## computation if some cosine values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-twopi.sup = 2 * pi.sup;
-certainlyfullperiod = width >= twopi.sup;
-l (certainlyfullperiod) = -1;
-u (certainlyfullperiod) = 1;
+persistent pi = infsup ("pi");
+persistent twopi = 2 .* pi;
+certainlyfullperiod = width >= sup (twopi);
+l(certainlyfullperiod) = -1;
+u(certainlyfullperiod) = 1;
possiblynotfullperiod = not (certainlyfullperiod);
-l (possiblynotfullperiod) = min (...
- mpfr_function_d ('cos', -inf, x.inf (possiblynotfullperiod)), ...
- mpfr_function_d ('cos', -inf, x.sup (possiblynotfullperiod)));
-u (possiblynotfullperiod) = max (...
- mpfr_function_d ('cos', inf, x.inf (possiblynotfullperiod)), ...
- mpfr_function_d ('cos', inf, x.sup (possiblynotfullperiod)));
+l(possiblynotfullperiod) = min (...
+ mpfr_function_d ('cos', -inf, x.inf(possiblynotfullperiod)), ...
+ mpfr_function_d ('cos', -inf, x.sup(possiblynotfullperiod)));
+u(possiblynotfullperiod) = max (...
+ mpfr_function_d ('cos', inf, x.inf(possiblynotfullperiod)), ...
+ mpfr_function_d ('cos', inf, x.sup(possiblynotfullperiod)));
## We use sign (-sin) to know the gradient at the boundaries.
-sinsignl (possiblynotfullperiod) = sign (...
- -mpfr_function_d ('sin', .5, x.inf (possiblynotfullperiod)));
-sinsignu (possiblynotfullperiod) = sign (...
- -mpfr_function_d ('sin', .5, x.sup (possiblynotfullperiod)));
+sinsignl(possiblynotfullperiod) = sign (...
+ -mpfr_function_d ('sin', .5, x.inf(possiblynotfullperiod)));
+sinsignu(possiblynotfullperiod) = sign (...
+ -mpfr_function_d ('sin', .5, x.sup(possiblynotfullperiod)));
## In case of sign (-sin) == 0, we conservatively use sign (-sin) of nextout.
-sinsignl (sinsignl == 0) = (-1) * sign (l (sinsignl == 0));
-sinsignu (sinsignu == 0) = sign (u (sinsignu == 0));
+sinsignl(sinsignl == 0) = (-1) .* sign (l(sinsignl == 0));
+sinsignu(sinsignu == 0) = sign (u(sinsignu == 0));
containsinf = possiblynotfullperiod & ((sinsignl == -1 & sinsignu == 1) | ...
(sinsignl == sinsignu & ...
- width >= pi.sup)) ...
+ width >= sup (pi))) ...
& ne (0, x);
-l (containsinf) = -1;
+l(containsinf) = -1;
containssup = possiblynotfullperiod & ((sinsignl == 1 & sinsignu == -1) | ...
(sinsignl == sinsignu & ...
- width >= pi.sup));
-u (containssup) = 1;
+ width >= sup (pi)));
+u(containssup) = 1;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (cos (infsup (1)) == "[0x1.14A280FB5068Bp-1, 0x1.14A280FB5068Cp-1]");
+%!# from the documentation string
+%!assert (cos (infsup (1)) == "[0x1.14A280FB5068Bp-1, 0x1.14A280FB5068Cp-1]");
diff --git a/inst/@infsup/cosh.m b/inst/@infsup/cosh.m
index bc25926..564b2c5 100644
--- a/inst/@infsup/cosh.m
+++ b/inst/@infsup/cosh.m
@@ -34,24 +34,25 @@
## Keywords: interval
## Created: 2014-10-07
-function result = cosh (x)
+function x = cosh (x)
if (nargin ~= 1)
print_usage ();
return
endif
-## cosh is symmetric and has its global minimum located at (0, 0).
+## cosh is symmetric and has its global minimum located at (0, 1).
l = mpfr_function_d ('cosh', -inf, mig (x));
u = mpfr_function_d ('cosh', +inf, mag (x));
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (cosh (infsup (1)) == "[0x1.8B07551D9F55, 0x1.8B07551D9F551]");
+%!# from the documentation string
+%!assert (cosh (infsup (1)) == "[0x1.8B07551D9F55, 0x1.8B07551D9F551]");
diff --git a/inst/@infsup/coshrev.m b/inst/@infsup/coshrev.m
index dbb341d..a4bcc93 100644
--- a/inst/@infsup/coshrev.m
+++ b/inst/@infsup/coshrev.m
@@ -56,11 +56,11 @@ if (not (isa (x, "infsup")))
endif
p = acosh (c);
-n = - p;
+n = uminus (p);
result = union (intersect (p, x), intersect (n, x));
endfunction
-%!test "from the documentation string";
-%! assert (coshrev (infsup (-2, 1)) == 0);
+%!# from the documentation string
+%!assert (coshrev (infsup (-2, 1)) == 0);
diff --git a/inst/@infsup/cosrev.m b/inst/@infsup/cosrev.m
index e780f6d..478e11b 100644
--- a/inst/@infsup/cosrev.m
+++ b/inst/@infsup/cosrev.m
@@ -59,30 +59,30 @@ arccosine = acos (c);
result = x;
## Resize, if scalar × matrix
-if (isscalar (arccosine.inf) ~= isscalar (result.inf))
+if (not (size_equal (arccosine.inf, result.inf)))
arccosine.inf = ones (size (result.inf)) .* arccosine.inf;
arccosine.sup = ones (size (result.inf)) .* arccosine.sup;
result.inf = ones (size (arccosine.inf)) .* result.inf;
result.sup = ones (size (arccosine.inf)) .* result.sup;
endif
-result.inf (isempty (arccosine)) = inf;
-result.sup (isempty (arccosine)) = -inf;
+result.inf(isempty (arccosine)) = inf;
+result.sup(isempty (arccosine)) = -inf;
idx.type = '()';
-pi = infsup ("pi");
+persistent pi = infsup ("pi");
select = not (isempty (result)) ...
& not (subset (infsup (0, pi.sup), arccosine));
-if (any (any (select)))
+if (any (select(:)))
## Find a smaller upper bound for x, if the restriction from c allows it
u = inf (size (result.inf));
select_u = select & result.sup < inf;
## Find n, such that result.sup is within a distance of pi/2
## around (n + 1/2) * pi.
n = result.sup;
- n (select_u) = floor (sup (n (select_u) ./ pi));
+ n(select_u) = floor (sup (n(select_u) ./ pi));
arccosineshifted = arccosine;
idx.subs = {(select_u & rem (n, 2) == 0)};
arccosineshifted = subsasgn (arccosineshifted, idx, ...
@@ -91,17 +91,17 @@ if (any (any (select)))
arccosineshifted = subsasgn (arccosineshifted, idx, ...
(infsup (subsref (n, idx)) + 1) .* pi - subsref (arccosine, idx));
overlapping = not (isempty (intersect (result, arccosineshifted)));
- u (select_u & overlapping) = ...
- min (result.sup (select_u & overlapping), ...
- arccosineshifted.sup (select_u & overlapping));
+ u(select_u & overlapping) = ...
+ min (result.sup(select_u & overlapping), ...
+ arccosineshifted.sup(select_u & overlapping));
m = n;
- m (select_u & ~overlapping) = ...
- mpfr_function_d ('minus', +inf, m (select_u & ~overlapping), 1);
+ m(select_u & ~overlapping) = ...
+ mpfr_function_d ('minus', +inf, m(select_u & ~overlapping), 1);
idx.subs = {(select_u & ~overlapping & rem (n, 2) == 0)};
- u (idx.subs {1}) = ...
+ u(idx.subs {1}) = ...
sup (subsref (n, idx) .* pi - subsref (arccosine, idx));
idx.subs = {(select_u & ~overlapping & rem (n, 2) ~= 0)};
- u (idx.subs {1}) = ...
+ u(idx.subs {1}) = ...
sup (subsref (arccosine, idx) + subsref (m, idx) .* pi);
## Find a larger lower bound for x, if the restriction from c allows it
@@ -110,7 +110,7 @@ if (any (any (select)))
## Find n, such that result.inf is within a distance of pi/2
## around (n + 1/2) * pi.
n = result.inf;
- n (select_l) = floor (inf (n (select_l) ./ pi));
+ n(select_l) = floor (inf (n(select_l) ./ pi));
arccosineshifted = arccosine;
idx.subs = {(select_l & rem (n, 2) == 0)};
arccosineshifted = subsasgn (arccosineshifted, idx, ...
@@ -119,27 +119,33 @@ if (any (any (select)))
arccosineshifted = subsasgn (arccosineshifted, idx, ...
(infsup (subsref (n, idx)) + 1) .* pi - subsref (arccosine, idx));
overlapping = not (isempty (intersect (result, arccosineshifted)));
- l (select_l & overlapping) = ...
- max (result.inf (select_l & overlapping), ...
- arccosineshifted.inf (select_l & overlapping));
+ l(select_l & overlapping) = ...
+ max (result.inf(select_l & overlapping), ...
+ arccosineshifted.inf(select_l & overlapping));
m = n;
- m (select_l & ~overlapping) = ...
- mpfr_function_d ('plus', -inf, m (select_l & ~overlapping), 1);
+ m(select_l & ~overlapping) = ...
+ mpfr_function_d ('plus', -inf, m(select_l & ~overlapping), 1);
idx.subs = {(select_l & ~overlapping & rem (n, 2) == 0)};
- l (idx.subs {1}) = ...
+ l(idx.subs {1}) = ...
inf ((infsup (subsref (m, idx)) + 1) .* pi - subsref (arccosine, idx));
idx.subs = {(select_l & ~overlapping & rem (n, 2) ~= 0)};
- l (idx.subs {1}) = ...
+ l(idx.subs {1}) = ...
inf (subsref (arccosine, idx) + subsref (m, idx) .* pi);
- result.inf (select) = max (l (select), result.inf (select));
- result.sup (select) = min (u (select), result.sup (select));
+ result.inf(select) = max (l(select), result.inf(select));
+ result.sup(select) = min (u(select), result.sup(select));
- result.inf (result.inf > result.sup) = inf;
- result.sup (result.inf > result.sup) = -inf;
+ result.inf(result.inf > result.sup) = inf;
+ result.sup(result.inf > result.sup) = -inf;
endif
endfunction
-%!test "from the documentation string";
-%! assert (cosrev (0, infsup (6, 9)) == "[0x1.F6A7A2955385Ep2, 0x1.F6A7A2955386p2]");
+%!# from the documentation string
+%!assert (cosrev (0, infsup (6, 9)) == "[0x1.F6A7A2955385Ep2, 0x1.F6A7A2955386p2]");
+
+%!# correct use of signed zeros
+%!test
+%! x = cosrev (infsup (1), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/cot.m b/inst/@infsup/cot.m
index 3214e33..5142f48 100644
--- a/inst/@infsup/cot.m
+++ b/inst/@infsup/cot.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = cot (x)
+function x = cot (x)
if (nargin ~= 1)
print_usage ();
@@ -46,15 +46,17 @@ l = u = zeros (size (x));
## Check, if wid (x) is certainly greater than pi. This may save computation of
## some cotangent values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-certainlyfullperiod = width >= pi.sup;
+persistent pi = infsup ("pi");
+certainlyfullperiod = width >= sup (pi);
possiblynotfullperiod = not (certainlyfullperiod);
-l (possiblynotfullperiod) = mpfr_function_d ('cot', -inf, x.sup (possiblynotfullperiod));
-u (possiblynotfullperiod) = mpfr_function_d ('cot', inf, x.inf (possiblynotfullperiod));
+l(possiblynotfullperiod) = ...
+ mpfr_function_d ('cot', -inf, x.sup(possiblynotfullperiod));
+u(possiblynotfullperiod) = ...
+ mpfr_function_d ('cot', +inf, x.inf(possiblynotfullperiod));
-l (x.sup == 0) = -inf;
-u (x.inf == 0) = +inf;
+l(x.sup == 0) = -inf;
+u(x.inf == 0) = +inf;
singularity = certainlyfullperiod | ...
l > u | (...
@@ -62,16 +64,17 @@ singularity = certainlyfullperiod | ...
sign (l) == sign (u) | ...
max (abs (l), abs (u)) < 1));
-l (singularity) = -inf;
-u (singularity) = inf;
+l(singularity) = -inf;
+u(singularity) = inf;
emptyresult = isempty (x) | (x.inf == 0 & x.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (cot (infsup (1)) == "[0x1.48C05D04E1CFDp-1, 0x1.48C05D04E1CFEp-1]");
+%!# from the documentation string
+%!assert (cot (infsup (1)) == "[0x1.48C05D04E1CFDp-1, 0x1.48C05D04E1CFEp-1]");
diff --git a/inst/@infsup/coth.m b/inst/@infsup/coth.m
index 6df7ef8..d1e97dd 100644
--- a/inst/@infsup/coth.m
+++ b/inst/@infsup/coth.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = coth (x)
+function x = coth (x)
if (nargin ~= 1)
print_usage ();
@@ -44,25 +44,26 @@ endif
l = u = zeros (size (x.inf));
select = x.inf >= 0 | x.sup <= 0;
-if (any (any (select)))
- l (select) = mpfr_function_d ('coth', -inf, x.sup (select));
- l (select & x.sup == 0) = -inf;
- u (select) = mpfr_function_d ('coth', +inf, x.inf (select));
- u (select & x.inf == 0) = inf;
+if (any (select(:)))
+ l(select) = mpfr_function_d ('coth', -inf, x.sup(select));
+ l(select & x.sup == 0) = -inf;
+ u(select) = mpfr_function_d ('coth', +inf, x.inf(select));
+ u(select & x.inf == 0) = inf;
endif
select = x.inf < 0 & x.sup > 0;
-if (any (any (select)))
- l (select) = -inf;
- u (select) = inf;
+if (any (select(:)))
+ l(select) = -inf;
+ u(select) = inf;
endif
emptyresult = isempty (x) | (x.inf == 0 & x.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (coth (infsup (1)) == "[0x1.50231499B6B1D, 0x1.50231499B6B1E]");
+%!# from the documentation string
+%!assert (coth (infsup (1)) == "[0x1.50231499B6B1D, 0x1.50231499B6B1E]");
diff --git a/inst/@infsup/csc.m b/inst/@infsup/csc.m
index 0648417..f58c197 100644
--- a/inst/@infsup/csc.m
+++ b/inst/@infsup/csc.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = csc (x)
+function x = csc (x)
if (nargin ~= 1)
print_usage ();
@@ -46,43 +46,44 @@ l = u = derivl = derivu = zeros (size (x.inf));
## Check, if wid (x) is certainly greater than 2*pi. This can save the
## computation if some values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-certainlysingularity = width >= pi.sup;
+persistent pi = infsup ("pi");
+certainlysingularity = width >= sup (pi);
## We simply compute the cosecant for both endpoints.
-x.inf (x.inf == 0) = +0;
-x.sup (x.sup == 0) = -0;
+x.inf(x.inf == 0) = +0;
+x.sup(x.sup == 0) = -0;
select = not (certainlysingularity);
-l (select) = min (...
- mpfr_function_d ('csc', -inf, x.inf (select)), ...
- mpfr_function_d ('csc', -inf, x.sup (select)));
-u (select) = max (...
- mpfr_function_d ('csc', inf, x.inf (select)), ...
- mpfr_function_d ('csc', inf, x.sup (select)));
+l(select) = min (...
+ mpfr_function_d ('csc', -inf, x.inf(select)), ...
+ mpfr_function_d ('csc', -inf, x.sup(select)));
+u(select) = max (...
+ mpfr_function_d ('csc', inf, x.inf(select)), ...
+ mpfr_function_d ('csc', inf, x.sup(select)));
## A change of sign is a sufficient singularity indicator
certainlysingularity = certainlysingularity | (select & sign (l) ~= sign (u));
-l (certainlysingularity) = -inf;
-u (certainlysingularity) = inf;
+l(certainlysingularity) = -inf;
+u(certainlysingularity) = inf;
## Check, whether the interval contains a local extremum using the derivative
select = not (certainlysingularity);
-derivl (select) = -mpfr_function_d ('csc', 0, x.inf (select)) .* ...
- mpfr_function_d ('cot', 0, x.inf (select));
-derivu (select) = -mpfr_function_d ('csc', 0, x.sup (select)) .* ...
- mpfr_function_d ('cot', 0, x.sup (select));
+derivl(select) = -mpfr_function_d ('csc', 0, x.inf(select)) .* ...
+ mpfr_function_d ('cot', 0, x.inf(select));
+derivu(select) = -mpfr_function_d ('csc', 0, x.sup(select)) .* ...
+ mpfr_function_d ('cot', 0, x.sup(select));
hasextremum = select & ((derivl <= 0 & derivu >= 0) | ...
(derivl >= 0 & derivu <= 0));
-l (hasextremum & l > 0) = 1;
-u (hasextremum & u < 0) = -1;
+l(hasextremum & l > 0) = 1;
+u(hasextremum & u < 0) = -1;
emptyresult = isempty (x) | (x.inf == 0 & x.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (csc (infsup (1)) == "[0x1.303AA9620B223, 0x1.303AA9620B224]");
+%!# from the documentation string
+%!assert (csc (infsup (1)) == "[0x1.303AA9620B223, 0x1.303AA9620B224]");
diff --git a/inst/@infsup/csch.m b/inst/@infsup/csch.m
index d9ec0ab..2476b52 100644
--- a/inst/@infsup/csch.m
+++ b/inst/@infsup/csch.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = csch (x)
+function x = csch (x)
if (nargin ~= 1)
print_usage ();
@@ -44,25 +44,34 @@ endif
l = u = zeros (size (x.inf));
select = x.inf >= 0 | x.sup <= 0;
-if (any (any (select)))
- l (select) = mpfr_function_d ('csch', -inf, x.sup (select));
- l (select & x.sup == 0) = -inf;
- u (select) = mpfr_function_d ('csch', +inf, x.inf (select));
- u (select & x.inf == 0) = inf;
+if (any (select(:)))
+ l(select) = mpfr_function_d ('csch', -inf, x.sup(select));
+ l(select & x.sup == 0) = -inf;
+ u(select) = mpfr_function_d ('csch', +inf, x.inf(select));
+ u(select & x.inf == 0) = inf;
endif
select = x.inf < 0 & x.sup > 0;
-if (any (any (select)))
- l (select) = -inf;
- u (select) = inf;
+if (any (select(:)))
+ l(select) = -inf;
+ u(select) = inf;
endif
emptyresult = isempty (x) | (x.inf == 0 & x.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (csch (infsup (1)) == "[0x1.B3AB8A78B90Cp-1, 0x1.B3AB8A78B90C1p-1]");
+%!# from the documentation string
+%!assert (csch (infsup (1)) == "[0x1.B3AB8A78B90Cp-1, 0x1.B3AB8A78B90C1p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = csch (infsup (0, inf));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/ctranspose.m b/inst/@infsup/ctranspose.m
index 1188d24..d0cee8a 100644
--- a/inst/@infsup/ctranspose.m
+++ b/inst/@infsup/ctranspose.m
@@ -41,5 +41,4 @@ result = transpose (x);
endfunction
-%!test
-%! assert (ctranspose (infsup (magic (3))) == infsup (magic (3)'));
+%!assert (ctranspose (infsup (magic (3))) == infsup (magic (3)'));
diff --git a/inst/@infsup/det.m b/inst/@infsup/det.m
index 10a15e1..2bccb60 100644
--- a/inst/@infsup/det.m
+++ b/inst/@infsup/det.m
@@ -48,7 +48,7 @@ if (not (issquare (x.inf)))
error ("det: argument must be a square matrix");
endif
-if (any (any (isempty (x))))
+if (any (isempty (x)(:)))
result = infsup ();
return
endif
@@ -91,5 +91,5 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (det (infsup (magic (3))) == -360);
+%!# from the documentation string
+%!assert (det (infsup (magic (3))) == -360);
diff --git a/inst/@infsup/diag.m b/inst/@infsup/diag.m
index 2bdf0eb..354c2ad 100644
--- a/inst/@infsup/diag.m
+++ b/inst/@infsup/diag.m
@@ -36,13 +36,14 @@
## [0] [0] [3]
## @end group
## @end example
+## @seealso{@@infsup/tril, @@infsup/triu}
## @end deftypemethod
## Author: Oliver Heimlich
## Keywords: interval
## Created: 2015-10-23
-function result = diag (x, m, n)
+function x = diag (x, varargin)
if (nargin >= 2 && isa (m, 'infsup'))
error ('diag: invalid second argument; it must not be an interval');
@@ -50,22 +51,23 @@ endif
if (nargin >= 3 && isa (n, 'infsup'))
error ('diag: invalid third argument; it must not be an interval');
endif
+if (nargin > 3)
+ print_usage ();
+ return
+endif
+
+l = diag (x.inf, varargin{:});
+u = diag (x.sup, varargin{:});
+
+l(l == 0) = -0;
-switch (nargin)
- case 1
- result = infsup (diag (x.inf), diag (x.sup));
- case 2
- result = infsup (diag (x.inf, m), diag (x.sup, m));
- case 3
- result = infsup (diag (x.inf, m, n), diag (x.sup, m, n));
- otherwise
- print_usage ();
-endswitch
+x.inf = l;
+x.sup = u;
endfunction
%!assert (diag (infsup (-inf, inf)) == "[Entire]");
%!assert (diag (infsup ()) == "[Empty]");
%!assert (numel (diag (infsup ([]))), 0);
-%!xtest assert (isequal (diag (infsup (magic (3))), infsup ([8; 5; 2])));
-%!xtest assert (isequal (diag (infsup ([8 5 3])), infsup ([8 0 0; 0 5 0; 0 0 3])));
+%!assert (isequal (diag (infsup (magic (3))), infsup ([8; 5; 2])));
+%!assert (isequal (diag (infsup ([8 5 3])), infsup ([8 0 0; 0 5 0; 0 0 3])));
diff --git a/inst/@infsup/dilog.m b/inst/@infsup/dilog.m
index 577d29e..958b611 100644
--- a/inst/@infsup/dilog.m
+++ b/inst/@infsup/dilog.m
@@ -50,7 +50,7 @@
## Keywords: interval
## Created: 2015-02-29
-function result = dilog (x)
+function x = dilog (x)
if (nargin ~= 1)
print_usage ();
@@ -63,24 +63,26 @@ u = -l;
## Monotonically increasing for x1
x1 = intersect (x, infsup (-inf, 2));
select = not (isempty (x1));
-if (any (any (select)))
- l (select) = mpfr_function_d ('dilog', -inf, x1.inf (select));
- u (select) = mpfr_function_d ('dilog', +inf, x1.sup (select));
+if (any (select(:)))
+ l(select) = mpfr_function_d ('dilog', -inf, x1.inf(select));
+ u(select) = mpfr_function_d ('dilog', +inf, x1.sup(select));
endif
## Monotonically decreasing for x2
x2 = intersect (x, infsup (2, inf));
select = not (isempty (x2));
-if (any (any (select)))
- l (select) = min (l (select), ...
- mpfr_function_d ('dilog', -inf, x2.sup (select)));
- u (select) = mpfr_function_d ('dilog', +inf, x2.inf (select));
+if (any (select(:)))
+ l(select) = min (l(select), ...
+ mpfr_function_d ('dilog', -inf, x2.sup(select)));
+ u(select) = mpfr_function_d ('dilog', +inf, x2.inf(select));
endif
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
%!assert (dilog (infsup (-inf, inf)) == "[-Inf, +0x1.3BD3CC9BE45DFp1]");
-%!test "from the documentation string";
-%! assert (dilog (infsup (1)) == "[0x1.A51A6625307D3, 0x1.A51A6625307D4]");
+
+%!# from the documentation string
+%!assert (dilog (infsup (1)) == "[0x1.A51A6625307D3, 0x1.A51A6625307D4]");
diff --git a/inst/@infsup/disjoint.m b/inst/@infsup/disjoint.m
index 0fe62f9..6c413b5 100644
--- a/inst/@infsup/disjoint.m
+++ b/inst/@infsup/disjoint.m
@@ -46,7 +46,7 @@ endif
result = (a.sup < b.inf | b.sup < a.inf);
-result (isempty (a) | isempty (b)) = true ();
+result(isempty (a) | isempty (b)) = true;
endfunction
diff --git a/inst/@infsup/disp.m b/inst/@infsup/disp.m
index f3b93ad..0bf78cf 100644
--- a/inst/@infsup/disp.m
+++ b/inst/@infsup/disp.m
@@ -66,8 +66,8 @@ if (not (iscell (s)))
if (nargout == 0)
disp (s);
else
- varargout {1} = cstrcat (s, "\n");
- varargout {2} = isexact;
+ varargout{1} = cstrcat (s, "\n");
+ varargout{2} = isexact;
endif
return
endif
@@ -78,25 +78,25 @@ columnwidth += 3; # add 3 spaces between columns
## Print all columns
buffer = "";
-if (rows (x) > 0)
+if (rows (x.inf) > 0)
## FIXME: See display.m for how current_print_indent_level is used
global current_print_indent_level;
- maxwidth = terminal_size () (2) - current_print_indent_level;
+ maxwidth = terminal_size ()(2) - current_print_indent_level;
cstart = uint32 (1);
cend = cstart - 1;
- while (cstart <= columns (x))
+ while (cstart <= columns (x.inf))
## Determine number of columns to print, print at least one column
usedwidth = 0;
submatrix = "";
do
cend ++;
submatrix = strcat (submatrix, ...
- prepad (strjust (char (s (:, cend))), columnwidth (cend), " ", 2));
- usedwidth += columnwidth (cend);
- until (cend == columns (x) || ...
+ prepad (strjust (char (s(:, cend))), columnwidth(cend), " ", 2));
+ usedwidth += columnwidth(cend);
+ until (cend == columns (x.inf) || ...
(split_long_rows () && ...
- usedwidth + columnwidth (cend + 1) > maxwidth))
- if (cstart > 1 || cend < columns (x))
+ usedwidth + columnwidth(cend + 1) > maxwidth))
+ if (cstart > 1 || cend < columns (x.inf))
if (cstart > 1)
buffer = cstrcat (buffer, "\n");
endif
@@ -120,11 +120,15 @@ if (rows (x) > 0)
endif
if (nargout > 0)
- varargout {1} = buffer;
- varargout {2} = isexact;
+ varargout{1} = buffer;
+ varargout{2} = isexact;
endif
endfunction
-%!## Can't test the disp function. Would have to capture console output
-%!assert (1);
+%!assert (disp (infsup([])), "");
+%!assert (disp (infsup(0)), "[0]\n");
+%!assert (disp (infsup(0, 1)), "[0, 1]\n");
+%!assert (disp (infsup([0 0])), " [0] [0]\n");
+%!assert (disp (infsup([0 0; 0 0])), " [0] [0]\n [0] [0]\n");
+%!assert (disp (infsup([0; 0])), " [0]\n [0]\n");
diff --git a/inst/@infsup/display.m b/inst/@infsup/display.m
index 5b75762..c377863 100644
--- a/inst/@infsup/display.m
+++ b/inst/@infsup/display.m
@@ -83,7 +83,7 @@ unwind_protect
current_print_indent_level = 0;
endif
- line_prefix = " " (ones (1, current_print_indent_level));
+ line_prefix = " "(ones (1, current_print_indent_level));
[s, isexact] = disp (x);
@@ -126,7 +126,7 @@ unwind_protect
if (current_print_indent_level > 0)
s = strrep (s, "\n", cstrcat ("\n", line_prefix));
- s (end - current_print_indent_level + 1 : end) = "";
+ s(end - current_print_indent_level + 1 : end) = "";
endif
printf (s);
@@ -139,5 +139,6 @@ end_unwind_protect
endfunction
-%!## Can't test the display function. Would have to capture console output
+%!# Can't test the display function. Would have to capture console output.
+%!# However, this is largely done with the help of the doctest package.
%!assert (1);
diff --git a/inst/@infsup/dot.m b/inst/@infsup/dot.m
index cbed8f7..ec5f60a 100644
--- a/inst/@infsup/dot.m
+++ b/inst/@infsup/dot.m
@@ -43,7 +43,7 @@
## Keywords: interval
## Created: 2014-10-26
-function result = dot (x, y, dim)
+function x = dot (x, y, dim)
if (nargin < 2 || nargin > 3)
print_usage ();
@@ -75,7 +75,7 @@ endif
## null matrix input -> null matrix output
if (isempty (x.inf) || isempty (y.inf))
- result = infsup (zeros (min (size (x.inf), size (y.inf))));
+ x = infsup (zeros (min (size (x.inf), size (y.inf))));
return
endif
@@ -89,15 +89,15 @@ if ((min (size (x.inf, 1), size (y.inf, 1)) > 1 && ...
endif
resultsize = max (size (x.inf), size (y.inf));
-resultsize (dim) = 1;
+resultsize(dim) = 1;
l = u = zeros (resultsize);
for n = 1 : numel (l)
idx.type = "()";
idx.subs = cell (1, 2);
- idx.subs {dim} = ":";
- idx.subs {3 - dim} = n;
+ idx.subs{dim} = ":";
+ idx.subs{3 - dim} = n;
## Select current vector in matrix or broadcast scalars and vectors.
if (size (x.inf, 3 - dim) == 1)
@@ -114,7 +114,10 @@ for n = 1 : numel (l)
[l(n), u(n)] = vectordot (vector.x, vector.y);
endfor
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
@@ -134,28 +137,32 @@ endif
endfunction
-%!test "matrix × matrix";
-%! assert (dot (infsup (magic (3)), magic (3)) == [89, 107, 89]);
-%! assert (dot (infsup (magic (3)), magic (3), 1) == [89, 107, 89]);
-%! assert (dot (infsup (magic (3)), magic (3), 2) == [101; 83; 101]);
-%!test "matrix × vector";
-%! assert (dot (infsup (magic (3)), [1, 2, 3]) == [15, 30, 45]);
-%! assert (dot (infsup (magic (3)), [1, 2, 3], 1) == [15, 30, 45]);
-%! assert (dot (infsup (magic (3)), [1, 2, 3], 2) == [28; 34; 28]);
-%! assert (dot (infsup (magic (3)), [1; 2; 3]) == [26, 38, 26]);
-%! assert (dot (infsup (magic (3)), [1; 2; 3], 1) == [26, 38, 26]);
-%! assert (dot (infsup (magic (3)), [1; 2; 3], 2) == [15; 30; 45]);
-%!test "matrix × scalar";
-%! assert (dot (infsup (magic (3)), 42) == [630, 630, 630]);
-%! assert (dot (infsup (magic (3)), 42, 1) == [630, 630, 630]);
-%! assert (dot (infsup (magic (3)), 42, 2) == [630; 630; 630]);
-%!test "vector × scalar";
-%! assert (dot (infsup ([1, 2, 3]), 42) == 252);
-%! assert (dot (infsup ([1, 2, 3]), 42, 1) == [42, 84, 126]);
-%! assert (dot (infsup ([1, 2, 3]), 42, 2) == 252);
-%! assert (dot (infsup ([1; 2; 3]), 42) == 252);
-%! assert (dot (infsup ([1; 2; 3]), 42, 1) == 252);
-%! assert (dot (infsup ([1; 2; 3]), 42, 2) == [42; 84; 126]);
-%!test "from the documentation string";
-%! assert (dot ([infsup(1), 2, 3], [infsup(2), 3, 4]) == 20);
-%! assert (dot (infsup ([realmax; realmin; realmax]), [1; -1; -1], 1) == -realmin);
+%!# matrix × matrix
+%!assert (dot (infsup (magic (3)), magic (3)) == [89, 107, 89]);
+%!assert (dot (infsup (magic (3)), magic (3), 1) == [89, 107, 89]);
+%!assert (dot (infsup (magic (3)), magic (3), 2) == [101; 83; 101]);
+
+%!# matrix × vector
+%!assert (dot (infsup (magic (3)), [1, 2, 3]) == [15, 30, 45]);
+%!assert (dot (infsup (magic (3)), [1, 2, 3], 1) == [15, 30, 45]);
+%!assert (dot (infsup (magic (3)), [1, 2, 3], 2) == [28; 34; 28]);
+%!assert (dot (infsup (magic (3)), [1; 2; 3]) == [26, 38, 26]);
+%!assert (dot (infsup (magic (3)), [1; 2; 3], 1) == [26, 38, 26]);
+%!assert (dot (infsup (magic (3)), [1; 2; 3], 2) == [15; 30; 45]);
+
+%!# matrix × scalar
+%!assert (dot (infsup (magic (3)), 42) == [630, 630, 630]);
+%!assert (dot (infsup (magic (3)), 42, 1) == [630, 630, 630]);
+%!assert (dot (infsup (magic (3)), 42, 2) == [630; 630; 630]);
+
+%!# vector × scalar
+%!assert (dot (infsup ([1, 2, 3]), 42) == 252);
+%!assert (dot (infsup ([1, 2, 3]), 42, 1) == [42, 84, 126]);
+%!assert (dot (infsup ([1, 2, 3]), 42, 2) == 252);
+%!assert (dot (infsup ([1; 2; 3]), 42) == 252);
+%!assert (dot (infsup ([1; 2; 3]), 42, 1) == 252);
+%!assert (dot (infsup ([1; 2; 3]), 42, 2) == [42; 84; 126]);
+
+%!# from the documentation string
+%!assert (dot ([infsup(1), 2, 3], [infsup(2), 3, 4]) == 20);
+%!assert (dot (infsup ([realmax; realmin; realmax]), [1; -1; -1], 1) == -realmin);
diff --git a/inst/@infsup/ei.m b/inst/@infsup/ei.m
index 71ee2f4..722593e 100644
--- a/inst/@infsup/ei.m
+++ b/inst/@infsup/ei.m
@@ -50,7 +50,7 @@
## Keywords: interval
## Created: 2015-02-29
-function result = ei (x)
+function x = ei (x)
if (nargin ~= 1)
print_usage ();
@@ -62,10 +62,13 @@ u = -l;
## ei is monotonically increasing and defined for x > 0
defined = x.sup > 0;
-l (defined) = mpfr_function_d ('ei', -inf, max (0, x.inf (defined)));
-u (defined) = mpfr_function_d ('ei', +inf, x.sup (defined));
+l(defined) = mpfr_function_d ('ei', -inf, max (0, x.inf(defined)));
+u(defined) = mpfr_function_d ('ei', +inf, x.sup(defined));
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
@@ -73,5 +76,5 @@ endfunction
%!assert (isempty (ei (infsup (-inf, -2))));
%!assert (isentire (ei (infsup (0, inf))));
-%!test "from the documentation string";
-%! assert (ei (infsup (1)) == "[0x1.E52670F350D08, 0x1.E52670F350D09]");
+%!# from the documentation string
+%!assert (ei (infsup (1)) == "[0x1.E52670F350D08, 0x1.E52670F350D09]");
diff --git a/inst/@infsup/erf.m b/inst/@infsup/erf.m
index cb6228a..5adac16 100644
--- a/inst/@infsup/erf.m
+++ b/inst/@infsup/erf.m
@@ -51,7 +51,7 @@
## Keywords: interval
## Created: 2015-02-28
-function result = erf (x)
+function x = erf (x)
if (nargin ~= 1)
print_usage ();
@@ -63,12 +63,21 @@ l = mpfr_function_d ('erf', -inf, x.inf);
u = mpfr_function_d ('erf', +inf, x.sup);
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (erf (infsup (1)) == "[0x1.AF767A741088Ap-1, 0x1.AF767A741088Bp-1]");
+%!# from the documentation string
+%!assert (erf (infsup (1)) == "[0x1.AF767A741088Ap-1, 0x1.AF767A741088Bp-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = erf (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/erfc.m b/inst/@infsup/erfc.m
index 9891fe2..742b0de 100644
--- a/inst/@infsup/erfc.m
+++ b/inst/@infsup/erfc.m
@@ -17,7 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsup} erfc (@var{X})
##
-## Compute the complementary error function.
+## Compute the complementary error function @code{1 - erf (@var{X})}.
##
## @tex
## $$
@@ -51,7 +51,7 @@
## Keywords: interval
## Created: 2015-02-28
-function result = erfc (x)
+function x = erfc (x)
if (nargin ~= 1)
print_usage ();
@@ -63,12 +63,21 @@ l = mpfr_function_d ('erfc', -inf, x.sup);
u = mpfr_function_d ('erfc', +inf, x.inf);
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (erfc (infsup (1)) == "[0x1.4226162FBDDD4p-3, 0x1.4226162FBDDD5p-3]");
+%!# from the documentation string
+%!assert (erfc (infsup (1)) == "[0x1.4226162FBDDD4p-3, 0x1.4226162FBDDD5p-3]");
+
+%!# correct use of signed zeros
+%!test
+%! x = erfc (infsup (realmax));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/exp.m b/inst/@infsup/exp.m
index b02a101..5ee9439 100644
--- a/inst/@infsup/exp.m
+++ b/inst/@infsup/exp.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = exp (x)
+function x = exp (x)
if (nargin ~= 1)
print_usage ();
@@ -45,11 +45,19 @@ endif
l = mpfr_function_d ('exp', -inf, x.inf); # this also works for empty intervals
u = mpfr_function_d ('exp', +inf, x.sup); # ... this does not
-u (isempty (x)) = -inf;
+l(l == 0) = -0;
+u(isempty (x)) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (exp (infsup (1)) == infsup ("e"));
+%!# from the documentation string
+%!assert (exp (infsup (1)) == infsup ("e"));
+
+%!# correct use of signed zeros
+%!test
+%! x = exp (infsup (-realmax));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/expm.m b/inst/@infsup/expm.m
index 0093d9d..9df95b3 100644
--- a/inst/@infsup/expm.m
+++ b/inst/@infsup/expm.m
@@ -122,6 +122,7 @@ result = mpower (result, pow2 (L));
endfunction
-%!test "from the paper";
+%!# from the paper
+%!test
%! A = infsup ([0 1; 0 -3], [0 1; 0 -2]);
-%! assert (all (all (subset (infsup ([1, 0.316738; 0, 0.0497871], [1, 0.432332; 0 0.135335]), expm (A)))));
\ No newline at end of file
+%! assert (all (all (subset (infsup ([1, 0.316738; 0, 0.0497871], [1, 0.432332; 0, 0.135335]), expm (A)))));
\ No newline at end of file
diff --git a/inst/@infsup/expm1.m b/inst/@infsup/expm1.m
index 33d52cc..60f3663 100644
--- a/inst/@infsup/expm1.m
+++ b/inst/@infsup/expm1.m
@@ -17,7 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsup} expm1 (@var{X})
##
-## Compute @code{exp (@var{X} - 1)} accurately in the neighborhood of zero.
+## Compute @code{exp (@var{X}) - 1} accurately in the neighborhood of zero.
##
## Accuracy: The result is a tight enclosure.
##
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-02-20
-function result = expm1 (x)
+function x = expm1 (x)
if (nargin ~= 1)
print_usage ();
@@ -45,11 +45,19 @@ endif
l = mpfr_function_d ('expm1', -inf, x.inf); # this also works for [Empty]
u = mpfr_function_d ('expm1', +inf, x.sup); # ... this does not
-u (isempty (x)) = -inf;
+l(l == 0) = -0;
+u(isempty (x)) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (expm1 (infsup (eps)) == "[0x1p-52, 0x1.0000000000001p-52]");
+%!# from the documentation string
+%!assert (expm1 (infsup (eps)) == "[0x1p-52, 0x1.0000000000001p-52]");
+
+%!# correct use of signed zeros
+%!test
+%! x = expm1 (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/factorial.m b/inst/@infsup/factorial.m
index 2a54652..c9a7045 100644
--- a/inst/@infsup/factorial.m
+++ b/inst/@infsup/factorial.m
@@ -17,8 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsup} factorial (@var{N})
##
-## Compute the factorial of @var{N} where @var{N} is a real non-negative
-## integer.
+## Compute the factorial of @var{N} where @var{N} is a non-negative integer.
##
## If @var{N} is a scalar, this is equivalent to
## @display
@@ -28,7 +27,7 @@
## array.
##
## For non-integers see the generalized factorial function @command{gamma}.
-## Not that the factorial function grows large quite quickly, and the result
+## Note that the factorial function grows large quite quickly, and the result
## cannot be represented exactly in binary64 for @var{N} ≥ 23 and will overflow
## for @var{N} ≥ 171.
##
@@ -47,7 +46,7 @@
## Keywords: interval
## Created: 2016-01-31
-function result = factorial (x)
+function x = factorial (x)
if (nargin ~= 1)
print_usage ();
@@ -58,20 +57,22 @@ l = max (0, ceil (x.inf));
u = floor (x.sup);
emptyresult = l > u;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-l (not (emptyresult)) = ...
- mpfr_function_d ("factorial", -inf, l (not (emptyresult)));
-u (not (emptyresult)) = ...
- mpfr_function_d ("factorial", +inf, u (not (emptyresult)));
+l(not (emptyresult)) = ...
+ mpfr_function_d ("factorial", -inf, l(not (emptyresult)));
+u(not (emptyresult)) = ...
+ mpfr_function_d ("factorial", +inf, u(not (emptyresult)));
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (factorial (infsup (6)) == 720);
+%!# from the documentation string
+%!assert (factorial (infsup (6)) == 720);
+
%!assert (factorial (infsup (0)) == 1);
%!assert (factorial (infsup ("[0, 1.99]")) == 1);
%!assert (factorial (infsup ("[0, 2]")) == "[1, 2]");
diff --git a/inst/@infsup/fix.m b/inst/@infsup/fix.m
index 4354953..f6f5a95 100644
--- a/inst/@infsup/fix.m
+++ b/inst/@infsup/fix.m
@@ -37,40 +37,62 @@
## Keywords: interval
## Created: 2014-10-04
-function result = fix (x)
+function x = fix (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = infsup (fix (x.inf), fix (x.sup));
+x.inf = fix (x.inf);
+x.sup = fix (x.sup);
+
+x.inf(x.inf == 0) = -0;
+x.sup(x.sup == 0) = +0;
endfunction
-%!test "Empty interval";
-%! assert (fix (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (fix (infsup (0)) == infsup (0));
-%! assert (fix (infsup (1)) == infsup (1));
-%! assert (fix (infsup (1+eps)) == infsup (1));
-%! assert (fix (infsup (-1)) == infsup (-1));
-%! assert (fix (infsup (0.5)) == infsup (0));
-%! assert (fix (infsup (-0.5)) == infsup (0));
-%!test "Bounded intervals";
-%! assert (fix (infsup (-0.5, 0)) == infsup (0));
-%! assert (fix (infsup (0, 0.5)) == infsup (0));
-%! assert (fix (infsup (0.25, 0.5)) == infsup (0));
-%! assert (fix (infsup (-1, 0)) == infsup (-1, 0));
-%! assert (fix (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (fix (infsup (-realmin, realmin)) == infsup (0));
-%! assert (fix (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
-%!test "Unbounded intervals";
-%! assert (fix (infsup (-realmin, inf)) == infsup (0, inf));
-%! assert (fix (infsup (-realmax, inf)) == infsup (-realmax, inf));
-%! assert (fix (infsup (-inf, realmin)) == infsup (-inf, 0));
-%! assert (fix (infsup (-inf, realmax)) == infsup (-inf, realmax));
-%! assert (fix (infsup (-inf, inf)) == infsup (-inf, inf));
-%!test "from the documentation string";
-%! assert (fix (infsup (2.5, 3.5)) == infsup (2, 3));
-%! assert (fix (infsup (-0.5, 5)) == infsup (0, 5));
+%!# Empty interval
+%!assert (fix (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (fix (infsup (0)) == infsup (0));
+%!assert (fix (infsup (1)) == infsup (1));
+%!assert (fix (infsup (1+eps)) == infsup (1));
+%!assert (fix (infsup (-1)) == infsup (-1));
+%!assert (fix (infsup (0.5)) == infsup (0));
+%!assert (fix (infsup (-0.5)) == infsup (0));
+
+%!# Bounded intervals
+%!assert (fix (infsup (-0.5, 0)) == infsup (0));
+%!assert (fix (infsup (0, 0.5)) == infsup (0));
+%!assert (fix (infsup (0.25, 0.5)) == infsup (0));
+%!assert (fix (infsup (-1, 0)) == infsup (-1, 0));
+%!assert (fix (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (fix (infsup (-realmin, realmin)) == infsup (0));
+%!assert (fix (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
+
+%!# Unbounded intervals
+%!assert (fix (infsup (-realmin, inf)) == infsup (0, inf));
+%!assert (fix (infsup (-realmax, inf)) == infsup (-realmax, inf));
+%!assert (fix (infsup (-inf, realmin)) == infsup (-inf, 0));
+%!assert (fix (infsup (-inf, realmax)) == infsup (-inf, realmax));
+%!assert (fix (infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# from the documentation string
+%!assert (fix (infsup (2.5, 3.5)) == infsup (2, 3));
+%!assert (fix (infsup (-0.5, 5)) == infsup (0, 5));
+
+%!# correct use of signed zeros
+%!test
+%! x = fix (infsup (0.5));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = fix (infsup (-0.5));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = fix (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/floor.m b/inst/@infsup/floor.m
index 9da564d..3a9a5ab 100644
--- a/inst/@infsup/floor.m
+++ b/inst/@infsup/floor.m
@@ -36,37 +36,54 @@
## Keywords: interval
## Created: 2014-10-04
-function result = floor (x)
+function x = floor (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = infsup (floor (x.inf), floor (x.sup));
+x.inf = floor (x.inf);
+x.sup = floor (x.sup);
+
+x.inf(x.inf == 0) = -0;
endfunction
-%!test "Empty interval";
-%! assert (floor (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (floor (infsup (0)) == infsup (0));
-%! assert (floor (infsup (0.5)) == infsup (0));
-%! assert (floor (infsup (-0.5)) == infsup (-1));
-%!test "Bounded intervals";
-%! assert (floor (infsup (-0.5, 0)) == infsup (-1, 0));
-%! assert (floor (infsup (0, 0.5)) == infsup (0));
-%! assert (floor (infsup (0.25, 0.5)) == infsup (0));
-%! assert (floor (infsup (-1, 0)) == infsup (-1, 0));
-%! assert (floor (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (floor (infsup (-realmin, realmin)) == infsup (-1, 0));
-%! assert (floor (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
-%!test "Unbounded intervals";
-%! assert (floor (infsup (-realmin, inf)) == infsup (-1, inf));
-%! assert (floor (infsup (-realmax, inf)) == infsup (-realmax, inf));
-%! assert (floor (infsup (-inf, realmin)) == infsup (-inf, 0));
-%! assert (floor (infsup (-inf, realmax)) == infsup (-inf, realmax));
-%! assert (floor (infsup (-inf, inf)) == infsup (-inf, inf));
-%!test "from the documentation string";
-%! assert (floor (infsup (2.5, 3.5)) == infsup (2, 3));
-%! assert (floor (infsup (-0.5, 5)) == infsup (-1, 5));
+%!# Empty interval
+%!assert (floor (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (floor (infsup (0)) == infsup (0));
+%!assert (floor (infsup (0.5)) == infsup (0));
+%!assert (floor (infsup (-0.5)) == infsup (-1));
+
+%!# Bounded intervals
+%!assert (floor (infsup (-0.5, 0)) == infsup (-1, 0));
+%!assert (floor (infsup (0, 0.5)) == infsup (0));
+%!assert (floor (infsup (0.25, 0.5)) == infsup (0));
+%!assert (floor (infsup (-1, 0)) == infsup (-1, 0));
+%!assert (floor (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (floor (infsup (-realmin, realmin)) == infsup (-1, 0));
+%!assert (floor (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
+
+%!# Unbounded intervals
+%!assert (floor (infsup (-realmin, inf)) == infsup (-1, inf));
+%!assert (floor (infsup (-realmax, inf)) == infsup (-realmax, inf));
+%!assert (floor (infsup (-inf, realmin)) == infsup (-inf, 0));
+%!assert (floor (infsup (-inf, realmax)) == infsup (-inf, realmax));
+%!assert (floor (infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# from the documentation string
+%!assert (floor (infsup (2.5, 3.5)) == infsup (2, 3));
+%!assert (floor (infsup (-0.5, 5)) == infsup (-1, 5));
+
+%!# correct use of signed zeros
+%!test
+%! x = floor (infsup (0.5));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = floor (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/fma.m b/inst/@infsup/fma.m
index 1f8b822..c1d1e82 100644
--- a/inst/@infsup/fma.m
+++ b/inst/@infsup/fma.m
@@ -41,7 +41,7 @@
## Keywords: interval
## Created: 2014-10-03
-function result = fma (x, y, z)
+function x = fma (x, y, z)
if (nargin ~= 3)
print_usage ();
@@ -58,19 +58,19 @@ if (not (isa (z, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
y.sup = ones (size (x.inf)) .* y.sup;
endif
-if (isscalar (y.inf) ~= isscalar (z.inf))
+if (not (size_equal (y.inf, z.inf)))
y.inf = ones (size (z.inf)) .* y.inf;
y.sup = ones (size (z.inf)) .* y.sup;
z.inf = ones (size (y.inf)) .* z.inf;
z.sup = ones (size (y.inf)) .* z.sup;
endif
-if (isscalar (x.inf) ~= isscalar (z.inf))
+if (not (size_equal (x.inf, z.inf)))
x.inf = ones (size (z.inf)) .* x.inf;
x.sup = ones (size (z.inf)) .* x.sup;
z.inf = ones (size (x.inf)) .* z.inf;
@@ -84,10 +84,10 @@ endif
entireproduct = isentire (x) | isentire (y);
zeroproduct = (x.inf == 0 & x.sup == 0) | (y.inf == 0 & y.sup == 0);
emptyresult = isempty (x) | isempty (y) | isempty (z);
-x.inf (entireproduct) = y.inf (entireproduct) = -inf;
-x.sup (entireproduct) = y.sup (entireproduct) = inf;
-x.inf (zeroproduct) = x.sup (zeroproduct) = ...
- y.inf (zeroproduct) = y.sup (zeroproduct) = 0;
+x.inf(entireproduct) = y.inf(entireproduct) = -inf;
+x.sup(entireproduct) = y.sup(entireproduct) = inf;
+x.inf(zeroproduct) = x.sup(zeroproduct) = ...
+ y.inf(zeroproduct) = y.sup(zeroproduct) = 0;
## It is hard to determine, which boundaries of x and y take part in the
## multiplication of fma. Therefore, we simply compute the fma for each triple
@@ -110,12 +110,29 @@ u = max (max (max (...
mpfr_function_d ('fma', +inf, x.sup, y.inf, z.sup)), ...
mpfr_function_d ('fma', +inf, x.sup, y.sup, z.sup));
-l (emptyresult) = +inf;
-u (emptyresult) = -inf;
+l(emptyresult) = +inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (fma (infsup (1+eps), infsup (7), infsup ("0.1")) == "[0x1.C666666666668p2, 0x1.C666666666669p2]");
+%!# from the documentation string
+%!assert (fma (infsup (1+eps), infsup (7), infsup ("0.1")) == "[0x1.C666666666668p2, 0x1.C666666666669p2]");
+
+%!# correct use of signed zeros
+%!test
+%! x = fma (infsup (0), 0, 0);
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = fma (infsup (1), 0, 0);
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = fma (infsup (1), 1, -1);
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/fminsearch.m b/inst/@infsup/fminsearch.m
index 08300f5..15d2cf3 100644
--- a/inst/@infsup/fminsearch.m
+++ b/inst/@infsup/fminsearch.m
@@ -14,7 +14,7 @@
## along with this program; if not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
-## @documentencoding utf-8
+## @documentencoding UTF-8
## @deftypemethod {@@infsup} {@var{X} =} fminsearch (@var{f}, @var{X0})
## @deftypemethodx {@@infsup} {[@var{X}, @var{FVAL}] =} fminsearch (@var{f}, @var{X0}, @var{options})
##
diff --git a/inst/@infsup/fzero.m b/inst/@infsup/fzero.m
index ea4c797..b5ee137 100644
--- a/inst/@infsup/fzero.m
+++ b/inst/@infsup/fzero.m
@@ -75,7 +75,7 @@
## Keywords: interval
## Created: 2015-02-01
-function result = fzero (f, x0, df, options)
+function x = fzero (f, x0, df, options)
if (nargin > 4 || nargin < 2)
print_usage ();
@@ -128,7 +128,9 @@ endif
[l, u] = findroots (f, df, x0, 0, options);
-result = infsup (l, u);
+x = infsup ();
+x.inf = l;
+x.sup = u;
endfunction
diff --git a/inst/@infsup/gamma.m b/inst/@infsup/gamma.m
index 45afbe4..387a2dc 100644
--- a/inst/@infsup/gamma.m
+++ b/inst/@infsup/gamma.m
@@ -59,9 +59,6 @@ if (nargin ~= 1)
return
endif
-u = inf (size (x.inf));
-l = -u;
-
## Positive x =================================================================
## https://oeis.org/A030169
@@ -78,22 +75,24 @@ u = -l;
## Monotonically decreasing for x1
x1 = intersect (x, infsup (0, x_min_sup));
select = not (isempty (x1)) & x1.sup > 0;
-if (any (any (select)))
- x1.inf (x1.inf == 0) = 0; # fix negative zero
- l (select) = mpfr_function_d ('gamma', -inf, x1.sup (select));
- u (select) = mpfr_function_d ('gamma', +inf, x1.inf (select));
+if (any (select(:)))
+ x1.inf(x1.inf == 0) = 0; # fix negative zero
+ l(select) = mpfr_function_d ('gamma', -inf, x1.sup(select));
+ u(select) = mpfr_function_d ('gamma', +inf, x1.inf(select));
endif
## Monotonically increasing for x2
x2 = intersect (x, infsup (x_min_inf, inf));
select = not (isempty (x2));
-if (any (any (select)))
- l (select) = mpfr_function_d ('gamma', -inf, x2.inf (select));
- u (select) = max (u (select), ...
- mpfr_function_d ('gamma', +inf, x2.sup (select)));
+if (any (select(:)))
+ l(select) = mpfr_function_d ('gamma', -inf, x2.inf(select));
+ u(select) = max (u(select), ...
+ mpfr_function_d ('gamma', +inf, x2.sup(select)));
endif
-pos = infsup (l, u);
+pos = infsup ();
+pos.inf = l;
+pos.sup = u;
## Negative x =================================================================
@@ -103,66 +102,70 @@ u = inf (size (x.inf));
l = -u;
nosingularity = floor (x.inf) + 1 == ceil (x.sup);
-if (any (any (nosingularity)))
+if (any (nosingularity(:)))
negative_value = nosingularity & mod (ceil (x.sup), 2) == 0;
positive_value = nosingularity & not (negative_value);
- x.sup (x.sup == 0) = -0; # fix negative zero
+ x.sup(x.sup == 0) = -0; # fix negative zero
psil = psiu = zeros (size (x.inf));
- psil (nosingularity) = mpfr_function_d ('psi', 0, x.inf (nosingularity));
- psil (isnan (psil)) = -inf;
- psiu (nosingularity) = mpfr_function_d ('psi', 0, x.sup (nosingularity));
- psiu (isnan (psiu)) = inf;
+ psil(nosingularity) = mpfr_function_d ('psi', 0, x.inf(nosingularity));
+ psil(isnan (psil)) = -inf;
+ psiu(nosingularity) = mpfr_function_d ('psi', 0, x.sup(nosingularity));
+ psiu(isnan (psiu)) = inf;
encloses_extremum = false (size (x.inf));
- encloses_extremum (nosingularity) = ...
- psil (nosingularity) <= 0 & psiu (nosingularity) >= 0;
- encloses_extremum (x.sup == x.inf + 1) = true ();
+ encloses_extremum(nosingularity) = ...
+ psil(nosingularity) <= 0 & psiu(nosingularity) >= 0;
+ encloses_extremum(x.sup == x.inf + 1) = true ();
select = encloses_extremum & negative_value & ...
fix (x.inf) ~= x.inf & fix (x.sup) ~= x.sup;
- if (any (any (select)))
- l (select) = min (mpfr_function_d ('gamma', -inf, x.inf (select)), ...
- mpfr_function_d ('gamma', -inf, x.sup (select)));
+ if (any (select(:)))
+ l(select) = min (mpfr_function_d ('gamma', -inf, x.inf(select)), ...
+ mpfr_function_d ('gamma', -inf, x.sup(select)));
endif
select = encloses_extremum & positive_value & ...
fix (x.inf) ~= x.inf & fix (x.sup) ~= x.sup;
- if (any (any (select)))
- u (select) = max (mpfr_function_d ('gamma', +inf, x.inf (select)), ...
- mpfr_function_d ('gamma', +inf, x.sup (select)));
+ if (any (select(:)))
+ u(select) = max (mpfr_function_d ('gamma', +inf, x.inf(select)), ...
+ mpfr_function_d ('gamma', +inf, x.sup(select)));
endif
select = not (encloses_extremum) & negative_value;
- u (select) = -inf;
+ u(select) = -inf;
select = not (encloses_extremum) & positive_value;
- l (select) = inf;
+ l(select) = inf;
select = nosingularity & not (encloses_extremum);
- if (any (any (select)))
- l (select) = min (l (select), ...
- min (mpfr_function_d ('gamma', -inf, x.inf (select)), ...
- mpfr_function_d ('gamma', -inf, x.sup (select))));
- u (select) = max (u (select), ...
- max (mpfr_function_d ('gamma', +inf, x.inf (select)), ...
- mpfr_function_d ('gamma', +inf, x.sup (select))));
+ if (any (select(:)))
+ l(select) = min (l(select), ...
+ min (mpfr_function_d ('gamma', -inf, x.inf(select)), ...
+ mpfr_function_d ('gamma', -inf, x.sup(select))));
+ u(select) = max (u(select), ...
+ max (mpfr_function_d ('gamma', +inf, x.inf(select)), ...
+ mpfr_function_d ('gamma', +inf, x.sup(select))));
endif
select = encloses_extremum & negative_value;
- if (any (any (select)))
- u (select) = find_extremum (x.inf (select), x.sup (select));
+ if (any (select(:)))
+ u(select) = find_extremum (x.inf(select), x.sup(select));
endif
select = encloses_extremum & positive_value;
- if (any (any (select)))
- l (select) = find_extremum (x.inf (select), x.sup (select));
+ if (any (select(:)))
+ l(select) = find_extremum (x.inf(select), x.sup(select));
endif
endif
emptyresult = (x.inf == x.sup & fix (x.inf) == x.inf & x.inf <= 0) | x.inf > 0;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
+
+l(l == 0) = -0;
-neg = infsup (l, u);
+neg = infsup ();
+neg.inf = l;
+neg.sup = u;
## ============================================================================
@@ -178,16 +181,16 @@ y = zeros (size (l)); # inaccurate, but already correct
## Tightest values for l >= -10
n = floor (l);
-y (n == -1) = -3.544643611155005;
-y (n == -2) = 2.3024072583396799;
-y (n == -3) = -.8881363584012418;
-y (n == -4) = .24512753983436624;
-y (n == -5) = -.052779639587319397;
-y (n == -6) = .009324594482614849;
-y (n == -7) = -.001397396608949767;
-y (n == -8) = 1.8187844490940416e-4;
-y (n == -9) = -2.0925290446526666e-5;
-y (n == -10) = 2.1574161045228504e-6;
+y(n == -1) = -3.544643611155005;
+y(n == -2) = 2.3024072583396799;
+y(n == -3) = -.8881363584012418;
+y(n == -4) = .24512753983436624;
+y(n == -5) = -.052779639587319397;
+y(n == -6) = .009324594482614849;
+y(n == -7) = -.001397396608949767;
+y(n == -8) = 1.8187844490940416e-4;
+y(n == -9) = -2.0925290446526666e-5;
+y(n == -10) = 2.1574161045228504e-6;
## From Euler's reflection formula it follows:
## gamma (-x) = pi / ( sin (pi * (x + 1)) * gamma (x + 1) )
@@ -201,14 +204,14 @@ y (n == -10) = 2.1574161045228504e-6;
## for n <= -10
remaining_estimates = n < -10;
-if (any (any (remaining_estimates)))
- y (remaining_estimates) = ...
- (-1) .^ (rem (n (remaining_estimates), 2) == -1) * ...
+if (any (remaining_estimates(:)))
+ y(remaining_estimates) = ...
+ (-1) .^ (rem (n(remaining_estimates), 2) == -1) * ...
mpfr_function_d ('rdivide', -inf, 3.88, ...
- mpfr_function_d ('gamma', +inf, -n (remaining_estimates) + 1));
+ mpfr_function_d ('gamma', +inf, -n(remaining_estimates) + 1));
endif
endfunction
-%!test "from the documentation string";
-%! assert (gamma (infsup (1.5)) == "[0x1.C5BF891B4EF6Ap-1, 0x1.C5BF891B4EF6Bp-1]");
+%!# from the documentation string
+%!assert (gamma (infsup (1.5)) == "[0x1.C5BF891B4EF6Ap-1, 0x1.C5BF891B4EF6Bp-1]");
diff --git a/inst/@infsup/gammaln.m b/inst/@infsup/gammaln.m
index 8c013e9..97071a8 100644
--- a/inst/@infsup/gammaln.m
+++ b/inst/@infsup/gammaln.m
@@ -51,7 +51,7 @@
## Keywords: interval
## Created: 2015-02-28
-function result = gammaln (x)
+function x = gammaln (x)
if (nargin ~= 1)
print_usage ();
@@ -76,25 +76,39 @@ u = -l;
## Monotonically decreasing for x1
x1 = intersect (x, infsup (0, x_min_sup));
select = not (isempty (x1)) & x1.sup > 0;
-if (any (any (select)))
- x1.inf (x1.inf == 0) = 0; # fix negative zero
- l (select) = mpfr_function_d ('gammaln', -inf, x1.sup (select));
- u (select) = mpfr_function_d ('gammaln', +inf, x1.inf (select));
+if (any (select(:)))
+ x1.inf(x1.inf == 0) = 0; # fix negative zero
+ l(select) = mpfr_function_d ('gammaln', -inf, x1.sup(select));
+ u(select) = mpfr_function_d ('gammaln', +inf, x1.inf(select));
endif
## Monotonically increasing for x2
x2 = intersect (x, infsup (x_min_inf, inf));
select = not (isempty (x2));
-if (any (any (select)))
- l (select) = mpfr_function_d ('gammaln', -inf, x2.inf (select));
- u (select) = max (u (select), ...
- mpfr_function_d ('gammaln', +inf, x2.sup (select)));
+if (any (select(:)))
+ l(select) = mpfr_function_d ('gammaln', -inf, x2.inf(select));
+ u(select) = max (u (select), ...
+ mpfr_function_d ('gammaln', +inf, x2.sup(select)));
endif
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
%!assert (gammaln (infsup (-inf, inf)) == "[-0x1.F19B9BCC38A42p-4, +Inf]");
-%!test "from the documentation string";
-%! assert (gammaln (infsup (1.5)) == "[-0x1.EEB95B094C192p-4, -0x1.EEB95B094C191p-4]");
+
+%!# from the documentation string
+%!assert (gammaln (infsup (1.5)) == "[-0x1.EEB95B094C192p-4, -0x1.EEB95B094C191p-4]");
+
+%!# correct use of signed zeros
+%!test
+%! x = gammaln (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = gammaln (infsup (2));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/gauss.m b/inst/@infsup/gauss.m
index 7e8cfb6..8b504fd 100644
--- a/inst/@infsup/gauss.m
+++ b/inst/@infsup/gauss.m
@@ -86,23 +86,22 @@ m = columns (y.inf);
## Solve L * s = inv (P) * y
s = permute (inv (P), y);
-curelement.type = prevvars.type = Lrowidx.type = "()";
+curelement.type = prevvars.type = "()";
for i = 1 : m
## Special case: k == 1
## s (k, i) already is correct
for k = 2 : n
curelement.subs = {k, i};
prevvars.subs = {1 : k, i};
- Lrowidx.subs = {k, 1 : k};
varcol = subsref (s, prevvars);
- Lrow = subsref (L, Lrowidx);
+ Lrow = subsref (L, substruct ("()", {k, 1 : k}));
## We have to subtract varcol (1 : (k - 1)) * Lrow (1 : (k - 1)) from
## s (k, i). Since varcol (k) == s (k, i), we can simply set
## Lrow (k) = -1 and the dot product will compute the difference for us
## with high accurracy.
- Lrow.inf (k) = Lrow.sup (k) = -1;
+ Lrow.inf(k) = Lrow.sup(k) = -1;
## Then, we only have to flip the sign afterwards.
s = subsasgn (s, curelement, -dot (Lrow, varcol));
@@ -130,7 +129,7 @@ for i = 1 : m
Urow = subsref (U, Urowrest);
## Use the same trick like above during forward substitution.
- Urow.inf (1) = Urow.sup (1) = -1;
+ Urow.inf(1) = Urow.sup(1) = -1;
## Additionally we must divide the element by the current diagonal
## element of U.
@@ -158,40 +157,36 @@ endfor
## diagonal elements of the matrix we use an arbitrary element that does not
## contain zero as an inner element.
-xrowidx.type = yidx.type = zcolidx.type = "()";
migx = mig (x);
migx (isnan (migx)) = 0;
for k = 1 : m
- zcolidx.subs = {1 : n, k};
- zcol = subsref (z, zcolidx);
+ zcol = subsref (z, substruct ("()", {1 : n, k}));
for j = n : -1 : 1
- z_jk = infsup (zcol.inf (j), zcol.sup (j));
+ z_jk = subsref (zcol, substruct ("()", {j}));
if (isempty (z_jk) || issingleton (z_jk))
## No improvement can be achieved.
continue
endif
- i = find (migx (:, j) == max (migx (:, j)), 1);
- xrowidx.subs = {i, 1 : n};
- xrow = subsref (x, xrowidx);
- if (xrow.inf (j) < 0 && xrow.sup (j) > 0)
+ i = find (migx(:, j) == max (migx(:, j)), 1);
+ xrow = subsref (x, substruct ("()", {i, 1 : n}));
+ if (xrow.inf(j) < 0 && xrow.sup(j) > 0)
## No improvement can be achieved.
continue
endif
- x_ij = infsup (xrow.inf (j), xrow.sup (j));
- yidx.subs = {i, k};
- yelement = subsref (y, yidx);
+ x_ij = subsref (xrow, substruct ("()", {j}));
+ yelement = subsref (y, substruct ("()", {i, k}));
- ## x (i, 1 : n) * z (1 : n, k) shall equal y (i, k).
- ## 1. Solve this equation for x (i, j) * z (j, k).
- ## 2. Compute a (possibly better) enclosure for z (j, k).
+ ## x(i, 1 : n) * z(1 : n, k) shall equal y(i, k).
+ ## 1. Solve this equation for x(i, j) * z(j, k).
+ ## 2. Compute a (possibly better) enclosure for z(j, k).
- xrow.inf (j) = yelement.inf;
- xrow.sup (j) = yelement.sup;
- zcol.inf (j) = zcol.sup (j) = -1;
+ xrow.inf(j) = yelement.inf;
+ xrow.sup(j) = yelement.sup;
+ zcol.inf(j) = zcol.sup(j) = -1;
z_jk = mulrev (x_ij, -dot (xrow, zcol), z_jk);
- zcol.inf (j) = z.inf (j, k) = z_jk.inf;
- zcol.sup (j) = z.sup (j, k) = z_jk.sup;
+ zcol.inf(j) = z.inf(j, k) = z_jk.inf;
+ zcol.sup(j) = z.sup(j, k) = z_jk.sup;
endfor
endfor
@@ -209,11 +204,11 @@ function B = permute (P, A)
B = A;
for i = 1 : rows (P)
- targetrow = find (P (i, :) == 1, 1);
- B.inf (targetrow, :) = A.inf (i, :);
- B.sup (targetrow, :) = A.sup (i, :);
+ targetrow = find (P(i, :) == 1, 1);
+ B.inf(targetrow, :) = A.inf(i, :);
+ B.sup(targetrow, :) = A.sup(i, :);
endfor
endfunction
-%!test "from the documentation string";
-%! assert (gauss (infsup ([1, 0; 0, 2]), [2, 0; 0, 4]) == [2, 0; 0, 2]);
+%!# from the documentation string
+%!assert (gauss (infsup ([1, 0; 0, 2]), [2, 0; 0, 4]) == [2, 0; 0, 2]);
diff --git a/inst/@infsup/hdist.m b/inst/@infsup/hdist.m
index e92a6a3..75c5804 100644
--- a/inst/@infsup/hdist.m
+++ b/inst/@infsup/hdist.m
@@ -54,7 +54,7 @@ if (not (isa (y, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -63,29 +63,29 @@ endif
result = zeros (size (x.inf));
select = x.inf < y.inf;
-if (any (any (select)))
- result (select) = ...
- mpfr_function_d ('minus', +inf, y.inf (select), x.inf (select));
+if (any (select(:)))
+ result(select) = ...
+ mpfr_function_d ('minus', +inf, y.inf(select), x.inf(select));
endif
select = x.inf > y.inf;
-if (any (any (select)))
- result (select) = max (result (select), ...
- mpfr_function_d ('minus', +inf, x.inf (select), y.inf (select)));
+if (any (select(:)))
+ result(select) = max (result(select), ...
+ mpfr_function_d ('minus', +inf, x.inf(select), y.inf(select)));
endif
select = x.sup < y.sup;
-if (any (any (select)))
- result (select) = max (result (select), ...
- mpfr_function_d ('minus', +inf, y.sup (select), x.sup (select)));
+if (any (select(:)))
+ result(select) = max (result(select), ...
+ mpfr_function_d ('minus', +inf, y.sup(select), x.sup(select)));
endif
select = x.sup > y.sup;
-if (any (any (select)))
- result (select) = max (result (select), ...
- mpfr_function_d ('minus', +inf, x.sup (select), y.sup (select)));
+if (any (select(:)))
+ result(select) = max (result(select), ...
+ mpfr_function_d ('minus', +inf, x.sup(select), y.sup(select)));
endif
-result (isempty (x) | isempty (y)) = nan ();
+result(isempty (x) | isempty (y)) = nan ();
endfunction
-%!test "from the documentation string";
-%! assert (hdist (infsup (1, 6), infsup (2, 8)), 2);
+%!# from the documentation string
+%!assert (hdist (infsup (1, 6), infsup (2, 8)), 2);
diff --git a/inst/@infsup/horzcat.m b/inst/@infsup/horzcat.m
index 209c11b..50ab87c 100644
--- a/inst/@infsup/horzcat.m
+++ b/inst/@infsup/horzcat.m
@@ -38,20 +38,12 @@
function result = horzcat (varargin)
-## Conversion to interval
-intervals = cellfun ("isclass", varargin, "infsup");
-to_convert = not (intervals);
-varargin (to_convert) = cellfun (@infsup, varargin (to_convert), ...
- "UniformOutput", false ());
-
-l = cell2mat (cellfun (@(x) x.inf, varargin, "UniformOutput", false ()));
-u = cell2mat (cellfun (@(x) x.sup, varargin, "UniformOutput", false ()));
-
-result = infsup (l, u);
+result = cat (2, varargin{:});
endfunction
%!assert (horzcat (infsup (1), infsup (2)) == infsup (horzcat (1, 2)));
-%!test "from the documentation string";
+%!test
+%! # from the documentation string
%! a = infsup (2, 5);
%! assert (horzcat (a, a, a) == infsup ([2, 2, 2], [5, 5, 5]));
diff --git a/inst/@infsup/hypot.m b/inst/@infsup/hypot.m
index cd9cbb2..dcf0293 100644
--- a/inst/@infsup/hypot.m
+++ b/inst/@infsup/hypot.m
@@ -37,7 +37,7 @@
## Keywords: interval
## Created: 2015-02-20
-function result = hypot (x, y)
+function x = hypot (x, y)
if (nargin ~= 2)
print_usage ();
@@ -54,12 +54,21 @@ l = mpfr_function_d ('hypot', -inf, mig (x), mig (y));
u = mpfr_function_d ('hypot', +inf, mag (x), mag (y));
emptyresult = isempty (x) | isempty (y);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (hypot (infsup (2, 3), infsup (1, 2)) == "[0x1.1E3779B97F4A7p1, 0x1.CD82B446159F4p1]");
+%!# from the documentation string
+%!assert (hypot (infsup (2, 3), infsup (1, 2)) == "[0x1.1E3779B97F4A7p1, 0x1.CD82B446159F4p1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = hypot (infsup (0), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/idist.m b/inst/@infsup/idist.m
index eca557c..4b920b9 100644
--- a/inst/@infsup/idist.m
+++ b/inst/@infsup/idist.m
@@ -56,7 +56,7 @@ if (not (isa (y, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -65,19 +65,19 @@ endif
result = zeros (size (x.inf));
select = x.sup < y.inf;
-if (any (any (select)))
- result (select) = ...
- mpfr_function_d ('minus', +inf, y.inf (select), x.sup (select));
+if (any (select(:)))
+ result(select) = ...
+ mpfr_function_d ('minus', +inf, y.inf(select), x.sup(select));
endif
select = x.inf > y.sup;
-if (any (any (select)))
- result (select) = max (result (select), ...
- mpfr_function_d ('minus', +inf, x.inf (select), y.sup (select)));
+if (any (select(:)))
+ result(select) = max (result(select), ...
+ mpfr_function_d ('minus', +inf, x.inf(select), y.sup(select)));
endif
-result (isempty (x) | isempty (y)) = nan ();
+result(isempty (x) | isempty (y)) = nan ();
endfunction
-%!test "from the documentation string";
-%! assert (idist (infsup (0, 6), infsup (7, 20)), 1);
+%!# from the documentation string
+%!assert (idist (infsup (0, 6), infsup (7, 20)), 1);
diff --git a/inst/@infsup/inf.m b/inst/@infsup/inf.m
index e8ae8de..2aea951 100644
--- a/inst/@infsup/inf.m
+++ b/inst/@infsup/inf.m
@@ -16,6 +16,7 @@
## -*- texinfo -*-
## @documentencoding UTF-8
## @defmethod {@@infsup} inf (@var{X})
+## @comment DO NOT SYNCHRONIZE DOCUMENTATION STRING
##
## Get the (greatest) lower boundary for all numbers of interval @var{X}.
##
@@ -43,16 +44,9 @@ if (nargin ~= 1)
return
endif
-if (isa (x, "infsupdec"))
- ## We cannot override this function in infsupdec, because that would create
- ## an infinite loop.
- if (isnai (x))
- error ("interval:NaI", "NaI has no infimum")
- endif
-endif
-
result = x.inf;
+
endfunction
-%!test "from the documentation string";
-%! assert (inf (infsup (2.5, 3.5)), 2.5);
+%!# from the documentation string
+%!assert (inf (infsup (2.5, 3.5)), 2.5);
diff --git a/inst/@infsup/infsup.m b/inst/@infsup/infsup.m
index a1dc92b..a7f1038 100644
--- a/inst/@infsup/infsup.m
+++ b/inst/@infsup/infsup.m
@@ -55,7 +55,7 @@
##
## Non-standard behavior: This class constructor is not described by IEEE Std
## 1788-2015, IEEE standard for interval arithmetic, however it implements both
-## standard functions numsToInterval and textToInterval.
+## standard functions numsToInterval and textToInterval for bare intervals.
##
## @example
## @group
@@ -92,542 +92,1204 @@
## Keywords: interval
## Created: 2014-09-27
-function [x, isexact, overflow] = infsup (l, u)
+function [x, isexact, overflow, isnai] = infsup (l, u)
-if (nargin == 0)
- ## representation of the empty interval is always [inf,-inf]
- l = inf;
- u = -inf;
-endif
+persistent scalar_empty_interval = class (struct ("inf", inf, ...
+ "sup", -inf), ...
+ "infsup");
-if (nargin == 1)
- if (isa (l, "infsup"))
- ## Nothing to be done
- x = l;
- isexact = true ();
+## Part 1
+##
+## Split any arguments into l and u, where l and u denote lower and upper
+## boundaries. l and u shall be either numeric arrays or cell arrays with
+## strings or numeric entries. The size of l and u will equal the interval
+## matrix size of the final result (unless broadcasting is going to be applied
+## as a very last step).
+##
+## Strings in l and u will be normalized, that is, trimmed and converted to
+## lower case.
+
+switch nargin
+ case 0
+ ## empty interval
+ x = scalar_empty_interval;
+ isexact = true;
+ isnai = overflow = false;
return
- endif
- if (ischar (l))
- l = __split_interval_literals__ (l);
- endif
- if (iscell (l))
- ## Parse interval literals
- c = lower (l);
- u = cell (size (c));
+
+ case 1
+ if (isa (l, "infsup"))
+ ## already an interval—nothing to be done
+ x = l;
+ isexact = true ();
+ isnai = overflow = false (size (l.inf));
+ return
+ endif
+ if (ischar (l))
+ ## Character string may contain a vector or a matrix of intervals,
+ ## split the interval literals into a cell array of strings.
+ ## Interval literals will be trimmed by the split function.
+ l = __split_interval_literals__ (lower (l));
+ char_idx = true (size (l));
+ elseif (iscell (l))
+ ## Make sure that in a cell array (with possibly mixed types) all
+ ## strings are trimmed. This is required during splitting of
+ ## interval literals into lower and upper bounds.
+ char_idx = cellfun ("ischar", l);
+ l(char_idx) = lower (strtrim (l(char_idx)));
+ else
+ ## Not cell or char, e. g. numeric matrix.
+ ## Syntax infsup (x) has to be equivalent with infsup (x, x).
+ ## No need to trim or normalize character case.
+ u = l;
+ endif
+
+ ## Correct construction of empty intervals is only possible by calling
+ ## this constructor without arguments (see above), or by using one of
+ ## the two interval literals [] or [empty].
+ ## Otherwise, construction of empty intervals must signal
+ ## “UndefinedOperation”.
+ ## In particular, the interval literal [+inf, -inf] is illegal and
+ ## “numsToInterval (+inf, -inf)” would be an illegal function call,
+ ## according to IEEE Std 1788-2015.
+ ##
+ ## 1. isnai defaults to -1 (unknown).
+ ## 2. any non-empty interval (l <= u) is legal and we set isnai to
+ ## false for those in the end.
+ ## 3. for legal empty interval literals we set isnai = false
+ ## explicitly.
+ ## 4. for certain illegal interval literals we give a special warning
+ ## and set isnai = true explicitly.
+ ## 5. it remains isnai = -1 for any illegal intervals which have not
+ ## been handled with, we give a warning and we return an empty
+ ## interval in these cases.
+ isnai = -ones (size (l), "int8");
+ illegal_boundary = struct ("inf", false (size (l)), ...
+ "sup", false (size (l)));
- for i = 1 : numel (l)
- if (ischar (l {i}) && not (isempty (c {i})) && ...
- c {i} ([1, end]) == "[]")
- ## Strip square brackets and whitespace
- nobrackets = strtrim (c {i} (2 : (end-1)));
- switch nobrackets
- case "entire"
- l {i} = -inf;
- u {i} = inf;
- case {"empty", ""}
- l {i} = inf;
- u {i} = -inf;
- case "nai"
- error ("interval:NaI", ...
- "Interval literal [NaI] occured")
- otherwise
- boundaries = strtrim (strsplit (nobrackets, ","));
- switch (numel (boundaries))
- case 1
- l {i} = u {i} = boundaries {1};
- case 2
- l {i} = boundaries {1};
- u {i} = boundaries {2};
- otherwise
- error ("interval:InvalidOperand", ...
- "interval literal is not in inf-sup form")
- endswitch
+ if (iscell (l))
+ ## At this point, only a cell array can contain interval literals
+ ## as string. Split intervals and interval literals into lower and
+ ## upper bounds. Except for empty intervals, strings are not
+ ## converted into numeric values yet.
+ ##
+ ## [] -> (+inf, -inf)
+ ## [empty] -> (+inf, -inf)
+ ## [entire] -> (, )
+ ## [,] -> (, )
+ ## [l, u] -> (l, u)
+ ## [m] -> (m, m)
+ ## m -> (m, m)
+ ## m?r -> (m?r, m?r)
+ ## m?ru -> (m, m?r)
+ ## m?rd -> (m?r, m)
+ ## m?? -> (, )
+ ## m??u -> (m, )
+ ## m??d -> (, m)
+
+ ## Initialize u such that the syntax infsup (x) is equivalent with
+ ## infsup (x, x) unless interval literals are used.
+ u = l;
+
+ ## Find interval literals with square brackets. The strings are
+ ## trimmed already, so they will start at the first character.
+ square_bracket_idx = strncmp (l, "[", 1);
+%!# Verify correct behaviour of strncmp for empty strings and non-string
+%!# values within the cell array.
+%!assert (strncmp ({"[", double("["), ""}, "[", 1), logical ([1 0 0]));
+
+ ## A bare interval literal which starts with a square bracket
+ ## must end with a square bracket as well.
+ square_bracket_idx = ...
+ find (square_bracket_idx)(...
+ cellfun (@(s) s(end) == "]", ...
+ l(square_bracket_idx)));
+
+ ## Strip square brackets and white space within square brackets.
+ nobrackets = strtrim (cellfun (@(s) s([2 : (end - 1)]), ...
+ l(square_bracket_idx), ...
+ "UniformOutput", false));
+
+ ## Construction of empty intervals with the correct literal either
+ ## [empty] or [] is legit.
+ empty_interval_local_idx = strcmp (nobrackets, "empty") ...
+ | cellfun ("isempty", nobrackets);
+ empty_interval_idx = square_bracket_idx(empty_interval_local_idx);
+ isnai(empty_interval_idx) = false;
+
+ ## We remove the empty interval cases from the current work basket
+ ## and don't need special handling of comma-less strings below
+ ## ([] represents the empty interval, whereas [,] represents the
+ ## set of all real numbers).
+ square_bracket_idx = ...
+ square_bracket_idx(not (empty_interval_local_idx));
+ nobrackets = nobrackets(not (empty_interval_local_idx));
+ char_idx(empty_interval_idx) = false;
+ l(empty_interval_idx) = +inf;
+ u(empty_interval_idx) = -inf;
+
+ ## [entire] is equivalent to [,]
+ nobrackets(strcmp (nobrackets, "entire")) = {""};
+
+ ## Split [l, u] literals into l and u strings at the comma.
+ nobrackets = cellfun ("strsplit", nobrackets, {","}, ...
+ "UniformOutput", false);
+ nobrackets_parts = cellfun ("numel", nobrackets);
+
+ ## For point intervals [m] we have removed the square brackets,
+ ## trimmed any white space inside the square brackets and must
+ ## store m into both l and u for further parsing below.
+ ## Each boundary will be parsed individually with opposite rounding
+ ## direction.
+ point_interval_local_idx = (nobrackets_parts == 1);
+ point_interval_idx = square_bracket_idx(point_interval_local_idx);
+ l(point_interval_idx) = u(point_interval_idx) = ...
+ vertcat ({}, nobrackets(point_interval_local_idx){:});
+
+ ## For infsup intervals [l, u] we can store the trimmed l and u
+ ## strings for further parsing below.
+ infsup_interval_local_idx = (nobrackets_parts == 2);
+ infsup_interval_idx = square_bracket_idx(infsup_interval_local_idx);
+ l(infsup_interval_idx) = strtrim (vertcat ({}, ...
+ cellindexmat (nobrackets(infsup_interval_local_idx), 1){:}));
+ u(infsup_interval_idx) = strtrim (vertcat ({}, ...
+ cellindexmat (nobrackets(infsup_interval_local_idx), 2){:}));
+
+ ## Find interval literals in uncertain form.
+ uncertain_idx = char_idx;
+ uncertain_idx(square_bracket_idx) = false; # already processed
+
+ ## Find uncertain form with directed uncertainty (down or up)
+ [~, ~, ~, ~, groups] = regexp (l(uncertain_idx), ...
+ ["([^?]+)", ... # 1: mantissa
+ "([?])", ... # 2: ?
+ "(.*)", ... # 3: uncertainty
+ "([du])", ... # 4: direction
+ "(.*)"]); # 5: exponent
+ directed_local_idx = not (cellfun ("isempty", groups));
+ directed_uncertain_idx = uncertain_idx;
+ directed_uncertain_idx(uncertain_idx) = directed_local_idx;
+ groups = vertcat ({}, groups(directed_local_idx){:});
+
+ ## Remove directed down/up uncertainty.
+ for direction = ["d", "u"]
+ direction_local_idx = strcmp (...
+ vertcat ({}, cellindexmat (groups, 4){:}), ...
+ direction);
+ direction_idx = directed_uncertain_idx;
+ direction_idx(directed_uncertain_idx) = direction_local_idx;
+
+ ## Remove direction character
+ persistent join_groups = @(parts) strcat (parts{:});
+ undirected_uncertain_form = ...
+ cellfun (...
+ join_groups, ...
+ cellindexmat (groups(direction_local_idx), ...
+ [1 2 3 5]), ...
+ "UniformOutput", false);
+ ## Also remove uncertainty
+ undirected_certain_form = ...
+ cellfun (...
+ join_groups, ...
+ cellindexmat (groups(direction_local_idx), ...
+ [1 5]), ...
+ "UniformOutput", false);
+
+ ## Store uncertain boundaries without directed uncertainty
+ switch direction
+ case "d"
+ l(direction_idx) = undirected_uncertain_form;
+ u(direction_idx) = undirected_certain_form;
+ case "u"
+ l(direction_idx) = undirected_certain_form;
+ u(direction_idx) = undirected_uncertain_form;
endswitch
- elseif (ischar (l {i}) && strfind (c {i}, "?"))
- ## Uncertain form: At this point we only split lower and upper
- ## boundary and remove the ??. ULP arithmetic is performed
- ## below when parsing the decimal number.
- if (strfind (c {i}, "u")) # up
- ## The uncertainty only affects the upper boundary
- l {i} = strcat (...
- c {i} (1 : (find (c {i} == "?", 1) - 1)), ...
- c {i} ((find (c {i} == "u", 1) + 1) : end));
- u {i} = strrep (c {i} (1 : end), "u", "");
- elseif (strfind (c {i}, "d")) # down
- ## The uncertainty only affects the lower boundary
- l {i} = strrep (c {i} (1 : end), "d", "");
- u {i} = strcat (...
- c {i} (1 : (find (c {i} == "?", 1) - 1)), ...
- c {i} ((find (c {i} == "d", 1) + 1) : end));
- else
- ## The uncertainty affects both boundaries
- l {i} = u {i} = c {i};
- endif
- if (strfind (l {i}, "??"))
- l {i} = -inf;
- endif
- if (strfind (u {i}, "??"))
- u {i} = inf;
+
+ ## Remove parsed uncertain form from work basket to prevent
+ ## double parsing (strings with both d and u uncertainty).
+ directed_uncertain_idx(direction_idx) = false;
+ groups = groups(not (direction_local_idx));
+ endfor
+
+ ## Remove unbound uncertainty ??
+ ## FIXME We should verify correctness of the interval literal more
+ ## thoroughly. Otherwise we would ignore illegal literals which
+ ## contain the double question mark.
+ l_unbound_idx = uncertain_idx;
+ l_unbound_idx(uncertain_idx) = ...
+ not (cellfun ("isempty", strfind (l(uncertain_idx), "??")));
+ l(l_unbound_idx) = {""};
+ u_unbound_idx = uncertain_idx;
+ u_unbound_idx(uncertain_idx) = ...
+ not (cellfun ("isempty", strfind (u(uncertain_idx), "??")));
+ u(u_unbound_idx) = {""};
+ endif
+
+ case 2
+ ## Split interval vectors if supplied as strings.
+ if (ischar (l))
+ l = __split_interval_literals__ (l);
+ endif
+ if (ischar (u))
+ u = __split_interval_literals__ (u);
+ endif
+
+ ## Check dimensions and whether broadcasting is possible
+ for dim = 1 : max (ndims (l), ndims (u))
+ if (size (l, dim) != 1 && size (u, dim) != 1 && ...
+ size (l, dim) != size (u, dim))
+ warning ("interval:InvalidOperand", ...
+ ["infsup: Dimensions of lower and upper ", ...
+ "boundaries are not compatible"]);
+ ## Unable to recover from this kind of error
+ x = scalar_empty_interval;
+ isexact = false;
+ overflow = false;
+ isnai = true;
+ return
+ endif
+ endfor
+
+ ## Compute result size after broadcasting and mark any empty intervals
+ ## as illegal (will trigger “UndefinedOperation” signal later on).
+ ## Construction of silent empty intervals is impossible with two args.
+ isnai = zeros (size (l), "int8") - ones (size (u), "int8"); #-1=unknown
+ illegal_boundary = struct ("inf", false (size (l)), ...
+ "sup", false (size (u)));
+
+ for argument = ["l", "u"]
+ switch argument
+ case "l"
+ current_arg = l;
+ case "u"
+ current_arg = u;
+ endswitch
+ if (iscell (current_arg))
+ ## Normalize strings: trim and convert to lower case
+ ## (as is done in the nargin == 1 case).
+ char_idx = cellfun ("ischar", current_arg);
+ current_arg(char_idx) = ...
+ lower (strtrim (current_arg(char_idx)));
+
+ ## In contrast to the nargin == 1 case we cannot allow interval
+ ## literals here. Only simple boundaries are allowed if two
+ ## arguments are given.
+ square_bracket_idx = strncmp (current_arg, "[", 1);
+ uncertain_idx = char_idx;
+ uncertain_idx(square_bracket_idx) = false;
+ uncertain_idx(uncertain_idx) = ...
+ not (cellfun ("isempty", ...
+ strfind (current_arg(uncertain_idx), "?")));
+ illegal_literal_idx = (square_bracket_idx | uncertain_idx);
+ if (any (illegal_literal_idx(:)))
+ switch argument
+ case "l"
+ warning ("interval:UndefinedOperation", ...
+ "Lower boundary contains an interval literal");
+ current_arg(illegal_literal_idx) = +inf;
+ illegal_boundary.inf(illegal_literal_idx) = true;
+ case "u"
+ warning ("interval:UndefinedOperation", ...
+ "Upper boundary contains an interval literal");
+ current_arg(illegal_literal_idx) = -inf;
+ illegal_boundary.sup(illegal_literal_idx) = true;
+ endswitch
endif
- else
- ## syntax infsup (x) has to be equivalent with infsup (x, x)
- u {i} = l {i};
+ switch argument
+ case "l"
+ l = current_arg;
+ case "u"
+ u = current_arg;
+ endswitch
endif
endfor
- else # not cell or char
- ## syntax infsup (x) has to be equivalent with infsup (x, x)
- u = l;
- endif
-endif
-
-if (ischar (l))
- l = __split_interval_literals__ (lower (l));
-endif
-if (ischar (u))
- u = __split_interval_literals__ (lower (u));
-endif
+
+ otherwise # nargin >= 3
+ print_usage ();
+ return
+endswitch
-if (not (size_equal (l, u)))
- if (isscalar (l))
- ## Broadcast l
- l = l (ones (size (u)));
- elseif (isscalar (u))
- ## Broadcast u
- u = u (ones (size (l)));
- else
- error ("interval:InvalidOperand", ...
- "infsup: size of upper and lower bounds must match")
- endif
-endif
+## Part 2
+##
+## Boundaries have been split into lower and upper boundaries and shall be
+## converted to binary64 matrices with string parsing and outward rounding.
+##
+## l contains a cell array or a matrix of lower boundaries.
+## u contains a cell array or a matrix of upper boundaries.
+##
+## Each of l and u will be converted into binary64 individually and will be
+## stored in x.inf and x.sup respectively.
-## check parameters and conversion to double precision
isexact = true ();
-possiblyundefined = false (size (l));
-overflow = true (size (l));
-x.inf = zeros (size (l));
-x.sup = zeros (size (u));
-input.inf = l;
-input.sup = u;
-for [boundaries, key] = input
- if (isfloat (boundaries))
- ## Simple case: the boundaries already are a binary floating point
- ## number in single or double precision.
+x = struct ("inf", inf (size (l)), ...
+ "sup", -inf (size (u)));
+for [boundaries, key] = struct ("inf", {l}, "sup", {u})
+ if (isfloat (boundaries) && isreal (boundaries))
+ ## Simple case: the boundaries already are binary floating point
+ ## numbers in single or double precision.
+ ## This kind of operation is often used in internal functions and shall
+ ## be fast. We check for NaNs later.
x.(key) = double (boundaries);
- possiblyundefined (:) = false ();
+ possiblyundefined.(key) = overflow.(key) = false (size (boundaries));
continue
endif
- for i = 1 : numel (boundaries)
- if (iscell (boundaries))
- boundary = boundaries {i};
- if (ischar (boundary))
- boundary = lower (boundary);
- endif
- else
- boundary = boundaries (i);
+
+ if (not (iscell (boundaries)))
+ if (not (isnumeric (boundaries)))
+ warning ("interval:InvalidOperand", ...
+ ["infsup: Invalid argument type, only strings, ", ...
+ "numerics, and cell arrays thereof are allowed"]);
+ ## Unable to recover from this kind of error
+ x = scalar_empty_interval;
+ isexact = false;
+ overflow = false;
+ isnai = true;
+ return
endif
+ boundaries = num2cell (boundaries);
+ endif
+
+ overflow.(key) = true (size (boundaries));
+ possiblyundefined.(key) = false (size (boundaries));
+
+ ## Track the entries in cell array boundaries, which haven't been
+ ## converted yet.
+ todo = true (size (boundaries));
+
+ ## [,] = [-inf, +inf]
+ unbound_idx = cellfun ("isempty", boundaries);
+ switch key
+ case "inf"
+ x.inf(unbound_idx) = -inf;
+ case "sup"
+ x.sup(unbound_idx) = +inf;
+ endswitch
+ overflow.(key)(unbound_idx) = false;
+ todo(unbound_idx) = false;
+
+ ## In the cell array each entry must represent a scalar value.
+ non_scalar_entry_idx = todo & not (...
+ cellfun ("isscalar", boundaries) | cellfun ("ischar", boundaries));
+ if (any (non_scalar_entry_idx(:)))
+ warning ("interval:UndefinedOperation", ...
+ "Cell arrays of matrix entries do not contain scalar values");
+ # Use default value of [empty] for these entries and continue
+ todo(non_scalar_entry_idx) = false;
+ illegal_boundary.(key)(non_scalar_entry_idx) = true;
+ endif
+
+ ## 64 bit integers: approximate in double precision.
+ integer_idx = find (todo & ( ...
+ cellfun ("isa", boundaries, {"uint64"}) ...
+ | cellfun ("isa", boundaries, {"int64"})));
+ integers = vertcat (boundaries{integer_idx});
+ converted_integers = double (integers);
+ exact_integer_local_idx = (converted_integers == integers);
+ if (any (not (exact_integer_local_idx(:))))
+ isexact = false;
+ possiblyundefined.(key)(integer_idx(not (exact_integer_local_idx))) ...
+ = true;
+ endif
+ ## Fix conversion in cases where rounding to nearest has resulted in the
+ ## wrong value, i. e., in a value that has not been rounded outward,
+ ## but inward.
+ switch key
+ case "inf"
+ wrong_round_local_idx = (converted_integers > integers);
+ converted_integers(wrong_round_local_idx) = ...
+ mpfr_function_d ('minus', -inf, ...
+ converted_integers(wrong_round_local_idx), pow2 (-1074));
+ case "sup"
+ wrong_round_local_idx = (converted_integers < integers);
+ converted_integers(wrong_round_local_idx) = ...
+ mpfr_function_d ('plus', +inf, ...
+ converted_integers(wrong_round_local_idx), pow2 (-1074));
+ endswitch
+ x.(key)(integer_idx) = converted_integers;
+ overflow.(key)(integer_idx) = false;
+ todo(integer_idx) = false;
+
+ ## Lossless conversion from binary32, binary64, (u)int8, (u)int16, (u)int32
+ ## and logicals.
+ real_idx = todo & ...
+ ( ...
+ ( ...
+ cellfun ("isreal", boundaries) ...
+ & cellfun ("isfloat", boundaries) ...
+ ) ...
+ | cellfun ("isinteger", boundaries) ...
+ | cellfun ("islogical", boundaries)
+ );
+ x.(key)(real_idx) = double (vertcat (boundaries{real_idx}));
+ overflow.(key)(real_idx) = false;
+ todo(real_idx) = false;
+
+ ## Complex numbers: not allowed, will be mapped to [empty].
+ complex_idx = todo & cellfun ("iscomplex", boundaries);
+ if (any (complex_idx(:)))
+ warning ("interval:InvalidOperand", ...
+ "infsup: Complex arguments are not permitted");
+ todo(complex_idx) = false;
+ illegal_boundary.(key)(complex_idx) = true;
+ endif
+
+ ## Other kinds of parameters that are not strings
+ char_idx = todo & cellfun ("ischar", boundaries);
+ if (any ((todo & not (char_idx))(:)))
+ warning ("interval:InvalidOperand", ...
+ "infsup: Illegal boundary: must be numeric or string");
+ illegal_boundary.(key)(todo & not (char_idx)) = true;
+ endif
+ todo = char_idx;
+
+ ## Hex strings
+ hex_idx = find (todo & (strncmp (boundaries, "0x", 2) ...
+ | strncmp (boundaries, "+0x", 3) ...
+ | strncmp (boundaries, "-0x", 3)));
+ switch key
+ case "inf"
+ direction = -inf;
+ case "sup"
+ direction = inf;
+ endswitch
+ for i = vec (hex_idx, 2)
+ try
+ [x.(key)(i), exact_conversion] = ...
+ hex2double (boundaries{i}, direction);
+ possiblyundefined.(key)(i) = not (exact_conversion);
+ isexact = isexact && exact_conversion;
+ catch
+ warning ("interval:UndefinedOperation", lasterr ());
+ illegal_boundary.(key)(i) = true;
+ end_try_catch
+ endfor
+ overflow.(key)(hex_idx) = false;
+ todo(hex_idx) = false;
+
+ ## Selected boundary literals
+ persistent boundary_const = struct (...
+ "inf", struct (...
+ "-inf", -inf, ...
+ "-infinity", -inf, ...
+ "inf", inf, ...
+ "+inf", inf, ...
+ "infinity", inf, ...
+ "+infinity", inf, ...
+ "e", 0x56FC2A2 * pow2 (-25) ...
+ + 0x628AED2 * pow2 (-52), ...
+ "pi", 0x6487ED5 * pow2 (-25) ...
+ + 0x442D180 * pow2 (-55)), ...
+ "sup", struct (...
+ "-inf", -inf, ...
+ "-infinity", -inf, ...
+ "inf", inf, ...
+ "+inf", inf, ...
+ "infinity", inf, ...
+ "+infinity", inf, ...
+ "e", 0x56FC2A2 * pow2 (-25) ...
+ + 0x628AED4 * pow2 (-52), ...
+ "pi", 0x6487ED5 * pow2 (-25) ...
+ + 0x442D190 * pow2 (-55)));
+ for [val, lit] = boundary_const.(key)
+ const_idx = todo & strcmp (boundaries, lit);
+ x.(key)(const_idx) = val;
+ overflow.(key)(const_idx) = false;
+ possiblyundefined.(key)(const_idx) = isfinite (val);
+ todo(const_idx) = false;
+ endfor
- if (isempty (boundary))
- switch key
- case "inf"
- x.inf (i) = -inf;
- case "sup"
- x.sup (i) = inf;
- possiblyundefined (i) = false ();
- endswitch
- elseif (isnumeric (boundary))
- if (not (isreal (boundary)))
- error ("interval:InvalidOperand", ...
- ["illegal " key " boundary: must not be complex"]);
- endif
- if (isfloat (boundary))
- ## Simple case: the boundary already is a binary floating point
- ## number in single or double precision.
- x.(key) (i) = double (boundary);
- possiblyundefined (i) = false ();
- continue
+ ## It remains the decimal boundary strings
+ for i = vec (find (todo), 2)
+ try
+ boundary = boundaries{i};
+
+ ## We have to parse a decimal string boundary and round the
+ ## result up or down depending on the boundary
+ ## (inf = down, sup = up).
+ ## str2double will produce the correct answer in 50 % of
+ ## all cases, because it uses rounding mode “to nearest”.
+ ## The input and a double format approximation can be
+ ## compared in a decimal floating point format without
+ ## precision loss.
+
+ if (strfind (boundary, "?"))
+ ## Special case: uncertain-form
+ [boundary, uncertain] = uncertainsplit (boundary);
+ else
+ uncertain = [];
endif
- ## Integer or logical, try to approximate in double precision
- x.(key) (i) = double (boundary);
- isdouble = x.(key) (i) == boundary;
- if (not (isdouble))
- isexact = false;
- if (key == "inf")
- possiblyundefined (i) = true ();
+ if (strfind (boundary, "/"))
+ ## Special case: rational form
+ boundary = strsplit (boundary, "/");
+ if (length (boundary) ~= 2)
+ warning ("interval:UndefinedOperation", ...
+ ["illegal " key " boundary: ", ...
+ "rational form must have single slash"]);
+ illegal_boundary.(key)(i) = true;
+ continue;
+ endif
+ [decimal, remainder] = decimaldivide (...
+ str2decimal (boundary{1}), ...
+ str2decimal (boundary{2}), 18);
+ if (not (isempty (remainder.m)))
+ ## This will guarantee the enclosure of the exact
+ ## value
+ decimal.m(19, 1) = 1;
+ isexact = false ();
+ if (key == "inf")
+ possiblyundefined.(key)(i) = true;
+ endif
+ endif
+ ## Write result back into boundary for conversion to
+ ## double
+ boundary = ["0.", num2str(decimal.m)', ...
+ "e", num2str(decimal.e)];
+ if (decimal.s)
+ boundary = ["-", boundary];
endif
else
- possiblyundefined (i) = false ();
- end
+ decimal = str2decimal (boundary);
+ endif
- ## Check rounding direction of the approximation
- ## Mixed mode comparison works as intended
- if (isdouble || ... # exact conversion
- (x.(key) (i) < boundary && key == "inf") || ... # lower bound
- (x.(key) (i) > boundary && key == "sup")) # upper bound
- ## Conversion to double has used desired rounding direction
- else
- ## Approximation is not exact and not rounded as needed.
- ## However, because of faithful rounding the approximation
- ## is right next to the desired number.
+ ## Parse and add uncertainty
+ if (not (isempty (uncertain)))
+ uncertain = str2decimal (uncertain);
+ if ((key == "inf") == decimal.s)
+ uncertain.s = decimal.s;
+ else
+ uncertain.s = not (decimal.s);
+ endif
+ decimal = decimaladd (decimal, uncertain);
+ ## Write result back into boundary for conversion to
+ ## double
+ boundary = ["0.", num2str(decimal.m)', ...
+ "e", num2str(decimal.e)];
+ if (decimal.s)
+ boundary = ["-", boundary];
+ endif
+ endif
+ clear uncertain;
+
+ ## Check if number is outside of range
+ ## Realmax == 1.7...e308 == 0.17...e309
+ if (decimal.e > 309 || ...
+ (decimal.e == 309 && ...
+ decimal.s && ...
+ decimalcompare (double2decimal (-realmax ()), ...
+ decimal) > 0) || ...
+ (decimal.e == 309 && ...
+ not (decimal.s) && ...
+ decimalcompare (double2decimal (realmax ()), ...
+ decimal) < 0))
switch key
case "inf"
- x.inf (i) = mpfr_function_d ('minus', +inf, ...
- x.inf (i), pow2 (-1074));
+ if (decimal.s) # -inf ... -realmax
+ x.inf(i) = -inf;
+ else # realmax ... inf
+ x.inf(i) = realmax ();
+ overflow.inf(i) = false;
+ endif
case "sup"
- x.sup (i) = mpfr_function_d ('plus', -inf, ...
- x.sup (i), pow2 (-1074));
+ if (decimal.s) # -inf ... -realmax
+ x.sup(i) = -realmax ();
+ overflow.sup(i) = false;
+ else # realmax ... inf
+ x.sup(i) = inf;
+ endif
endswitch
+ possiblyundefined.(key)(i) = true;
+ isexact = false;
+ continue
endif
- elseif (not (ischar (boundary)))
- error ("interval:InvalidOperand", ...
- ["illegal " key " boundary: must be numeric or string"]);
- elseif (strfind (boundary, "0x"))
- ## Hexadecimal floating point number
- switch key
- case "inf"
- direction = -inf;
- case "sup"
- direction = inf;
- endswitch
+ overflow.(key)(i) = false;
- [x.(key)(i), isdouble] = hex2double (boundary, direction);
- if (not (isdouble))
+ ## Compute approximation, this only works between ± realmax
+ binary = str2double (strrep (boundary, ",", "."));
+
+ ## Check approximation value
+ comparison = decimalcompare (double2decimal (binary), ...
+ decimal);
+ if (comparison ~= 0)
+ possiblyundefined.(key)(i) = true;
isexact = false;
- if (key == "inf")
- possiblyundefined (i) = true ();
- endif
+ endif
+ if (comparison == 0 || ... # approximation is exact
+ (comparison < 0 && key == "inf") || ... # lower bound
+ (comparison > 0 && key == "sup")) # upper bound
+ x.(key)(i) = binary;
else
- possiblyundefined (i) = false ();
- end
- else
- ## parse string
- if (key == "sup" && possiblyundefined (i) && iscell (l))
- inf_boundary = l {i};
- ## infsup ("x", "x") or infsup ("x") is not possibly undefined
- if (strcmp (boundary, inf_boundary))
- possiblyundefined (i) = false;
- endif
+ ## Approximation is not exact and not rounded as needed
+ ## However, because of faithful rounding the
+ ## approximation is right next to the desired number.
+ switch key
+ case "inf"
+ x.inf(i) = mpfr_function_d ('minus', -inf, ...
+ binary, pow2 (-1074));
+ case "sup"
+ x.sup(i) = mpfr_function_d ('plus', +inf, ...
+ binary, pow2 (-1074));
+ endswitch
endif
-
- switch (boundary)
- case {"-inf", "-infinity"}
- x.(key) (i) = -inf;
- possiblyundefined (i) = false ();
- overflow (i) = false;
- case {"inf", "+inf", "infinity", "+infinity"}
- x.(key) (i) = inf;
- possiblyundefined (i) = false ();
- overflow (i) = false;
- case "e"
- isexact = false ();
- switch key
- case "inf"
- x.inf (i) = 0x56FC2A2 * pow2 (-25) ...
- + 0x628AED2 * pow2 (-52);
- possiblyundefined (i) = true ();
- case "sup"
- x.sup (i) = 0x56FC2A2 * pow2 (-25) ...
- + 0x628AED4 * pow2 (-52);
- endswitch
- case "pi"
- isexact = false ();
- switch key
- case "inf"
- x.inf (i) = 0x6487ED5 * pow2 (-25) ...
- + 0x442D180 * pow2 (-55);
- possiblyundefined (i) = true ();
- case "sup"
- x.sup (i) = 0x6487ED5 * pow2 (-25) ...
- + 0x442D190 * pow2 (-55);
- endswitch
- otherwise
- ## We have to parse a decimal string boundary and round the
- ## result up or down depending on the boundary
- ## (inf = down, sup = up).
- ## str2double will produce the correct answer in 50 % of
- ## all cases, because it uses rounding mode “to nearest”.
- ## The input and a double format approximation can be
- ## compared in a decimal floating point format without
- ## precision loss.
-
- if (strfind (boundary, "?"))
- ## Special case: uncertain-form
- [boundary, uncertain] = uncertainsplit (boundary);
- else
- uncertain = [];
- endif
-
- if (strfind (boundary, "/"))
- ## Special case: rational form
- boundary = strsplit (boundary, "/");
- if (length (boundary) ~= 2)
- error ("interval:InvalidOperand", ...
- ["illegal " key " boundary: ", ...
- "rational form must have single slash"]);
- endif
- [decimal, remainder] = decimaldivide (...
- str2decimal (boundary {1}), ...
- str2decimal (boundary {2}), 18);
- if (not (isempty (remainder.m)))
- ## This will guarantee the enclosure of the exact
- ## value
- decimal.m (19, 1) = 1;
- isexact = false ();
- if (key == "inf")
- possiblyundefined (i) = true ();
- endif
- endif
- ## Write result back into boundary for conversion to
- ## double
- boundary = ["0.", num2str(decimal.m)', ...
- "e", num2str(decimal.e)];
- if (decimal.s)
- boundary = ["-", boundary];
- endif
- else
- decimal = str2decimal (boundary);
- endif
-
- ## Parse and add uncertainty
- if (not (isempty (uncertain)))
- uncertain = str2decimal (uncertain);
- if ((key == "inf") == decimal.s)
- uncertain.s = decimal.s;
- else
- uncertain.s = not (decimal.s);
- endif
- decimal = decimaladd (decimal, uncertain);
- ## Write result back into boundary for conversion to
- ## double
- boundary = ["0.", num2str(decimal.m)', ...
- "e", num2str(decimal.e)];
- if (decimal.s)
- boundary = ["-", boundary];
- endif
- endif
- clear uncertain;
-
- ## Check if number is outside of range
- ## Realmax == 1.7...e308 == 0.17...e309
- if (decimal.e > 309 || ...
- (decimal.e == 309 && ...
- decimal.s && ...
- decimalcompare (double2decimal (-realmax ()), ...
- decimal) > 0) || ...
- (decimal.e == 309 && ...
- not (decimal.s) && ...
- decimalcompare (double2decimal (realmax ()), ...
- decimal) < 0))
- switch key
- case "inf"
- if (decimal.s) # -inf ... -realmax
- x.inf (i) = -inf;
- else # realmax ... inf
- x.inf (i) = realmax ();
- endif
- possiblyundefined (i) = true ();
- case "sup"
- if (decimal.s) # -inf ... -realmax
- x.sup (i) = -realmax ();
- else # realmax ... inf
- x.sup (i) = inf;
- endif
- endswitch
- isexact = false ();
- continue
- endif
-
- ## Compute approximation, this only works between ± realmax
- binary = str2double (strrep (boundary, ",", "."));
-
- ## Check approximation value
- comparison = decimalcompare (double2decimal (binary), ...
- decimal);
- if (comparison ~= 0)
- isexact = false ();
- if (key == "inf")
- possiblyundefined (i) = true ();
- endif
- else
- possiblyundefined (i) = false ();
- endif
- if (comparison == 0 || ... # approximation is exact
- (comparison < 0 && key == "inf") || ... # lower bound
- (comparison > 0 && key == "sup")) # upper bound
- x.(key) (i) = binary;
- else
- ## Approximation is not exact and not rounded as needed
- ## However, because of faithful rounding the
- ## approximation is right next to the desired number.
- switch key
- case "inf"
- x.inf (i) = mpfr_function_d ('minus', -inf, ...
- binary, pow2 (-1074));
- case "sup"
- x.sup (i) = mpfr_function_d ('plus', +inf, ...
- binary, pow2 (-1074));
- endswitch
- endif
- endswitch
- endif
+ catch
+ warning ("interval:UndefinedOperation", lasterr ());
+ illegal_boundary.(key)(i) = true;
+ end_try_catch
endfor
endfor
-## NaNs produce empty intervals
-nanvalue = isnan (x.inf) | isnan (x.sup);
-x.inf (nanvalue) = inf;
-x.sup (nanvalue) = -inf;
-possiblyundefined (nanvalue) = false;
+## Part 3
+##
+## Check boundaries individually after conversion to double
+
+## NaNs are illegal values
+for [boundary, key] = struct ("inf", {x.inf}, "sup", {x.sup})
+ nanvalue = isnan (boundary);
+ if (any (nanvalue(:)))
+ warning ("interval:UndefinedOperation", ...
+ "input contains NaN values");
+ illegal_boundary.(key)(nanvalue) = true;
+ endif
+endfor
## normalize boundaries:
## representation of the set containing only zero is always [-0,+0]
-x.inf (x.inf == 0) = -0;
-x.sup (x.sup == 0) = +0;
+x.inf(x.inf == 0) = -0;
+x.sup(x.sup == 0) = +0;
-## check for illegal boundaries [inf,inf] and [-inf,-inf]
-if (any (any (not (isfinite (x.inf (x.inf == x.sup))), 1)))
- error ("interval:InvalidOperand", ...
- "illegal interval boundaries: infimum = supremum = +/- infinity");
-endif
+## Part 4
+##
+## Broadcast boundaries and final checks
if (nargout >= 3)
- overflow (x.inf > -inf & x.sup < inf) = false;
+ overflow = overflow.inf | overflow.sup;
+ overflow(x.inf > -inf & x.sup < inf) = false;
+endif
+
+x.inf = x.inf - zeros (size (x.sup));
+x.sup = x.sup + zeros (size (x.inf));
+
+possiblyundefined = possiblyundefined.inf & possiblyundefined.sup;
+if (any (possiblyundefined(:)))
+ if (not (iscell (l)) && not (iscell (u)))
+ ## infsup (x, x) or infsup (x) is not possibly undefined
+ possiblyundefined(l == u) = false;
+ else
+ ## infsup ("x", "x") or infsup ("x") is not possibly undefined
+ if (not (iscell (l)))
+ l = num2cell (l);
+ endif
+ if (not (iscell (u)))
+ u = num2cell (u);
+ endif
+ possiblyundefined(cellfun ("isequal", l, u)) = false;
+ endif
endif
-## check boundary order
-if (any (any (isfinite (x.inf (x.inf > x.sup)))) || ...
- any (any (isfinite (x.sup (x.inf > x.sup)))))
- error ("interval:InvalidOperand", ...
- "illegal interval boundaries: infimum greater than supremum");
+## Non-empty intervals are always legal.
+isnai(x.inf <= x.sup) = false;
+
+## Check for illegal boundaries [inf,inf] and [-inf,-inf].
+illegal_inf_idx = not (isfinite (x.inf (x.inf == x.sup)));
+if (any (illegal_inf_idx(:)))
+ warning ("interval:UndefinedOperation", ...
+ "illegal interval boundaries: infimum = supremum = +/- infinity");
+ isnai(illegal_inf_idx) = true;
endif
-## check for possibly wrong boundary order
-if (any (any (possiblyundefined)) && any (any (max (-realmax, ...
+## Illegal boundaries make illegal intervals,
+## we have triggered a warning already (see above).
+isnai(illegal_boundary.inf | illegal_boundary.sup) = true;
+
+## Check boundary order
+## isnai has been initialized with -1. Any non-empty or legal empty intervals
+## have been set to 0. Any illegal interval literals or illegal boundaries
+## have been set to +1. Any intervals with inf > sup still have their initial
+## value of -1.
+wrong_boundary_order_idx = signbit (isnai);
+if (any (wrong_boundary_order_idx(:)))
+ warning ("interval:UndefinedOperation", ...
+ "illegal interval boundaries: infimum greater than supremum");
+ isnai(wrong_boundary_order_idx) = true;
+endif
+isnai = logical(isnai);
+
+## Return [empty] for any illegal intervals.
+x.inf(isnai) = +inf;
+x.sup(isnai) = -inf;
+possiblyundefined(isnai) = false;
+isexact = isexact && not (any (isnai(:)));
+
+## Check for possibly wrong boundary order.
+if (any (possiblyundefined(:)))
+ ## Let a, b, and c be three consecutive floating point numbers.
+ ##
+ ## If a < u < b < l < c, then u and l will both be mapped to the same
+ ## number b by outward rounding.
+ ##
+ ## If a < u < l < b, then u and l will both be mapped to consecutive
+ ## floating point numbers a and b.
+ if (any ((x.inf(possiblyundefined) == x.sup(possiblyundefined))(:)) ...
+ || ...
+ any ((max (-realmax, ...
mpfr_function_d ('plus',...
+inf, ...
- x.inf (possiblyundefined), ...
- pow2 (-1074))) == x.sup (possiblyundefined))))
- warning ("interval:PossiblyUndefined", ...
- "infimum may be greater than supremum");
+ x.inf(possiblyundefined), ...
+ pow2 (-1074))) == x.sup(possiblyundefined))(:)))
+ warning ("interval:PossiblyUndefinedOperation", ...
+ "infimum may be greater than supremum");
+ endif
endif
x = class (x, "infsup");
endfunction
-%!test "double boundaries";
-%! assert (inf (infsup (0)), 0);
-%! assert (sup (infsup (0)), 0);
-%! assert (inf (infsup (2, 3)), 2);
-%! assert (sup (infsup (2, 3)), 3);
-%! assert (inf (infsup (nan)), +inf);
-%! assert (sup (infsup (nan)), -inf);
-%! assert (inf (infsup (nan, 2)), +inf);
-%! assert (sup (infsup (nan, 2)), -inf);
-%! assert (inf (infsup (3, nan)), +inf);
-%! assert (sup (infsup (3, nan)), -inf);
-%!test "double matrix";
-%! assert (inf (infsup (magic (4))), magic (4));
-%! assert (sup (infsup (magic (4))), magic (4));
-%! assert (inf (infsup (magic (3), magic (3) + 1)), magic (3));
-%! assert (sup (infsup (magic (3), magic (3) + 1)), magic (3) + 1);
-%! assert (inf (infsup (nan (3))), +inf (3));
-%! assert (sup (infsup (nan (3))), -inf (3));
-%!test "decimal boundaries";
-%! assert (inf (infsup ("0.1")), 0.1 - eps / 16);
-%! assert (sup (infsup ("0.1")), 0.1);
-%! assert (inf (infsup ("0.1e1")), 1);
-%! assert (sup (infsup ("0.1e1")), 1);
-%!test "hexadecimal boundaries";
-%! assert (inf (infsup ("0xff")), 255);
-%! assert (sup (infsup ("0xff")), 255);
-%! assert (inf (infsup ("0xff.1")), 255.0625);
-%! assert (sup (infsup ("0xff.1")), 255.0625);
-%! assert (inf (infsup ("0xff.1p-1")), 127.53125);
-%! assert (sup (infsup ("0xff.1p-1")), 127.53125);
-%!test "named constants";
-%! assert (inf (infsup ("pi")), pi);
-%! assert (sup (infsup ("pi")), pi + 2 * eps);
-%! assert (inf (infsup ("e")), e);
-%! assert (sup (infsup ("e")), e + eps);
-%!test "uncertain form";
-%! assert (inf (infsup ("32?")), 31.5);
-%! assert (sup (infsup ("32?")), 32.5);
-%! assert (inf (infsup ("32?8")), 24);
-%! assert (sup (infsup ("32?8")), 40);
-%! assert (inf (infsup ("32?u")), 32);
-%! assert (sup (infsup ("32?u")), 32.5);
-%! assert (inf (infsup ("32?d")), 31.5);
-%! assert (sup (infsup ("32?d")), 32);
-%! assert (inf (infsup ("32??")), -inf);
-%! assert (sup (infsup ("32??")), +inf);
-%! assert (inf (infsup ("32??d")), -inf);
-%! assert (sup (infsup ("32??d")), 32);
-%! assert (inf (infsup ("32??u")), 32);
-%! assert (sup (infsup ("32??u")), +inf);
-%! assert (inf (infsup ("32?e5")), 3150000);
-%! assert (sup (infsup ("32?e5")), 3250000);
-%!test "rational form";
-%! assert (inf (infsup ("6/9")), 2 / 3);
-%! assert (sup (infsup ("6/9")), 2 / 3 + eps / 2);
-%! assert (inf (infsup ("6e1/9")), 20 / 3 - eps * 2);
-%! assert (sup (infsup ("6e1/9")), 20 / 3);
-%! assert (inf (infsup ("6/9e1")), 2 / 30);
-%! assert (sup (infsup ("6/9e1")), 2 / 30 + eps / 16);
-%! assert (inf (infsup ("-6/9")), -(2 / 3 + eps / 2));
-%! assert (sup (infsup ("-6/9")), -2 / 3);
-%! assert (inf (infsup ("6/-9")), -(2 / 3 + eps / 2));
-%! assert (sup (infsup ("6/-9")), -2 / 3);
-%! assert (inf (infsup ("-6/-9")), 2 / 3);
-%! assert (sup (infsup ("-6/-9")), 2 / 3 + eps / 2);
-%! assert (inf (infsup ("6.6/9.9")), 2 / 3);
-%! assert (sup (infsup ("6.6/9.9")), 2 / 3 + eps / 2);
-%!test "interval literal";
-%! assert (inf (infsup ("[Entire]")), -inf);
-%! assert (sup (infsup ("[Entire]")), +inf);
-%! assert (inf (infsup ("[Empty]")), +inf);
-%! assert (sup (infsup ("[Empty]")), -inf);
-%! assert (inf (infsup ("[2, 3]")), 2);
-%! assert (sup (infsup ("[2, 3]")), 3);
-%! assert (inf (infsup ("[0.1]")), 0.1 - eps / 16);
-%! assert (sup (infsup ("[0.1]")), 0.1);
-%! assert (inf (infsup ("[0xff, 0xff.1]")), 255);
-%! assert (sup (infsup ("[0xff, 0xff.1]")), 255.0625);
-%! assert (inf (infsup ("[e, pi]")), e);
-%! assert (sup (infsup ("[e, pi]")), pi + 2 * eps);
-%! assert (inf (infsup ("[6/9, 6e1/9]")), 2 / 3);
-%! assert (sup (infsup ("[6/9, 6e1/9]")), 20 / 3);
-%!test "corner cases";
-%! assert (inf (infsup (",")), -inf);
-%! assert (sup (infsup (",")), +inf);
-%! assert (inf (infsup ("[,]")), -inf);
-%! assert (sup (infsup ("[,]")), +inf);
-%! assert (inf (infsup ("[, 3]")), -inf);
-%! assert (sup (infsup ("[, 3]")), 3);
-%! assert (inf (infsup ("", "3")), -inf);
-%! assert (sup (infsup ("", "3")), 3);
-%! assert (inf (infsup ("[2, ]")), 2);
-%! assert (sup (infsup ("[2, ]")), inf);
-%! assert (inf (infsup ("2", "")), 2);
-%! assert (sup (infsup ("2", "")), inf);
-%!test "decimal vector";
-%! assert (inf (infsup (["0.1"; "0.2"; "0.3"])), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
-%! assert (sup (infsup (["0.1"; "0.2"; "0.3"])), [0.1; 0.2; 0.3 + eps / 8]);
-%! assert (inf (infsup ("0.1; 0.2; 0.3")), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
-%! assert (sup (infsup ("0.1; 0.2; 0.3")), [0.1; 0.2; 0.3 + eps / 8]);
-%! assert (inf (infsup ("0.1\n0.2\n0.3")), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
-%! assert (sup (infsup ("0.1\n0.2\n0.3")), [0.1; 0.2; 0.3 + eps / 8]);
-%!test "cell array with mixed boundaries";
-%! assert (inf (infsup ({"0.1", 42; "e", "3.2/8"}, {"0xffp2", "42e1"; "pi", 2})), [0.1 - eps / 16, 42; e, 0.4 - eps / 4]);
-%! assert (sup (infsup ({"0.1", 42; "e", "3.2/8"}, {"0xffp2", "42e1"; "pi", 2})), [1020, 420; pi + 2 * eps, 2]);
-%! assert (inf (infsup ({"[2, 3]", "3/4", "[Entire]", "42?3", 1, "0xf"})), [2, 0.75, -inf, 39, 1, 15]);
-%! assert (sup (infsup ({"[2, 3]", "3/4", "[Entire]", "42?3", 1, "0xf"})), [3, 0.75, +inf, 45, 1, 15]);
-%!test "broadcasting";
-%! assert (inf (infsup (magic (3), 10)), magic (3));
-%! assert (sup (infsup (magic (3), 10)), 10 * ones (3));
-%! assert (inf (infsup (1, magic (3))), ones (3));
-%! assert (sup (infsup (1, magic (3))), magic (3));
-%!error infsup ("[nai]");
-%!error infsup ({42, "[nai]"});
-%!error infsup (3, 2);
-%!error infsup ("Ausgeschnitzel");
-%!warning infsup ("1.000000000000000000002", "1.000000000000000000001");
+%!# Empty intervals
+%!test
+%! x = infsup ();
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[ ]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[\t]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[empty]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[EMPTY]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("[ empty ]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!test
+%! x = infsup ("\t[\t Empty\t]\t");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+
+%!# Entire interval
+%!test
+%! x = infsup ("[,]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[entire]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[ENTIRE]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[ entire ]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup (" [Entire \t] ");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[-inf,+inf]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[-infinity, +infinity]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[-INF, +INFinitY]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+
+%!# double boundaries
+%!test
+%! x = infsup (0);
+%! assert (inf (x), 0);
+%! assert (sup (x), 0);
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = infsup (2, 3);
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%!test
+%! x = infsup (-inf, 0.1);
+%! assert (inf (x), -inf);
+%! assert (sup (x), 0.1);
+%!test
+%! x = infsup (-inf, +inf);
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+
+%!# NaN values
+%!warning id=interval:UndefinedOperation
+%! x = infsup (nan);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (nan, 2);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (3, nan);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+
+%!# illegal numeric boundaries
+%!warning id=interval:UndefinedOperation
+%! x = infsup (+inf, -inf);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (+inf, +inf);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (-inf, -inf);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (3, 2);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (3, -inf);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+
+%!# double matrix
+%!test
+%! x = infsup (magic (4));
+%! assert (inf (x), magic (4));
+%! assert (sup (x), magic (4));
+%!test
+%! x = infsup (magic (3), magic (3) + 1);
+%! assert (inf (x), magic (3));
+%! assert (sup (x), magic (3) + 1);
+%!warning id=interval:UndefinedOperation
+%! x = infsup (nan (3));
+%! assert (inf (x), +inf (3));
+%! assert (sup (x), -inf (3));
+%!test
+%! x = infsup (-inf (3), +inf (3));
+%! assert (inf (x), -inf (3));
+%! assert (sup (x), +inf (3));
+
+%!# decimal boundaries
+%!test
+%! x = infsup ("0.1");
+%! assert (inf (x), 0.1 - eps / 16);
+%! assert (sup (x), 0.1);
+%!test
+%! x = infsup ("0.1e1");
+%! assert (inf (x), 1);
+%! assert (sup (x), 1);
+
+%!# hexadecimal boundaries
+%!test
+%! x = infsup ("0xff");
+%! assert (inf (x), 255);
+%! assert (sup (x), 255);
+%!test
+%! x = infsup ("0xff.1");
+%! assert (inf (x), 255.0625);
+%! assert (sup (x), 255.0625);
+%!test
+%! x = infsup ("0xff.1p-1");
+%! assert (inf (x), 127.53125);
+%! assert (sup (x), 127.53125);
+
+%!# named constants
+%!test
+%! x = infsup ("pi");
+%! assert (inf (x), pi);
+%! assert (sup (x), pi + 2 * eps);
+%!test
+%! x = infsup ("e");
+%! assert (inf (x), e);
+%! assert (sup (x), e + eps);
+
+%!# uncertain form
+%!test
+%! x = infsup ("32?");
+%! assert (inf (x), 31.5);
+%! assert (sup (x), 32.5);
+%!test
+%! x = infsup ("32?8");
+%! assert (inf (x), 24);
+%! assert (sup (x), 40);
+%!test
+%! x = infsup ("32?u");
+%! assert (inf (x), 32);
+%! assert (sup (x), 32.5);
+%!test
+%! x = infsup ("32?d");
+%! assert (inf (x), 31.5);
+%! assert (sup (x), 32);
+%!test
+%! x = infsup ("32??");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("32??d");
+%! assert (inf (x), -inf);
+%! assert (sup (x), 32);
+%!test
+%! x = infsup ("32??u");
+%! assert (inf (x), 32);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("32?e5");
+%! assert (inf (x), 3150000);
+%! assert (sup (x), 3250000);
+
+%!# rational form
+%!test
+%! x = infsup ("6/9");
+%! assert (inf (x), 2 / 3);
+%! assert (sup (x), 2 / 3 + eps / 2);
+%!test
+%! x = infsup ("6e1/9");
+%! assert (inf (x), 20 / 3 - eps * 2);
+%! assert (sup (x), 20 / 3);
+%!test
+%! x = infsup ("6/9e1");
+%! assert (inf (x), 2 / 30);
+%! assert (sup (x), 2 / 30 + eps / 16);
+%!test
+%! x = infsup ("-6/9");
+%! assert (inf (x), -(2 / 3 + eps / 2));
+%! assert (sup (x), -2 / 3);
+%!test
+%! x = infsup ("6/-9");
+%! assert (inf (x), -(2 / 3 + eps / 2));
+%! assert (sup (x), -2 / 3);
+%!test
+%! x = infsup ("-6/-9");
+%! assert (inf (x), 2 / 3);
+%! assert (sup (x), 2 / 3 + eps / 2);
+%!test
+%! x = infsup ("6.6/9.9");
+%! assert (inf (x), 2 / 3);
+%! assert (sup (x), 2 / 3 + eps / 2);
+
+%!# inf-sup interval literal
+%!test
+%! x = infsup ("[2, 3]");
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%!test
+%! x = infsup ("[0.1]");
+%! assert (inf (x), 0.1 - eps / 16);
+%! assert (sup (x), 0.1);
+%!test
+%! x = infsup ("[0xff, 0xff.1]");
+%! assert (inf (x), 255);
+%! assert (sup (x), 255.0625);
+%!test
+%! x = infsup ("[e, pi]");
+%! assert (inf (x), e);
+%! assert (sup (x), pi + 2 * eps);
+%!test
+%! x = infsup ("[6/9, 6e1/9]");
+%! assert (inf (x), 2 / 3);
+%! assert (sup (x), 20 / 3);
+
+%!# corner cases
+%!test
+%! x = infsup (",");
+%! assert (inf (x), -inf);
+%! assert (sup (x), +inf);
+%!test
+%! x = infsup ("[, 3]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), 3);
+%!test
+%! x = infsup ("", "3");
+%! assert (inf (x), -inf);
+%! assert (sup (x), 3);
+%!test
+%! x = infsup ("[2, ]");
+%! assert (inf (x), 2);
+%! assert (sup (x), inf);
+%!test
+%! x = infsup ("2", "");
+%! assert (inf (x), 2);
+%! assert (sup (x), inf);
+
+%!# decimal vector
+%!test
+%! x = infsup (["0.1"; "0.2"; "0.3"]);
+%! assert (inf (x), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
+%! assert (sup (x), [0.1; 0.2; 0.3 + eps / 8]);
+%!test
+%! x = infsup ("0.1; 0.2; 0.3");
+%! assert (inf (x), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
+%! assert (sup (x), [0.1; 0.2; 0.3 + eps / 8]);
+%!test
+%! x = infsup ("0.1\n0.2\n0.3");
+%! assert (inf (x), [0.1 - eps / 16; 0.2 - eps / 8; 0.3]);
+%! assert (sup (x), [0.1; 0.2; 0.3 + eps / 8]);
+
+%!# cell array with mixed boundaries
+%!test
+%! x = infsup ({"0.1", 42; "e", "3.2/8"}, {"0xffp2", "42e1"; "pi", 2});
+%! assert (inf (x), [0.1 - eps / 16, 42; e, 0.4 - eps / 4]);
+%! assert (sup (x), [1020, 420; pi + 2 * eps, 2]);
+%!test
+%! x = infsup ({"[2, 3]", "3/4", "[Entire]", "42?3", 1, "0xf"});
+%! assert (inf (x), [2, 0.75, -inf, 39, 1, 15]);
+%! assert (sup (x), [3, 0.75, +inf, 45, 1, 15]);
+
+%!# broadcasting
+%!test
+%! x = infsup (magic (3), 10);
+%! assert (inf (x), magic (3));
+%! assert (sup (x), 10 .* ones (3));
+%!test
+%! x = infsup (zeros (1, 20), ones (20, 1));
+%! assert (inf (x), zeros (20, 20));
+%! assert (sup (x), ones (20, 20));
+
+%!# nai
+%!warning id=interval:UndefinedOperation
+%! x = infsup ("[nai]");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup ("Ausgeschnitzel");
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+
+%!# interval literals vs. two arguments
+%!warning id=interval:UndefinedOperation
+%! x = infsup ("[empty]", 42);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+%!warning id=interval:UndefinedOperation
+%! x = infsup ("0?", 42);
+%! assert (inf (x), +inf);
+%! assert (sup (x), -inf);
+
+%!# extraction of single errors
+%!warning id=interval:UndefinedOperation
+%! x = infsup ("0 1 2 [xxx] 3 4");
+%! assert (inf (x), [0 1 2 +inf 3 4]);
+%! assert (sup (x), [0 1 2 -inf 3 4]);
+%!warning id=interval:UndefinedOperation
+%! x = infsup ({1 2; 3 "[xxx]"});
+%! assert (inf (x), [1 2; 3 +inf]);
+%! assert (sup (x), [1 2; 3 -inf]);
+
+%!# complex values
+%!warning id=interval:InvalidOperand
+%! x = infsup ([1 2 3+i 4+0i]);
+%! assert (inf (x), [1 2 +inf 4]);
+%! assert (sup (x), [1 2 -inf 4]);
+
+%!# inaccurate conversion
+%!warning id=interval:PossiblyUndefinedOperation
+%! x = infsup ("1.000000000000000000002", "1.000000000000000000001");
+%! assert (inf (x), 1);
+%! assert (sup (x), 1 + eps);
+%!test
+%! n = uint64(2 ^ 53);
+%! x = infsup (n, n + 1);
+%! assert (inf (x), double (n));
+%! assert (sup (x), double (n + 2));
+%!test
+%! n = uint64(2 ^ 53);
+%! x = infsup ({n}, n + 1);
+%! assert (inf (x), double (n));
+%! assert (sup (x), double (n + 2));
+%!test
+%! n = uint64(2 ^ 53);
+%! x = infsup (n + 1, n + 1);
+%! assert (inf (x), double (n));
+%! assert (sup (x), double (n + 2));
+%!test
+%! n = uint64(2 ^ 54);
+%! x = infsup (n, n + 1);
+%! assert (inf (x), double (n));
+%! assert (sup (x), double (n + 4));
+%!warning id=interval:PossiblyUndefinedOperation
+%! n = uint64(2 ^ 54);
+%! x = infsup (n + 1, n + 2);
+%! assert (inf (x), double (n));
+%! assert (sup (x), double (n + 4));
+%!warning id=interval:PossiblyUndefinedOperation
+%! x = infsup ("pi", "3.141592653589793");
+%! assert (inf (x), pi);
+%! assert (sup (x), pi);
+%!warning id=interval:PossiblyUndefinedOperation
+%! x = infsup ("pi", "3.1415926535897932");
+%! assert (inf (x), pi);
+%! assert (sup (x), pi + 2 * eps);
+
+%!# isexact flag
+%!test
+%! [~, isexact] = infsup ();
+%! assert (isexact);
+%!test
+%! [~, isexact] = infsup (0);
+%! assert (isexact);
+%!test
+%! [~, isexact] = infsup ("1 2 3");
+%! assert (isexact, true);
+%!test
+%! [~, isexact] = infsup ("1 2 3.1");
+%! assert (isexact, false);
+%!warning
+%! [~, isexact] = infsup ("[nai]");
+%! assert (not (isexact));
+
+%!# overflow flag
+%!test
+%! [~, ~, overflow] = infsup ();
+%! assert (not (overflow));
+%!test
+%! [~, ~, overflow] = infsup (0);
+%! assert (not (overflow));
+%!test
+%! [~, ~, overflow] = infsup ([1 2 3]);
+%! assert (overflow, false (1, 3));
+%!warning
+%! [~, ~, overflow] = infsup ("[nai]");
+%! assert (not (overflow));
+%!test
+%! [~, ~, overflow] = infsup ("1e3000");
+%! assert (overflow);
+%!test
+%! [~, ~, overflow] = infsup ("[1, inf]");
+%! assert (not (overflow));
+
+%!# isnai flag
+%!test
+%! [~, ~, ~, isnai] = infsup ();
+%! assert (not (isnai));
+%!test
+%! [~, ~, ~, isnai] = infsup (0);
+%! assert (not (isnai));
+%!test
+%! [~, ~, ~, isnai] = infsup ([1 2 3]);
+%! assert (isnai, false (1, 3));
+%!warning
+%! [~, ~, ~, isnai] = infsup ("[nai]");
+%! assert (isnai);
+%!warning
+%! [~, ~, ~, isnai] = infsup ("xxx");
+%! assert (isnai);
+%!warning
+%! [~, ~, ~, isnai] = infsup ("1 2 xxx 4");
+%! assert (isnai, [false, false, true, false]);
diff --git a/inst/@infsup/interior.m b/inst/@infsup/interior.m
index 2ae0811..8ec4224 100644
--- a/inst/@infsup/interior.m
+++ b/inst/@infsup/interior.m
@@ -48,7 +48,7 @@ endif
result = ((b.inf < a.inf | (b.inf == -inf & a.inf == -inf)) & ...
(a.sup < b.sup | (a.sup == inf & b.sup == inf)));
-result (isempty (a) & isempty (b)) = true ();
+result(isempty (a) & isempty (b)) = true ();
endfunction
diff --git a/inst/@infsup/intersect.m b/inst/@infsup/intersect.m
index a6ac578..49d74e6 100644
--- a/inst/@infsup/intersect.m
+++ b/inst/@infsup/intersect.m
@@ -42,7 +42,7 @@
## Keywords: interval
## Created: 2014-10-02
-function result = intersect (a, b, dim)
+function a = intersect (a, b, dim)
if (not (isa (a, "infsup")))
a = infsup (a);
@@ -71,33 +71,56 @@ endswitch
## If the intervals do not intersect, the result must be empty.
emptyresult = l > u;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+a.inf = l;
+a.sup = u;
endfunction
-%!test "Empty interval";
-%! assert (intersect (infsup (), infsup ()) == infsup ());
-%! assert (intersect (infsup (), infsup (1)) == infsup ());
-%! assert (intersect (infsup (0), infsup ()) == infsup ());
-%! assert (intersect (infsup (-inf, inf), infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (intersect (infsup (0), infsup (1)) == infsup ());
-%! assert (intersect (infsup (0), infsup (0)) == infsup (0));
-%!test "Bounded intervals";
-%! assert (intersect (infsup (1, 2), infsup (3, 4)) == infsup ());
-%! assert (intersect (infsup (1, 2), infsup (2, 3)) == infsup (2));
-%! assert (intersect (infsup (1, 2), infsup (1.5, 2.5)) == infsup (1.5, 2));
-%! assert (intersect (infsup (1, 2), infsup (1, 2)) == infsup (1, 2));
-%!test "Unbounded intervals";
-%! assert (intersect (infsup (0, inf), infsup (-inf, 0)) == infsup (0));
-%! assert (intersect (infsup (1, inf), infsup (-inf, -1)) == infsup ());
-%! assert (intersect (infsup (-1, inf), infsup (-inf, 1)) == infsup (-1, 1));
-%! assert (intersect (infsup (-inf, inf), infsup (42)) == infsup (42));
-%! assert (intersect (infsup (42), infsup (-inf, inf)) == infsup (42));
-%! assert (intersect (infsup (-inf, 0), infsup (-inf, inf)) == infsup (-inf, 0));
-%! assert (intersect (infsup (-inf, inf), infsup (-inf, inf)) == infsup (-inf, inf));
-%!test "from the documentation string";
-%! assert (intersect (infsup (1, 3), infsup (2, 4)) == infsup (2, 3));
+%!# Empty interval
+%!assert (intersect (infsup (), infsup ()) == infsup ());
+%!assert (intersect (infsup (), infsup (1)) == infsup ());
+%!assert (intersect (infsup (0), infsup ()) == infsup ());
+%!assert (intersect (infsup (-inf, inf), infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (intersect (infsup (0), infsup (1)) == infsup ());
+%!assert (intersect (infsup (0), infsup (0)) == infsup (0));
+
+%!# Bounded intervals
+%!assert (intersect (infsup (1, 2), infsup (3, 4)) == infsup ());
+%!assert (intersect (infsup (1, 2), infsup (2, 3)) == infsup (2));
+%!assert (intersect (infsup (1, 2), infsup (1.5, 2.5)) == infsup (1.5, 2));
+%!assert (intersect (infsup (1, 2), infsup (1, 2)) == infsup (1, 2));
+
+%!# Unbounded intervals
+%!assert (intersect (infsup (0, inf), infsup (-inf, 0)) == infsup (0));
+%!assert (intersect (infsup (1, inf), infsup (-inf, -1)) == infsup ());
+%!assert (intersect (infsup (-1, inf), infsup (-inf, 1)) == infsup (-1, 1));
+%!assert (intersect (infsup (-inf, inf), infsup (42)) == infsup (42));
+%!assert (intersect (infsup (42), infsup (-inf, inf)) == infsup (42));
+%!assert (intersect (infsup (-inf, 0), infsup (-inf, inf)) == infsup (-inf, 0));
+%!assert (intersect (infsup (-inf, inf), infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# from the documentation string
+%!assert (intersect (infsup (1, 3), infsup (2, 4)) == infsup (2, 3));
+
+%!# correct use of signed zeros
+%!test
+%! x = intersect (infsup (0), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = intersect (infsup (0), infsup (0, 1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = intersect (infsup (0, 1), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = intersect (infsup (-1, 0), infsup (0, 1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/intervaltoexact.m b/inst/@infsup/intervaltoexact.m
index 6eb3bd5..8359bd3 100644
--- a/inst/@infsup/intervaltoexact.m
+++ b/inst/@infsup/intervaltoexact.m
@@ -45,4 +45,4 @@ s = intervaltotext (x, "exact hexadecimal");
endfunction
-%!assert (intervaltoexact (infsup (1 + eps)), "[0X1.0000000000001P+0]");
+%!assert (intervaltoexact (infsup (1 + eps)), "[0x1.0000000000001p+0]");
diff --git a/inst/@infsup/intervaltotext.m b/inst/@infsup/intervaltotext.m
index e059093..c51564e 100644
--- a/inst/@infsup/intervaltotext.m
+++ b/inst/@infsup/intervaltotext.m
@@ -77,50 +77,51 @@ if (nargin < 2)
endif
s = l = u = cell (size (x.inf));
-s (isempty (x)) = "[Empty]";
-s (isentire (x)) = "[Entire]";
+s(isempty (x)) = "[Empty]";
+s(isentire (x)) = "[Entire]";
select = not (isempty (x) | isentire (x));
-if (any (any (select)))
- x.inf (x.inf == 0) = 0; # no sign for zero
- [l(select), lexact] = mpfr_to_string_d (-inf, format, x.inf (select));
- [u(select), uexact] = mpfr_to_string_d (+inf, format, x.sup (select));
+if (any (select(:)))
+ [l(select), lexact] = mpfr_to_string_d (-inf, format, x.inf(select));
+ [u(select), uexact] = mpfr_to_string_d (+inf, format, x.sup(select));
isexact = lexact && uexact;
+ l(x.inf == 0) = "0"; # no sign for zero
+
## Normalize case of +-Inf
- l (select & x.inf == -inf) = "-Inf";
- u (select & x.sup == inf) = "Inf";
+ l(select & x.inf == -inf) = "-Inf";
+ u(select & x.sup == inf) = "Inf";
## If l is negative, then u shall also carry a sign (not zero)
change_of_sign = select & x.inf < 0 & x.sup > 0;
- u (change_of_sign) = strcat ("+", u (change_of_sign));
+ u(change_of_sign) = strcat ("+", u(change_of_sign));
singleton_string = strcmp (l, u);
- s (select & singleton_string) = strcat ("[", ...
- l (select & singleton_string), ...
- "]");
- s (select & not (singleton_string)) = strcat (...
- "[", ...
- l (select & not (singleton_string)), ...
- {", "}, ...
- u (select & not (singleton_string)), ...
- "]");
+ s(select & singleton_string) = strcat ("[", ...
+ l(select & singleton_string), ...
+ "]");
+ s(select & not (singleton_string)) = strcat (...
+ "[", ...
+ l(select & not (singleton_string)), ...
+ {", "}, ...
+ u(select & not (singleton_string)), ...
+ "]");
endif
if (isscalar (s))
- s = s {1};
+ s = s{1};
endif
endfunction
%!assert (intervaltotext (infsup (1 + eps), "exact decimal"), "[1.0000000000000002220446049250313080847263336181640625]");
-%!assert (intervaltotext (infsup (1 + eps), "exact hexadecimal"), "[0X1.0000000000001P+0]");
+%!assert (intervaltotext (infsup (1 + eps), "exact hexadecimal"), "[0x1.0000000000001p+0]");
%!test
%! output_precision (3, 'local');
%! assert (intervaltotext (infsup (pi), "auto"), "[3.14, 3.15]");
%! output_precision (4, 'local');
%! assert (intervaltotext (infsup (pi), "auto"), "[3.141, 3.142]");
-%!test "from the documentation string";
-%! assert (intervaltotext (infsup (1 + eps)), "[1.0000000000000002, 1.000000000000001]");
-%! assert (intervaltotext (nextout (infsup (1 + eps))), "[1, 1.0000000000000005]");
-%! assert (intervaltotext (infsup (1)), "[1]");
+%!# from the documentation string
+%!assert (intervaltotext (infsup (1 + eps)), "[1.0000000000000002, 1.000000000000001]");
+%!assert (intervaltotext (nextout (infsup (1 + eps))), "[1, 1.0000000000000005]");
+%!assert (intervaltotext (infsup (1)), "[1]");
diff --git a/inst/@infsup/inv.m b/inst/@infsup/inv.m
index 8a2d49a..78acc7a 100644
--- a/inst/@infsup/inv.m
+++ b/inst/@infsup/inv.m
@@ -59,12 +59,13 @@ result = mldivide (x, eye (n));
endfunction
-%!test "from the wiki";
+%!# from the wiki
+%!test
%! A = infsup ([1, 2, 3; 4, 0, 0; 0, 0, 1]);
%! A (2, 3) = "[0, 6]";
%! B = inv (A);
%! assert (inf (B) == [0, .25, -1.5; .5, -.125, -1.5; 0, 0, 1]);
%! assert (sup (B) == [0, .25, 0; .5, -.125, -.75; 0, 0, 1]);
-%!test "from the documentation string";
-%! assert (inv (infsup ([2, 1, 1; 0, 1, 0; 1, 0, 0])) == [0, 0, 1; 0, 1, 0; 1, -1, -2]);
-%! assert (inv (infsup ([1, 2, 3; 4, 0, 6; 0, 0, 1])) == [0, .25, -1.5; .5, -.125, -.75; 0, 0, 1]);
+%!# from the documentation string
+%!assert (inv (infsup ([2, 1, 1; 0, 1, 0; 1, 0, 0])) == [0, 0, 1; 0, 1, 0; 1, -1, -2]);
+%!assert (inv (infsup ([1, 2, 3; 4, 0, 6; 0, 0, 1])) == [0, .25, -1.5; .5, -.125, -.75; 0, 0, 1]);
diff --git a/inst/@infsup/iscommoninterval.m b/inst/@infsup/iscommoninterval.m
index 4ed5c08..4c2cdc9 100644
--- a/inst/@infsup/iscommoninterval.m
+++ b/inst/@infsup/iscommoninterval.m
@@ -40,7 +40,8 @@ if (nargin ~= 1)
endif
result = isfinite (x.inf) & isfinite (x.sup);
-return
+
+endfunction
%!assert (iscommoninterval (infsup (2, 3)));
%!assert (not (iscommoninterval (infsup (2, inf))));
diff --git a/inst/@infsup/isempty.m b/inst/@infsup/isempty.m
index ee16b8c..6d9b9bb 100644
--- a/inst/@infsup/isempty.m
+++ b/inst/@infsup/isempty.m
@@ -31,15 +31,16 @@
## Keywords: interval
## Created: 2014-09-27
-function result = isempty (interval)
+function result = isempty (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = (interval.inf > interval.sup);
-return
+result = (x.inf > x.sup);
-%!assert (isempty (infsup (inf, -inf)));
+endfunction
+
+%!assert (isempty (infsup ()));
%!assert (not (isempty (infsup (1, 2))));
diff --git a/inst/@infsup/isentire.m b/inst/@infsup/isentire.m
index 0a3c829..c1b9ef4 100644
--- a/inst/@infsup/isentire.m
+++ b/inst/@infsup/isentire.m
@@ -28,14 +28,14 @@
## Keywords: interval
## Created: 2014-09-27
-function result = isentire (interval)
+function result = isentire (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = (interval.inf == -inf & interval.sup == inf);
+result = (x.inf == -inf & x.sup == inf);
endfunction
diff --git a/inst/@infsup/ldivide.m b/inst/@infsup/ldivide.m
index a1e7599..6842b5d 100644
--- a/inst/@infsup/ldivide.m
+++ b/inst/@infsup/ldivide.m
@@ -48,5 +48,5 @@ result = rdivide (y, x);
endfunction
-%!test "from the documentation string";
-%! assert (ldivide (infsup (2, 3), infsup (1, 2)) == "[1/3, 1]");
+%!# from the documentation string
+%!assert (ldivide (infsup (2, 3), infsup (1, 2)) == "[1/3, 1]");
diff --git a/inst/@infsup/linspace.m b/inst/@infsup/linspace.m
index a75d114..a2bdbc3 100644
--- a/inst/@infsup/linspace.m
+++ b/inst/@infsup/linspace.m
@@ -46,7 +46,7 @@
## Keywords: interval
## Created: 2015-07-19
-function result = linspace (base, limit, n)
+function base = linspace (base, limit, n)
if (nargin < 2 || nargin > 3)
print_usage ();
@@ -69,8 +69,17 @@ empty = vec (isempty (base) | isempty (limit));
l(empty, :) = inf;
u(empty, :) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+base.inf = l;
+base.sup = u;
endfunction
-%!xtest assert (isequal (linspace (infsup (0), infsup (10), 9), infsup (linspace (0, 10, 9))));
+%!assert (isequal (linspace (infsup (0), infsup (10), 9), infsup (linspace (0, 10, 9))));
+
+%!# correct use of signed zeros
+%!test
+%! x = linspace (infsup (0), infsup (0));
+%! assert (all (signbit (inf (x))));
+%! assert (all (not (signbit (sup (x)))));
diff --git a/inst/@infsup/log.m b/inst/@infsup/log.m
index f01a4fa..d4bf449 100644
--- a/inst/@infsup/log.m
+++ b/inst/@infsup/log.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = log (x)
+function x = log (x)
if (nargin ~= 1)
print_usage ();
@@ -49,12 +49,20 @@ x = intersect (x, infsup (0, inf));
l = mpfr_function_d ('log', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('log', +inf, x.sup); # ... this does not
-l (x.sup == 0) = inf;
-u (isempty (x) | x.sup == 0) = -inf;
+l(x.sup == 0) = inf;
+l(l == 0) = -0;
+u(isempty (x) | x.sup == 0) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (log (infsup (2)) == "[0x1.62E42FEFA39EFp-1, 0x1.62E42FEFA39Fp-1]");
+%!# from the documentation string
+%!assert (log (infsup (2)) == "[0x1.62E42FEFA39EFp-1, 0x1.62E42FEFA39Fp-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = log (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/log10.m b/inst/@infsup/log10.m
index 907af35..c2a2ab5 100644
--- a/inst/@infsup/log10.m
+++ b/inst/@infsup/log10.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = log10 (x)
+function x = log10 (x)
if (nargin ~= 1)
print_usage ();
@@ -49,12 +49,20 @@ x = intersect (x, infsup (0, inf));
l = mpfr_function_d ('log10', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('log10', +inf, x.sup); # ... this does not
-l (x.sup == 0) = inf;
-u (isempty (x) | x.sup == 0) = -inf;
+l(x.sup == 0) = inf;
+l(l == 0) = -0;
+u(isempty (x) | x.sup == 0) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (log10 (infsup (2)) == "[0x1.34413509F79FEp-2, 0x1.34413509F79FFp-2]");
+%!# from the documentation string
+%!assert (log10 (infsup (2)) == "[0x1.34413509F79FEp-2, 0x1.34413509F79FFp-2]");
+
+%!# correct use of signed zeros
+%!test
+%! x = log10 (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/log1p.m b/inst/@infsup/log1p.m
index 6402c4f..f278f28 100644
--- a/inst/@infsup/log1p.m
+++ b/inst/@infsup/log1p.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2015-02-20
-function result = log1p (x)
+function x = log1p (x)
if (nargin ~= 1)
print_usage ();
@@ -49,12 +49,20 @@ x = intersect (x, infsup (-1, inf));
l = mpfr_function_d ('log1p', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('log1p', +inf, x.sup); # ... this does not
-l (x.sup == -1) = inf;
-u (isempty (x) | x.sup == -1) = -inf;
+l(x.sup == -1) = inf;
+l(l == 0) = -0;
+u(isempty (x) | x.sup == -1) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (log1p (infsup (eps)) == "[0x1.FFFFFFFFFFFFFp-53, 0x1p-52]");
+%!# from the documentation string
+%!assert (log1p (infsup (eps)) == "[0x1.FFFFFFFFFFFFFp-53, 0x1p-52]");
+
+%!# correct use of signed zeros
+%!test
+%! x = log1p (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/log2.m b/inst/@infsup/log2.m
index 5f595fa..59e553a 100644
--- a/inst/@infsup/log2.m
+++ b/inst/@infsup/log2.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = log2 (x)
+function x = log2 (x)
if (nargin ~= 1)
print_usage ();
@@ -49,12 +49,20 @@ x = intersect (x, infsup (0, inf));
l = mpfr_function_d ('log2', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('log2', +inf, x.sup); # ... this does not
-l (x.sup == 0) = inf;
-u (isempty (x) | x.sup == 0) = -inf;
+l(x.sup == 0) = inf;
+l(l == 0) = -0;
+u(isempty (x) | x.sup == 0) = -inf;
-result = infsup (l, u);
+x.sup = u;
+x.inf = l;
endfunction
-%!test "from the documentation string";
-%! assert (log2 (infsup (2)) == 1);
+%!# from the documentation string
+%!assert (log2 (infsup (2)) == 1);
+
+%!# correct use of signed zeros
+%!test
+%! x = log2 (infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/lu.m b/inst/@infsup/lu.m
index 31ba12a..081b4ea 100644
--- a/inst/@infsup/lu.m
+++ b/inst/@infsup/lu.m
@@ -20,12 +20,14 @@
##
## Compute the LU decomposition of @var{A}.
##
-## @var{A} will be a subset of @var{L} * @var{U}.
+## @var{A} will be a subset of @var{L} * @var{U} with lower triangular matrix
+## @var{L} and upper triangular matrix @var{U}.
##
## The result is returned in a permuted form, according to the optional return
## value @var{P}.
##
## Accuracy: The result is a valid enclosure.
+## @seealso{@@infsup/qr, @@infsup/chol}
## @end deftypemethod
## Author: Oliver Heimlich
@@ -49,7 +51,7 @@ if (isscalar (x))
endif
## x must be square
-assert (size (x.inf, 1) == size (x.inf, 2), ...
+assert (issquare (x.inf), ...
"operator \: nonconformant arguments, X is not square");
n = rows (x.inf);
@@ -71,22 +73,22 @@ else
## Choose next pivot in one of the columns with the fewest mig (U) > 0.
columnrating = sum (migU > 0, 1);
## Don't choose used columns
- columnrating (max (migU, [], 1) == inf) = inf;
+ columnrating(max (migU, [], 1) == inf) = inf;
## Use first possible column
possiblecolumns = columnrating == min (columnrating);
column = find (possiblecolumns, 1);
- if (columnrating (column) >= 1)
+ if (columnrating(column) >= 1)
## Greedy: Use only intervals that do not contain zero.
- possiblerows = migU (:, column) > 0;
+ possiblerows = migU(:, column) > 0;
else
## Only intervals left which contain zero. Try to use an interval
## that additionally contains other numbers.
- possiblerows = migU (:, column) >= 0 & magU (:, column) > 0;
+ possiblerows = migU(:, column) >= 0 & magU(:, column) > 0;
if (not (max (possiblerows)))
## All possible intervals contain only zero.
- possiblerows = migU (:, column) >= 0;
+ possiblerows = migU(:, column) >= 0;
endif
endif
@@ -102,21 +104,21 @@ else
## We weight the rating in the columns with few mig (U) > 0 in
## order to prevent problems during the choice of pivots in the
## near future.
- rowrating += 0.5 * sum (migU (:, possiblecolumns) > 0, 2);
+ rowrating += 0.5 * sum (migU(:, possiblecolumns) > 0, 2);
rowrating (not (possiblerows)) = inf;
row = find (rowrating == min (rowrating), 1);
endif
# assert (0 <= migU (row, column) && migU (row, column) < inf);
- P (row, column) = 1;
+ P(row, column) = 1;
## In mig (U), for the choice of further pivots:
## - mark used columns with inf
## - mark used rows in unused columns with -inf
- migU (row, :) -= inf;
- migU (isnan (migU)) = inf;
- migU (:, column) = inf;
+ migU(row, :) -= inf;
+ migU(isnan (migU)) = inf;
+ migU(:, column) = inf;
endfor
endif
@@ -161,9 +163,9 @@ function B = permute (P, A)
B = A;
for i = 1 : rows (P)
- targetrow = find (P (i, :) == 1, 1);
- B.inf (targetrow, :) = A.inf (i, :);
- B.sup (targetrow, :) = A.sup (i, :);
+ targetrow = find (P(i, :) == 1, 1);
+ B.inf(targetrow, :) = A.inf(i, :);
+ B.sup(targetrow, :) = A.sup(i, :);
endfor
endfunction
@@ -172,8 +174,9 @@ endfunction
%! assert (l == infsup ({1, 0, 0; .375, 1, 0; .5, "68/37", 1}));, ...
%! assert (subset (u, infsup ({8, 1, 6; 0, 4.625, 4.75; 0, 0, "-0x1.3759F2298375Bp3"}, ...
%! {8, 1, 6; 0, 4.625, 4.75; 0, 0, "-0x1.3759F22983759p3"})));
+%!test
%! A = magic (3);
-%! A ([1, 5, 9]) = 0;
+%! A([1, 5, 9]) = 0;
%! [l, u, p] = lu (infsup (A));
%! assert (p, [0, 0, 1; 1, 0, 0; 0, 1, 0]);
%! assert (l == infsup ({1, 0, 0; "4/3", 1, 0; 0, "1/9", 1}));
diff --git a/inst/@infsup/mag.m b/inst/@infsup/mag.m
index eb30241..6a17c03 100644
--- a/inst/@infsup/mag.m
+++ b/inst/@infsup/mag.m
@@ -45,7 +45,7 @@ if (nargin ~= 1)
endif
result = max (abs (x.inf), abs (x.sup));
-result (isempty (x)) = nan ();
+result(isempty (x)) = nan ();
endfunction
diff --git a/inst/@infsup/max.m b/inst/@infsup/max.m
index 265ec03..a7fff82 100644
--- a/inst/@infsup/max.m
+++ b/inst/@infsup/max.m
@@ -48,7 +48,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = max (x, y, dim)
+function x = max (x, y, dim)
if (not (isa (x, "infsup")))
x = infsup (x);
@@ -58,29 +58,30 @@ switch (nargin)
case 1
l = max (x.inf);
u = max (x.sup);
- u (any (isempty (x))) = -inf;
+ u(any (isempty (x))) = -inf;
case 2
if (not (isa (y, "infsup")))
y = infsup (y);
endif
l = max (x.inf, y.inf);
u = max (x.sup, y.sup);
- u (isempty (x) | isempty (y)) = -inf;
+ u(isempty (x) | isempty (y)) = -inf;
case 3
if (not (builtin ("isempty", y)))
warning ("max: second argument is ignored");
endif
l = max (x.inf, [], dim);
u = max (x.sup, [], dim);
- u (any (isempty (x), dim)) = -inf;
+ u(any (isempty (x), dim)) = -inf;
otherwise
print_usage ();
return
endswitch
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (max (infsup (2, 3), infsup (1, 2)) == infsup (2, 3));
+%!# from the documentation string
+%!assert (max (infsup (2, 3), infsup (1, 2)) == infsup (2, 3));
diff --git a/inst/@infsup/meshgrid.m b/inst/@infsup/meshgrid.m
index b9035fe..58b3a62 100644
--- a/inst/@infsup/meshgrid.m
+++ b/inst/@infsup/meshgrid.m
@@ -77,7 +77,7 @@ endswitch
if (nargout >= 3 || nargin >= 3)
## Reshape 3 dimensions into 2 dimensions
- f = @(A) reshape (A, [size(A,1), prod(size (A)(2 : end))]);
+ f = @(A) reshape (A, [size(A, 1), prod(size (A)(2 : end))]);
lxx = f (lxx);
uxx = f (uxx);
lyy = f (lyy);
@@ -85,15 +85,21 @@ if (nargout >= 3 || nargin >= 3)
lzz = f (lzz);
uzz = f (uzz);
endif
-xx = infsup (lxx, uxx);
-yy = infsup (lyy, uyy);
+
+xx = yy = x;
+xx.inf = lxx;
+xx.sup = uxx;
+yy.inf = lyy;
+yy.sup = uyy;
if (nargout >= 3)
- zz = infsup (lzz, uzz);
+ zz = x;
+ zz.inf = lzz;
+ zz.sup = uzz;
endif
endfunction
-%!xtest assert (isequal (meshgrid (infsup (0 : 3)), infsup (meshgrid (0 : 3))));
+%!assert (isequal (meshgrid (infsup (0 : 3)), infsup (meshgrid (0 : 3))));
%!demo
%! clf
diff --git a/inst/@infsup/mid.m b/inst/@infsup/mid.m
index 06d49b0..52aa774 100644
--- a/inst/@infsup/mid.m
+++ b/inst/@infsup/mid.m
@@ -57,13 +57,13 @@ l = mpfr_function_d ('rdivide', -inf, x.inf, 2);
u = mpfr_function_d ('rdivide', +inf, x.sup, 2);
result = l + u;
-result (x.inf == -inf) = -realmax ();
-result (x.sup == inf) = realmax ();
-result (isentire (x)) = 0;
-result (isempty (x)) = nan ();
+result(x.inf == -inf) = -realmax ();
+result(x.sup == inf) = realmax ();
+result(isentire (x)) = 0;
+result(isempty (x)) = nan ();
endfunction
%!assert (mid (infsup (-inf, inf)), 0);
-%!test "from the documentation string";
-%! assert (mid (infsup (2.5, 3.5)), 3);
+%!# from the documentation string
+%!assert (mid (infsup (2.5, 3.5)), 3);
diff --git a/inst/@infsup/mig.m b/inst/@infsup/mig.m
index 996c89a..d4a0c9c 100644
--- a/inst/@infsup/mig.m
+++ b/inst/@infsup/mig.m
@@ -45,8 +45,8 @@ if (nargin ~= 1)
endif
result = min (abs (x.inf), abs (x.sup));
-result (sign (x.inf) ~= sign (x.sup)) = 0;
-result (isempty (x)) = nan ();
+result(sign (x.inf) ~= sign (x.sup)) = 0;
+result(isempty (x)) = nan ();
endfunction
diff --git a/inst/@infsup/min.m b/inst/@infsup/min.m
index 506920a..f83a86e 100644
--- a/inst/@infsup/min.m
+++ b/inst/@infsup/min.m
@@ -48,7 +48,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = min (x, y, dim)
+function x = min (x, y, dim)
if (not (isa (x, "infsup")))
x = infsup (x);
@@ -58,29 +58,30 @@ switch (nargin)
case 1
l = min (x.inf);
u = min (x.sup);
- l (any (isempty (x))) = inf;
+ l(any (isempty (x))) = inf;
case 2
if (not (isa (y, "infsup")))
y = infsup (y);
endif
l = min (x.inf, y.inf);
u = min (x.sup, y.sup);
- l (isempty (x) | isempty (y)) = inf;
+ l(isempty (x) | isempty (y)) = inf;
case 3
if (not (builtin ("isempty", y)))
warning ("min: second argument is ignored");
endif
l = min (x.inf, [], dim);
u = min (x.sup, [], dim);
- l (any (isempty (x), dim)) = inf;
+ l(any (isempty (x), dim)) = inf;
otherwise
print_usage ();
return
endswitch
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (min (infsup (2, 3), infsup (1, 2)) == infsup (1, 2));
+%!# from the documentation string
+%!assert (min (infsup (2, 3), infsup (1, 2)) == infsup (1, 2));
diff --git a/inst/@infsup/mince.m b/inst/@infsup/mince.m
index 8f0bb36..952f74d 100644
--- a/inst/@infsup/mince.m
+++ b/inst/@infsup/mince.m
@@ -44,7 +44,7 @@
## Keywords: interval
## Created: 2015-07-19
-function result = mince (x, n)
+function x = mince (x, n)
if (nargin > 2)
print_usage ();
@@ -65,15 +65,16 @@ idx.subs = {isfinite(x.sup)};
limit = subsasgn (limit, idx, infsup (subsref (x.sup, idx)));
boundaries = linspace (base, limit, n + 1);
-l = boundaries.inf (:, 1 : end - 1);
-u = boundaries.sup (:, 2 : end);
+l = boundaries.inf(:, 1 : end - 1);
+u = boundaries.sup(:, 2 : end);
empty = vec (isempty (x));
l(empty, :) = inf;
u(empty, :) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!xtest assert (isequal (mince (infsup (0, 10), 10), infsup (0 : 9, 1 : 10)));
+%!assert (isequal (mince (infsup (0, 10), 10), infsup (0 : 9, 1 : 10)));
diff --git a/inst/@infsup/minus.m b/inst/@infsup/minus.m
index 1bcca81..36b4c59 100644
--- a/inst/@infsup/minus.m
+++ b/inst/@infsup/minus.m
@@ -37,7 +37,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = minus (x, y)
+function x = minus (x, y)
if (nargin ~= 2)
print_usage ();
@@ -58,12 +58,21 @@ l = mpfr_function_d ('minus', -inf, x.inf, y.sup);
u = mpfr_function_d ('minus', +inf, x.sup, y.inf);
emptyresult = isempty (x) | isempty (y);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (infsup (2, 3) - infsup (1, 2) == infsup (0, 2));
+%!# from the documentation string
+%!assert (infsup (2, 3) - infsup (1, 2) == infsup (0, 2));
+
+%!# correct use of signed zeros
+%!test
+%! x = minus (infsup (0), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/mldivide.m b/inst/@infsup/mldivide.m
index 563f5fc..f7e64cb 100644
--- a/inst/@infsup/mldivide.m
+++ b/inst/@infsup/mldivide.m
@@ -289,10 +289,10 @@ function [x, verified] = verify_and_refine (x0, C, cfg, accuracy)
endif
endfunction
-%!test "unique solution";
-%! assert (infsup ([1, 0; 0, 2]) \ [2, 0; 0, 4] == [2, 0; 0 2]);
-%!test "no solution";
-%! assert (all (isempty (infsup ([1, 0; 2, 0]) \ [3; 0])));
-%!test "many solutions";
-%! assert (infsup ([1, 0; 2, 0]) \ [4; 8] == infsup ([4; -inf], [4; inf]));
+%!# unique solution
+%!assert (infsup ([1, 0; 0, 2]) \ [2, 0; 0, 4] == [2, 0; 0 2]);
+%!# no solution
+%!assert (all (isempty (infsup ([1, 0; 2, 0]) \ [3; 0])));
+%!# many solutions
+%!assert (infsup ([1, 0; 2, 0]) \ [4; 8] == infsup ([4; -inf], [4; inf]));
%!assert (all (subset (infsup ([2, -1; -1, 2], [4, 1; 1, 4]) \ infsup ([-3; .8], [3; .8]), infsup ([-2.3; -1.1], [2.3; 1.6]))));
diff --git a/inst/@infsup/mpower.m b/inst/@infsup/mpower.m
index 0534be0..aa69057 100644
--- a/inst/@infsup/mpower.m
+++ b/inst/@infsup/mpower.m
@@ -83,7 +83,7 @@ while (y ~= 0)
y /= 2;
else # y is odd
result = mtimes (result, x);
- if (all (all (isempty (result))) || all (all (isentire (result))))
+ if (all (vec (isempty (result))) || all (vec (isentire (result))))
## We can stop the computation here, this is a fixed point
break
endif
@@ -103,5 +103,11 @@ endwhile
endfunction
-%!xtest "from the documentation string";
-%! assert (isequal (infsup (magic (3)) ^ 2, infsup (magic (3) ^ 2)));
+%!# from the documentation string
+%!assert (isequal (infsup (magic (3)) ^ 2, infsup (magic (3) ^ 2)));
+
+%!# correct use of signed zeros
+%!test
+%! x = mpower (infsup (eye (2)), 2);
+%! assert (signbit (inf (x(1, 2))));
+%! assert (not (signbit (sup (x(1, 2)))));
diff --git a/inst/@infsup/mrdivide.m b/inst/@infsup/mrdivide.m
index 0b5f441..a3c8c2a 100644
--- a/inst/@infsup/mrdivide.m
+++ b/inst/@infsup/mrdivide.m
@@ -67,5 +67,5 @@ result = mldivide (y', x')';
endfunction
-%!test "from the documentation string";
-%! assert (infsup ([1, 2; 3, 4]) / [3, 4; 1, 2] == infsup ([0, 1; 1, 0]));
+%!# from the documentation string
+%!assert (infsup ([1, 2; 3, 4]) / [3, 4; 1, 2] == infsup ([0, 1; 1, 0]));
diff --git a/inst/@infsup/mtimes.m b/inst/@infsup/mtimes.m
index ea2defc..59f4883 100644
--- a/inst/@infsup/mtimes.m
+++ b/inst/@infsup/mtimes.m
@@ -73,7 +73,7 @@ if (size (x.inf, 2) ~= size (y.inf, 1))
"operator *: nonconformant arguments");
endif
-if (nargin == 3)
+if (nargin >= 3)
switch (accuracy)
case "valid"
## Fast matrix multiplication uses rounding mode switches, which
@@ -155,7 +155,7 @@ end_try_catch
endfunction
-%!test "from the documentation string";
-%! assert (infsup ([1, 2; 7, 15], [2, 2; 7.5, 15]) * infsup ([3, 3; 0, 1], [3, 3.25; 0, 2]) == infsup ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375]));
-%!test "matrix multiplication using BLAS routines";
-%! assert (mtimes (infsup ([1, 2; 7, 15], [2, 2; 7.5, 15]), infsup ([3, 3; 0, 1], [3, 3.25; 0, 2]), 'valid') == infsup ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375]));
+%!# from the documentation string
+%!assert (infsup ([1, 2; 7, 15], [2, 2; 7.5, 15]) * infsup ([3, 3; 0, 1], [3, 3.25; 0, 2]) == infsup ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375]));
+%!# matrix multiplication using BLAS routines
+%!assert (mtimes (infsup ([1, 2; 7, 15], [2, 2; 7.5, 15]), infsup ([3, 3; 0, 1], [3, 3.25; 0, 2]), 'valid') == infsup ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375]));
diff --git a/inst/@infsup/mulrev.m b/inst/@infsup/mulrev.m
index 22691d7..43e92b2 100644
--- a/inst/@infsup/mulrev.m
+++ b/inst/@infsup/mulrev.m
@@ -73,19 +73,14 @@ if (not (isa (x, "infsup")))
endif
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (b.inf) ~= rows (c.inf))
- b.inf = ones (rows (c.inf), columns (b.inf)) .* b.inf;
- b.sup = ones (rows (c.inf), columns (b.inf)) .* b.sup;
- c.inf = ones (rows (b.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (b.inf), columns (c.inf)) .* c.sup;
-endif
-if (columns (b.inf) ~= columns (c.inf))
- b.inf = ones (rows (b.inf), columns (c.inf)) .* b.inf;
- b.sup = ones (rows (b.inf), columns (c.inf)) .* b.sup;
- c.inf = ones (rows (c.inf), columns (b.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (b.inf)) .* c.sup;
+if (not (size_equal (b.inf, c.inf)))
+ b.inf = ones (size (c.inf)) .* b.inf;
+ b.sup = ones (size (c.inf)) .* b.sup;
+ c.inf = ones (size (b.inf)) .* c.inf;
+ c.sup = ones (size (b.inf)) .* c.sup;
endif
+u = v = x;
u.inf = v.inf = inf (size (b.inf));
u.sup = v.sup = -inf (size (b.inf));
@@ -95,107 +90,114 @@ twocomponents = b.inf < 0 & b.sup > 0 & not (emptyresult) & ...
(c.sup < 0 | c.inf > 0);
onecomponent = not (twocomponents) & not (emptyresult);
-u.inf (twocomponents) = -inf;
-v.sup (twocomponents) = inf;
+u.inf(twocomponents) = -inf;
+v.sup(twocomponents) = inf;
dom = twocomponents & c.inf <= 0 & c.sup >= 0;
-u.sup (dom) = v.inf (dom) = 0;
+u.sup(dom) = v.inf(dom) = 0;
dom = twocomponents & c.inf > 0;
if (not (isempty (dom)))
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.inf (dom), b.inf (dom));
- v.inf (dom) = mpfr_function_d ('rdivide', -inf, c.inf (dom), b.sup (dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.inf(dom), b.inf(dom));
+ v.inf(dom) = mpfr_function_d ('rdivide', -inf, c.inf(dom), b.sup(dom));
endif
dom = twocomponents & c.sup < 0;
if (not (isempty (dom)))
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.sup (dom), b.sup (dom));
- v.inf (dom) = mpfr_function_d ('rdivide', -inf, c.sup (dom), b.inf (dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.sup(dom), b.sup(dom));
+ v.inf(dom) = mpfr_function_d ('rdivide', -inf, c.sup(dom), b.inf(dom));
endif
dom = onecomponent & b.inf >= 0 & c.inf >= 0;
if (not (isempty (dom)))
- b.inf (dom & b.inf == 0) = +0;
- c.inf (dom & c.inf == 0) = +0;
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.inf (dom), b.sup (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.sup (dom), b.inf (dom));
+ b.inf(dom & b.inf == 0) = +0;
+ c.inf(dom & c.inf == 0) = +0;
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.inf(dom), b.sup(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.sup(dom), b.inf(dom));
endif
dom = onecomponent & b.sup <= 0 & c.inf >= 0;
if (not (isempty (dom)))
- b.sup (dom & b.sup == 0) = -0;
- c.inf (dom & c.inf == 0) = +0;
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.sup (dom), b.sup (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.inf (dom), b.inf (dom));
+ b.sup(dom & b.sup == 0) = -0;
+ c.inf(dom & c.inf == 0) = +0;
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.sup(dom), b.sup(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.inf(dom), b.inf(dom));
endif
dom = onecomponent & b.inf >= 0 & c.sup <= 0;
if (not (isempty (dom)))
- b.inf (dom & b.inf == 0) = +0;
- c.sup (dom & c.sup == 0) = -0;
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.inf (dom), b.inf (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.sup (dom), b.sup (dom));
+ b.inf(dom & b.inf == 0) = +0;
+ c.sup(dom & c.sup == 0) = -0;
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.inf(dom), b.inf(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.sup(dom), b.sup(dom));
endif
dom = onecomponent & b.sup <= 0 & c.sup <= 0;
if (not (isempty (dom)))
- b.sup (dom & b.sup == 0) = -0;
- c.sup (dom & c.sup == 0) = -0;
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.sup (dom), b.inf (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.inf (dom), b.sup (dom));
+ b.sup(dom & b.sup == 0) = -0;
+ c.sup(dom & c.sup == 0) = -0;
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.sup(dom), b.inf(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.inf(dom), b.sup(dom));
endif
dom = onecomponent & c.inf < 0 & c.sup > 0 & b.inf > 0;
if (not (isempty (dom)))
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.inf (dom), b.inf (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.sup (dom), b.inf (dom));
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.inf(dom), b.inf(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.sup(dom), b.inf(dom));
endif
dom = onecomponent & c.inf < 0 & c.sup > 0 & b.sup < 0;
if (not (isempty (dom)))
- u.inf (dom) = mpfr_function_d ('rdivide', -inf, c.sup (dom), b.sup (dom));
- u.sup (dom) = mpfr_function_d ('rdivide', +inf, c.inf (dom), b.sup (dom));
+ u.inf(dom) = mpfr_function_d ('rdivide', -inf, c.sup(dom), b.sup(dom));
+ u.sup(dom) = mpfr_function_d ('rdivide', +inf, c.inf(dom), b.sup(dom));
endif
dom = onecomponent & b.inf <= 0 & b.sup >= 0 & c.inf <= 0 & c.sup >= 0;
# x * 0 == 0
-u.inf (dom) = -inf;
-u.sup (dom) = inf;
+u.inf(dom) = -inf;
+u.sup(dom) = inf;
+
+u.inf(u.inf == 0) = -0;
+u.sup(u.sup == 0) = +0;
+v.inf(v.inf == 0) = -0;
+v.sup(v.sup == 0) = +0;
-## Intersect u and v with x (don't do this with infsup objects, for performance
-## reasons).
+## Intersect u and v with x
u.inf = max (u.inf, x.inf);
u.sup = min (u.sup, x.sup);
v.inf = max (v.inf, x.inf);
v.sup = min (v.sup, x.sup);
if (nargout < 2)
- u.inf (twocomponents) = min (u.inf (twocomponents), v.inf (twocomponents));
- u.sup (twocomponents) = max (u.sup (twocomponents), v.sup (twocomponents));
+ u.inf(twocomponents) = min (u.inf(twocomponents), v.inf(twocomponents));
+ u.sup(twocomponents) = max (u.sup(twocomponents), v.sup(twocomponents));
emptyresult = u.inf > u.sup;
- u.inf (emptyresult) = inf;
- u.sup (emptyresult) = -inf;
- u = infsup (u.inf, u.sup);
+ u.inf(emptyresult) = inf;
+ u.sup(emptyresult) = -inf;
else
empty_u = u.inf > u.sup;
- u.inf (empty_u) = inf;
- u.sup (empty_u) = -inf;
- u = infsup (u.inf, u.sup);
+ u.inf(empty_u) = inf;
+ u.sup(empty_u) = -inf;
empty_v = v.inf > v.sup;
- v.inf (empty_v) = inf;
- v.sup (empty_v) = -inf;
- v = infsup (v.inf, v.sup);
+ v.inf(empty_v) = inf;
+ v.sup(empty_v) = -inf;
## It can happen that the twocomponents result has only one component,
## because x is positive for example. Then, only one component shall be
## returned
swap = twocomponents & isempty (u) & not (isempty (v));
[u.inf(swap), u.sup(swap), v.inf(swap), v.sup(swap)] = deal (...
- v.inf (swap), v.sup (swap), u.inf (swap), u.sup (swap));
+ v.inf(swap), v.sup(swap), u.inf(swap), u.sup(swap));
endif
endfunction
-%!test "IEEE Std 1788-2015 mulRevToPair examples";
+%!#IEEE Std 1788-2015 mulRevToPair examples
+%!test
%! [u, v] = mulrev (infsup (0), infsup (1, 2));
%! assert (isempty (u) & isempty (v));
+%!test
%! [u, v] = mulrev (infsup (0), infsup (0, 1));
%! assert (isentire (u) & isempty (v));
+%!test
%! [u, v] = mulrev (infsup (1), infsup (1, 2));
%! assert (eq (u, infsup (1, 2)) & isempty (v));
+%!test
%! [u, v] = mulrev (infsup (1, inf), infsup (1));
%! assert (eq (u, infsup (0, 1)) & isempty (v));
+%!test
%! [u, v] = mulrev (infsup (-1, 1), infsup (1, 2));
%! assert (eq (u, infsup (-inf, -1)) & eq (v, infsup (1, inf)));
+%!test
%! [u, v] = mulrev (infsup (-inf, inf), infsup (1));
%! assert (eq (u, infsup (-inf, 0)) & eq (v, infsup (0, inf)));
diff --git a/inst/@infsup/newdec.m b/inst/@infsup/newdec.m
index 03f7853..829cd6b 100644
--- a/inst/@infsup/newdec.m
+++ b/inst/@infsup/newdec.m
@@ -51,7 +51,8 @@ xd = infsupdec (x);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (newdec (infsup (2, 3)), infsupdec (2, 3)));
+%!# from the documentation string
+%!assert (isequal (newdec (infsup (2, 3)), infsupdec (2, 3)));
+
%!assert (isequal (newdec (infsupdec (2, 3)), infsupdec (2, 3)));
%!assert (isequal (newdec (infsupdec (1, "trv")), infsupdec (1, "trv")));
diff --git a/inst/@infsup/nextout.m b/inst/@infsup/nextout.m
index ceb0500..5fcffeb 100644
--- a/inst/@infsup/nextout.m
+++ b/inst/@infsup/nextout.m
@@ -34,22 +34,34 @@
## Keywords: interval
## Created: 2014-09-30
-function result = nextout (x)
+function x = nextout (x)
if (nargin ~= 1)
print_usage ();
return
endif
-delta = pow2 (-1074);
+persistent delta = pow2 (-1074);
l = mpfr_function_d ('minus', -inf, x.inf, delta);
u = mpfr_function_d ('plus', +inf, x.sup, delta);
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
+%!test
%! x = nextout (infsup (1));
%! assert (inf (x), 1 - eps / 2);
%! assert (sup (x), 1 + eps);
+
+%!# correct use of signed zeros
+%!test
+%! x = nextout (infsup (pow2 (-1074)));
+%! assert (signbit (inf (x)));
+%!test
+%! x = nextout (infsup (-pow2 (-1074)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/norm.m b/inst/@infsup/norm.m
index 914cf22..02dd095 100644
--- a/inst/@infsup/norm.m
+++ b/inst/@infsup/norm.m
@@ -88,13 +88,6 @@ if (nargin > 3 || not (isa (A, "infsup")))
return
endif
-if (isa (A, "infsupdec"))
- if (isnai (A))
- result = A;
- return
- endif
-endif
-
if (nargin < 2)
p = 2;
opt = "";
@@ -197,12 +190,15 @@ else
result = max (abs (A), [], dim);
case -inf
result = min (abs (A), [], dim);
- case "fro"
- result = sqrt (sumsq (abs (A), dim));
+ case {"fro", 2}
+ result = sqrt (sumsq (A, dim));
case 0
- result = infsup (sum (not (ismember (0, A)), dim), ...
- sum (0 != A, dim)) - ...
- sum (isempty (A), dim);
+ ## Hamming norm: the number of non-zero elements
+ result = sum (subsasgn (subsasgn (subsasgn (A, ...
+ substruct ("()", {ismember(0, A)}), "[0, 1]"), ...
+ substruct ("()", {A == 0}), 0), ...
+ substruct ("()", {A > 0 | A < 0}), 1), ...
+ dim);
otherwise
warning ("off", "interval:ImplicitPromote", "local");
result = (sum (abs (A) .^ p, dim)) .^ (1 ./ infsup (p));
@@ -211,8 +207,8 @@ endif
endfunction
-%!xtest
+%!test
%! A = infsup ("0 [Empty] [0, 1] 1");
-%! assert (isequal (norm (A, 0, "cols"), infsup ("0 0 [0, 1] 1")));
+%! assert (isequal (norm (A, 0, "cols"), infsup ("0 [Empty] [0, 1] 1")));
%!assert (norm (infsup (magic (3)), inf, 1) == 45);
%!assert (norm (infsup (-magic (3), magic (3)), inf, 1) == "[0, 45]");
diff --git a/inst/@infsup/nthroot.m b/inst/@infsup/nthroot.m
index 329138d..e091a0d 100644
--- a/inst/@infsup/nthroot.m
+++ b/inst/@infsup/nthroot.m
@@ -29,7 +29,7 @@
## Keywords: interval
## Created: 2015-02-20
-function result = nthroot (x, n)
+function x = nthroot (x, n)
if (nargin ~= 2)
print_usage ();
@@ -54,10 +54,13 @@ switch sign (n)
l = mpfr_function_d ('nthroot', -inf, x.inf, n);
u = mpfr_function_d ('nthroot', +inf, x.sup, n);
- l (emptyresult) = inf;
- u (emptyresult) = -inf;
+ l(emptyresult) = inf;
+ u(emptyresult) = -inf;
- result = infsup (l, u);
+ l(l == 0) = -0;
+
+ x.inf = l;
+ x.sup = u;
case -1
emptyresult = isempty (x) ...
@@ -68,54 +71,68 @@ switch sign (n)
u = inf (size (x.inf));
select = x.inf > 0 & isfinite (x.inf);
- if (any (any (select)))
- u (select) = invrootrounded (x.inf (select), -n, +inf);
+ if (any (select(:)))
+ u(select) = invrootrounded (x.inf(select), -n, +inf);
endif
select = x.sup > 0 & isfinite (x.sup);
- if (any (any (select)))
- l (select) = invrootrounded (x.sup (select), -n, -inf);
+ if (any (select(:)))
+ l(select) = invrootrounded (x.sup(select), -n, -inf);
endif
- l (emptyresult) = inf;
- u (emptyresult) = -inf;
+ l(emptyresult) = inf;
+ u(emptyresult) = -inf;
+
+ l(l == 0) = -0;
- result = infsup (l, u);
+ x.inf = l;
+ x.sup = u;
else # uneven
l = zeros (size (x.inf));
u = inf (size (x.inf));
select = x.inf > 0 & isfinite (x.inf);
- if (any (any (select)))
- u (select) = invrootrounded (x.inf (select), -n, +inf);
+ if (any (select(:)))
+ u(select) = invrootrounded (x.inf(select), -n, +inf);
endif
select = x.sup > 0 & isfinite (x.sup);
- if (any (any (select)))
- l (select) = invrootrounded (x.sup (select), -n, -inf);
+ if (any (select(:)))
+ l(select) = invrootrounded (x.sup(select), -n, -inf);
endif
notpositive = x.sup <= 0;
- l (emptyresult | notpositive) = inf;
- u (emptyresult | notpositive) = -inf;
+ l(emptyresult | notpositive) = inf;
+ u(emptyresult | notpositive) = -inf;
+
+ l(l == 0) = -0;
- result = infsup (l, u); # this is only the positive part
+ # this is only the positive part
+ pos = x;
+ pos.inf = l;
+ pos.sup = u;
l = zeros (size (x.inf));
u = inf (size (x.inf));
select = x.sup < 0 & isfinite (x.sup);
- if (any (any (select)))
- u (select) = invrootrounded (-x.sup (select), -n, +inf);
+ if (any (select(:)))
+ u(select) = invrootrounded (-x.sup(select), -n, +inf);
endif
select = x.inf < 0 & isfinite (x.inf);
- if (any (any (select)))
- l (select) = invrootrounded (-x.inf (select), -n, -inf);
+ if (any (select(:)))
+ l(select) = invrootrounded (-x.inf(select), -n, -inf);
endif
notnegative = x.inf >= 0;
- l (emptyresult | notnegative) = inf;
- u (emptyresult | notnegative) = -inf;
+ l(emptyresult | notnegative) = inf;
+ u(emptyresult | notnegative) = -inf;
- result = union (result, infsup (-u, -l));
+ u(u == 0) = +0;
+
+ neg = x;
+ neg.inf = -u;
+ neg.sup = -l;
+
+ x = union (pos, neg);
endif
otherwise
@@ -141,15 +158,15 @@ inv_n = 1 ./ infsup (n);
if (direction > 0)
x1 = z;
select = z > 1;
- x1 (select) = mpfr_function_d ('pow', direction, z (select), -inv_n.inf);
+ x1(select) = mpfr_function_d ('pow', direction, z(select), -inv_n.inf);
select = z < 1;
- x1 (select) = mpfr_function_d ('pow', direction, z (select), -inv_n.sup);
+ x1(select) = mpfr_function_d ('pow', direction, z(select), -inv_n.sup);
else
x1 = z;
select = z > 1;
- x1 (select) = mpfr_function_d ('pow', direction, z (select), -inv_n.sup);
+ x1(select) = mpfr_function_d ('pow', direction, z(select), -inv_n.sup);
select = z < 1;
- x1 (select) = mpfr_function_d ('pow', direction, z (select), -inv_n.inf);
+ x1(select) = mpfr_function_d ('pow', direction, z(select), -inv_n.inf);
endif
if (issingleton (inv_n))
@@ -173,3 +190,15 @@ endif
endfunction
%!assert (nthroot (infsup (25, 36), 2) == infsup (5, 6));
+
+%!# correct use of signed zeros
+%!test
+%! x = nthroot (infsup (0), 2);
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = nthroot (infsup (0, inf), -2);
+%! assert (signbit (inf (x)));
+%!test
+%! x = nthroot (infsup (0, inf), -3);
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/overlap.m b/inst/@infsup/overlap.m
index 0f94bf2..80552ce 100644
--- a/inst/@infsup/overlap.m
+++ b/inst/@infsup/overlap.m
@@ -108,19 +108,19 @@ comparison = {...
"after", (notempty & b.sup < a.inf)};
if (nargout >= 2)
- bitmask = zeros (size (comparison {1, 2}), "uint16");
+ bitmask = zeros (size (comparison{1, 2}), "uint16");
for i = 1 : rows (comparison)
- bitmask (comparison {i, 2}) = pow2 (16 - i);
+ bitmask(comparison{i, 2}) = pow2 (16 - i);
endfor
endif
-state = cell (size (comparison {1, 2}));
+state = cell (size (comparison{1, 2}));
for i = 1 : rows (comparison)
- state (comparison {i, 2}) = comparison {i, 1};
+ state(comparison{i, 2}) = comparison{i, 1};
endfor
if (numel (state) == 1)
- state = state {1};
+ state = state{1};
endif
endfunction
diff --git a/inst/@infsup/plot.m b/inst/@infsup/plot.m
index eb984a8..d1851eb 100644
--- a/inst/@infsup/plot.m
+++ b/inst/@infsup/plot.m
@@ -63,11 +63,6 @@ if (nargin >= 2 && not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x) || (nargin >= 2 && isnai (y)))
- error ("interval:NaI", "Cannot plot NaIs");
- return
-endif
-
if (nargin < 2)
y = x;
## x = 1 ... n
@@ -102,24 +97,24 @@ unwind_protect
lines = xor (issingleton (x), issingleton (y)) & not (empty);
boxes = not (points | lines | empty);
- if (any (any (points)))
- scatter (x.inf (points), y.inf (points), ...
+ if (any (points(:)))
+ scatter (x.inf(points), y.inf(points), ...
pointsize, ...
edgecolor, ...
'filled');
endif
- if (any (any (lines)))
- x_line = [vec(x.inf (lines)), vec(x.sup (lines))]';
- y_line = [vec(y.inf (lines)), vec(y.sup (lines))]';
- plot (x_line, y_line, ...
+ if (any (lines(:)))
+ x_line = [vec(x.inf(lines)), vec(x.sup(lines))]';
+ y_line = [vec(y.inf(lines)), vec(y.sup(lines))]';
+ line (x_line, y_line, ...
'color', edgecolor, ...
'linewidth', edgewidth);
endif
- if (any (any (boxes)))
- x_box = [vec(x.inf (boxes)), vec(x.sup (boxes))] (:, [1 2 2 1])';
- y_box = [vec(y.inf (boxes)), vec(y.sup (boxes))] (:, [1 1 2 2])';
+ if (any (boxes(:)))
+ x_box = [vec(x.inf(boxes)), vec(x.sup(boxes))](:, [1 2 2 1])';
+ y_box = [vec(y.inf(boxes)), vec(y.sup(boxes))](:, [1 1 2 2])';
if (nargin < 4)
edgecolor = 'none';
endif
@@ -138,7 +133,8 @@ end_unwind_protect
endfunction
-%!test "this test is rather pointless";
+%!# this test is rather pointless
+%!test
%! clf
%! plot (empty ());
%! close
diff --git a/inst/@infsup/plot3.m b/inst/@infsup/plot3.m
index f50f18b..ebd1a7d 100644
--- a/inst/@infsup/plot3.m
+++ b/inst/@infsup/plot3.m
@@ -63,15 +63,6 @@ if (not (isa (z, "infsupdec")))
z = infsupdec (z);
endif
-if (isnai (x) || isnai (y) || isnai (z))
- error ("interval:NaI", "Cannot plot3 NaIs");
- return
-else
- x = intervalpart (x);
- y = intervalpart (y);
- z = intervalpart (z);
-endif
-
if (nargin < 4 || isempty (color))
color = 'interp';
if (nargin < 5)
@@ -100,20 +91,20 @@ unwind_protect
lines = number_of_singletons == 2 & not (empty);
boxes = number_of_singletons <= 1 & not (empty);
- if (any (any (points)))
- scatter3 (x.inf (points), y.inf (points), z.inf (points), ...
+ if (any (points(:)))
+ scatter3 (x.inf(points), y.inf(points), z.inf(points), ...
pointsize, ...
edgecolor, ...
'filled');
endif
- if (any (any (lines)))
- x_line = [vec(x.inf (lines)), vec(x.sup (lines))]';
- y_line = [vec(y.inf (lines)), vec(y.sup (lines))]';
- z_line = [vec(z.inf (lines)), vec(z.sup (lines))]';
- plot3 (x_line, y_line, z_line, ...
- 'linewidth', edgewidth, ...
- 'color', edgecolor);
+ if (any (lines(:)))
+ x_line = [vec(x.inf(lines)), vec(x.sup(lines))]';
+ y_line = [vec(y.inf(lines)), vec(y.sup(lines))]';
+ z_line = [vec(z.inf(lines)), vec(z.sup(lines))]';
+ line (x_line, y_line, z_line, ...
+ 'linewidth', edgewidth, ...
+ 'color', edgecolor);
endif
## + z
@@ -133,71 +124,125 @@ unwind_protect
## The variables A through H help indexing the relevant rows in vertices.
[A, B, C, D, E, F, G, H] = num2cell ((0 : 7) * sum (sum (boxes))) {:};
- vertices = [vec(x.inf (boxes)), vec(y.inf (boxes)), vec(z.inf (boxes)); ...
- vec(x.inf (boxes)), vec(y.inf (boxes)), vec(z.sup (boxes)); ...
- vec(x.inf (boxes)), vec(y.sup (boxes)), vec(z.inf (boxes)); ...
- vec(x.inf (boxes)), vec(y.sup (boxes)), vec(z.sup (boxes)); ...
- vec(x.sup (boxes)), vec(y.inf (boxes)), vec(z.inf (boxes)); ...
- vec(x.sup (boxes)), vec(y.inf (boxes)), vec(z.sup (boxes)); ...
- vec(x.sup (boxes)), vec(y.sup (boxes)), vec(z.inf (boxes)); ...
- vec(x.sup (boxes)), vec(y.sup (boxes)), vec(z.sup (boxes))];
+ vertices = [vec(x.inf(boxes)), vec(y.inf(boxes)), vec(z.inf(boxes)); ...
+ vec(x.inf(boxes)), vec(y.inf(boxes)), vec(z.sup(boxes)); ...
+ vec(x.inf(boxes)), vec(y.sup(boxes)), vec(z.inf(boxes)); ...
+ vec(x.inf(boxes)), vec(y.sup(boxes)), vec(z.sup(boxes)); ...
+ vec(x.sup(boxes)), vec(y.inf(boxes)), vec(z.inf(boxes)); ...
+ vec(x.sup(boxes)), vec(y.inf(boxes)), vec(z.sup(boxes)); ...
+ vec(x.sup(boxes)), vec(y.sup(boxes)), vec(z.inf(boxes)); ...
+ vec(x.sup(boxes)), vec(y.sup(boxes)), vec(z.sup(boxes))];
- if (any (any (boxes)))
- faces = zeros (0, 4);
+ if (any (boxes(:)))
+ ## To support gnuplot as a plotting backend, we have to use
+ ## triangular instead of rectangular patches (see bug #45594).
+ faces = zeros (0, 3);
## x-y rectangle at z.inf
- select = vec (find (x.inf (boxes) < x.sup (boxes) & ...
- y.inf (boxes) < y.sup (boxes)));
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ y.inf(boxes) < y.sup(boxes)));
faces = [faces; ...
- A+select, C+select, G+select, E+select];
+ A+select, C+select, G+select; ...
+ G+select, E+select, A+select];
## x-z rectangle at y.inf
- select = vec (find (x.inf (boxes) < x.sup (boxes) & ...
- z.inf (boxes) < z.sup (boxes)));
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
faces = [faces; ...
- A+select, E+select, F+select, B+select];
+ A+select, E+select, F+select; ...
+ F+select, B+select, A+select];
## y-z rectangle at x.inf
- select = vec (find (y.inf (boxes) < y.sup (boxes) & ...
- z.inf (boxes) < z.sup (boxes)));
+ select = vec (find (y.inf(boxes) < y.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
faces = [faces; ...
- A+select, B+select, D+select, C+select];
+ A+select, B+select, D+select; ...
+ D+select, C+select, A+select];
## The cuboids have 6 sides instead of only one
- select = vec (find (x.inf (boxes) < x.sup (boxes) & ...
- y.inf (boxes) < y.sup (boxes) & ...
- z.inf (boxes) < z.sup (boxes)));
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ y.inf(boxes) < y.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
faces = [faces; ...
## x-y rectangle at z.sup
- B+select, F+select, H+select, D+select; ...
+ B+select, F+select, H+select; ...
+ H+select, D+select, B+select; ...
## x-z rectangle at y.sup
- C+select, D+select, H+select, G+select; ...
+ C+select, D+select, H+select;
+ H+select, G+select, C+select; ...
## y-z rectangle at x.inf
- E+select, G+select, H+select, F+select];
-
- if (nargin < 5)
- edgecolor = 'none';
- endif
-
- if (isempty (color))
- color = 'none';
- endif
-
+ E+select, G+select, H+select; ...
+ H+select, F+select, E+select];
+
patch ('Vertices', vertices, ...
'Faces', faces, ...
- 'EdgeColor', edgecolor, ...
- 'LineWidth', edgewidth, ...
+ 'EdgeColor', 'none', ...
'FaceColor', color, ...
'FaceVertexCData', vertices (:, 3));
+
+ ## Draw edges for the rectangles.
+ ##
+ ## B B--------D D
+ ## /| | | /|
+ ## / | | | / |
+ ## / A A--------C/ C or A--------C
+ ## F / F--------H H / / /
+ ## | / | | | / / /
+ ## |/ | | |/ / /
+ ## E E--------G G E--------G
+ ##
+ ## Note: The edges A-B, C-D, E-F, and G-H may be drawn twice.
+ ## However, the benefit is that this approach produces only closed
+ ## routes between the points, which is beneficial since it prevents
+ ## graphics artifacts from line endings. Line endings might be rendered
+ ## differently and we want to prevent that.
+ if (nargin >= 5)
+ faces = zeros (0, 4);
+ ## x-y rectangle at z.inf
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ y.inf(boxes) < y.sup(boxes) & ...
+ z.inf(boxes) == z.sup(boxes)));
+ faces = [faces; ...
+ A+select, C+select, G+select, E+select];
+ ## x-z rectangle at y.inf
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
+ faces = [faces; ...
+ A+select, E+select, F+select, B+select];
+ ## y-z rectangle at x.inf
+ select = vec (find (y.inf(boxes) < y.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
+ faces = [faces; ...
+ A+select, B+select, D+select, C+select];
+ ## The cuboids have 6 sides instead of only one.
+ ## It suffices to draw edges for 2 more sides (4 sides in total).
+ select = vec (find (x.inf(boxes) < x.sup(boxes) & ...
+ y.inf(boxes) < y.sup(boxes) & ...
+ z.inf(boxes) < z.sup(boxes)));
+ faces = [faces; ...
+ ## x-z rectangle at y.sup
+ C+select, D+select, H+select, G+select; ...
+ ## y-z rectangle at x.inf
+ E+select, G+select, H+select, F+select];
+
+ patch ('Vertices', vertices, ...
+ 'Faces', faces, ...
+ 'EdgeColor', edgecolor, ...
+ 'LineWidth', edgewidth, ...
+ 'FaceColor', 'none');
+ endif
endif
unwind_protect_cleanup
- ## Reset hold state
+ ## Reset hold state and set the viewpoint for 3-D graphs (the latter would
+ ## not happen automatically since above functions operate on 2-D objects).
if (not (oldhold))
hold off
+ view (3)
endif
end_unwind_protect
endfunction
-%!test "this test is rather pointless";
+%!# this test is rather pointless
+%!test
%! clf
%! plot3 (empty (), empty (), empty ());
%! close
@@ -207,7 +252,6 @@ endfunction
%! colormap hot
%! x = y = z = (1 : 3) + infsup ("[0, 1]");
%! plot3 (x, y, z);
-%! view (300, 30)
%! grid on
%!demo
@@ -216,7 +260,6 @@ endfunction
%! z = 1 : 8;
%! x = y = infsup ("[-1, 1]") ./ z;
%! plot3 (x, y, z);
-%! view (33, 24)
%! grid on
%!demo
@@ -233,5 +276,4 @@ endfunction
%! [x, y] = meshgrid (midrad (-10 : 0.5 : 10, .25));
%! z = sin (hypot (x, y)) .* hypot (x, y);
%! plot3 (mid (x), mid (y), z);
-%! view (33, 50)
%! grid on
diff --git a/inst/@infsup/plus.m b/inst/@infsup/plus.m
index 6de7386..7c55263 100644
--- a/inst/@infsup/plus.m
+++ b/inst/@infsup/plus.m
@@ -37,7 +37,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = plus (x, y)
+function x = plus (x, y)
if (nargin ~= 2)
print_usage ();
@@ -61,9 +61,18 @@ emptyresult = isempty (x) | isempty (y);
l (emptyresult) = inf;
u (emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
%! assert (infsup (2, 3) + infsup (1, 2) == infsup (3, 5));
+
+%!# correct use of signed zeros
+%!test
+%! x = plus (infsup (0), infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/polyval.m b/inst/@infsup/polyval.m
index 2ecaf0b..9e2d809 100644
--- a/inst/@infsup/polyval.m
+++ b/inst/@infsup/polyval.m
@@ -74,6 +74,10 @@ if (not (isvector (p)))
error ('polynomial P must be a vector of coefficients')
endif
+if (isempty (x))
+ result = x;
+endif;
+
n = numel (p);
switch (n)
case 0 # empty sum
@@ -83,13 +87,13 @@ switch (n)
result = p;
return
case 2 # p(1) .* x.^1 + p(2) .* x.^0
- result = fma (x, subsref (p, struct ('type', '()', 'subs', {{1}})), ...
- subsref (p, struct ('type', '()', 'subs', {{2}})));
+ result = fma (x, subsref (p, substruct ("()", {1})), ...
+ subsref (p, substruct ("()", {2})));
return
endswitch
if (x == 0)
- result = subsref (p, struct ('type', '()', 'subs', {{n}}));
+ result = subsref (p, substruct ("()", {n}));
return
elseif (x == 1)
result = sum (p);
@@ -121,7 +125,7 @@ for k = 1 : kMax
## Iterative refinement
## Store middle of residual as the next correction of y
- y (:, k) = mid (yy);
+ y(:, k) = mid (yy);
## Computation of the residual [r] and
## evaluation of the interval system A*[y] = [r]
diff --git a/inst/@infsup/postpad.m b/inst/@infsup/postpad.m
index 05b3fb8..c0b5068 100644
--- a/inst/@infsup/postpad.m
+++ b/inst/@infsup/postpad.m
@@ -45,13 +45,21 @@
## Keywords: interval
## Created: 2015-04-19
-function result = postpad (x, len, c, dim)
+function x = postpad (x, len, c, dim)
if (nargin < 2 || nargin > 4)
print_usage ();
return
endif
+if (not (isa (x, "infsup")))
+ x = infsup (x);
+endif
+
+if (isa (len, "infsup"))
+ error ("interval:InvalidOperand", "postpad: len must not be an interval");
+endif
+
if (nargin < 3)
c = infsup (0);
elseif (not (isa (c, "infsup")))
@@ -64,11 +72,12 @@ if (nargin < 4)
else
dim = 1;
endif
+elseif (isa (dim, "infsup"))
+ error ("interval:InvalidOperand", "postpad: dim must not be an interval");
endif
-l = postpad (x.inf, len, c.inf, dim);
-u = postpad (x.sup, len, c.sup, dim);
-result = infsup (l, u);
+x.inf = postpad (x.inf, len, c.inf, dim);
+x.sup = postpad (x.sup, len, c.sup, dim);
endfunction
diff --git a/inst/@infsup/pow.m b/inst/@infsup/pow.m
index 5e8fb50..8e8b4d8 100644
--- a/inst/@infsup/pow.m
+++ b/inst/@infsup/pow.m
@@ -38,7 +38,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = pow (x, y)
+function x = pow (x, y)
if (nargin ~= 2)
print_usage ();
@@ -52,7 +52,7 @@ if (not (isa (y, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -61,9 +61,9 @@ endif
## Intersect with domain
x = intersect (x, infsup (0, inf));
-y.inf (x.sup == 0) = max (0, y.inf (x.sup == 0));
-y.sup (y.inf > y.sup) = -inf;
-y.inf (y.inf > y.sup) = inf;
+y.inf(x.sup == 0) = max (0, y.inf(x.sup == 0));
+y.sup(y.inf > y.sup) = -inf;
+y.inf(y.inf > y.sup) = inf;
## Simple cases with no limit values, see Table 3.3 in
## Heimlich, Oliver. 2011. “The General Interval Power Function.”
@@ -89,15 +89,24 @@ u = max (max (max (...
mpfr_function_d ('pow', +inf, x.sup, y.sup));
emptyresult = isempty (x) | isempty (y) | (x.sup == 0 & y.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
## Fix 0 ^ positive = 0
-u (x.sup == 0 && u == 1) = 0;
+u(x.sup == 0 && u == 1) = 0;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (pow (infsup (5, 6), infsup (2, 3)) == infsup (25, 216));
+%!# from the documentation string
+%!assert (pow (infsup (5, 6), infsup (2, 3)) == infsup (25, 216));
+
+%!# correct use of signed zeros
+%!test
+%! x = pow (infsup (0), infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/pow10.m b/inst/@infsup/pow10.m
index 99e31c2..7df25b1 100644
--- a/inst/@infsup/pow10.m
+++ b/inst/@infsup/pow10.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = pow10 (x)
+function x = pow10 (x)
if (nargin ~= 1)
print_usage ();
@@ -45,11 +45,18 @@ endif
l = mpfr_function_d ('pow10', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('pow10', +inf, x.sup); # ... this does not
-u (isempty (x)) = -inf;
+l(l == 0) = -0;
+u(isempty (x)) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
%! assert (pow10 (infsup (5)) == infsup (100000));
+
+%!# correct use of signed zeros
+%!test
+%! x = pow10 (infsup (-inf, -realmax));
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/pow2.m b/inst/@infsup/pow2.m
index bfcd58c..65b1021 100644
--- a/inst/@infsup/pow2.m
+++ b/inst/@infsup/pow2.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = pow2 (x)
+function x = pow2 (x)
if (nargin ~= 1)
print_usage ();
@@ -45,11 +45,18 @@ endif
l = mpfr_function_d ('pow2', -inf, x.inf); # this works for empty intervals
u = mpfr_function_d ('pow2', +inf, x.sup); # ... this does not
-u (isempty (x)) = -inf;
+l(l == 0) = -0;
+u(isempty (x)) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
%! assert (pow2 (infsup (5)) == infsup (32));
+
+%!# correct use of signed zeros
+%!test
+%! x = pow2 (infsup (-inf, -realmax));
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/power.m b/inst/@infsup/power.m
index b82bb14..04dce93 100644
--- a/inst/@infsup/power.m
+++ b/inst/@infsup/power.m
@@ -67,24 +67,23 @@ elseif (isa (y, "infsupdec"))
endif
## Short circuit integral powers, e.g., x.^2
-if (not (any (any (y.inf == 0))) && ... # can't use pown, because 0^0 = [Empty]
- all (all (y.inf == y.sup & isfinite (y.inf) & fix (y.inf) == y.inf)))
+if (any ((y.inf == 0)(:)))
+ ## can't use pown, because 0^0 must evaluate to [Empty]
+elseif (any ((y.inf ~= y.sup)(:)) || ...
+ any ((not (isfinite (y.inf)))(:)) || ...
+ any ((fix (y.inf) ~= y.inf))(:))
+ ## can't use pown, because y is no integer
+else
z = pown (x, y.inf);
return
endif
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (x.inf) ~= rows (y.inf))
- x.inf = ones (rows (y.inf), columns (x.inf)) .* x.inf;
- x.sup = ones (rows (y.inf), columns (x.inf)) .* x.sup;
- y.inf = ones (rows (x.inf), columns (y.inf)) .* y.inf;
- y.sup = ones (rows (x.inf), columns (y.inf)) .* y.sup;
-endif
-if (columns (x.inf) ~= columns (y.inf))
- x.inf = ones (rows (x.inf), columns (y.inf)) .* x.inf;
- x.sup = ones (rows (x.inf), columns (y.inf)) .* x.sup;
- y.inf = ones (rows (y.inf), columns (x.inf)) .* y.inf;
- y.sup = ones (rows (y.inf), columns (x.inf)) .* y.sup;
+if (not (size_equal (x.inf, y.inf)))
+ x.inf = ones (size (y.inf)) .* x.inf;
+ x.sup = ones (size (y.inf)) .* x.sup;
+ y.inf = ones (size (x.inf)) .* y.inf;
+ y.sup = ones (size (x.inf)) .* y.sup;
endif
idx.type = "()";
@@ -94,21 +93,19 @@ emptyresult = x.inf == inf | y.inf == inf | ...
zPlus = pow (x, y); # pow is only defined for x > 0
zContainsZero = y.inf > 0 & x.inf <= 0 & x.sup >= 0;
-zMinus = infsup ();
-zMinus.inf = zMinus.inf (ones (size (x.inf)));
-zMinus.sup = zMinus.sup (ones (size (x.sup)));
+zMinus = repmat (infsup (), size (x.inf));
xMinusWithIntegerY = not (emptyresult) & x.inf < 0 & ...
not (isfinite (y.inf) & isfinite (y.sup) & ...
ceil (y.inf) > floor (y.sup));
-if (any (any (xMinusWithIntegerY)))
+if (any (xMinusWithIntegerY(:)))
ySingleInteger = isfinite (y.inf) & isfinite (y.sup) & ...
ceil (y.inf) == floor (y.sup);
## y contains a single integer
idx.subs = {xMinusWithIntegerY & ySingleInteger};
- if (any (any (idx.subs {1})))
+ if (any (idx.subs{1}(:)))
xMinus = intersect (subsref (x, idx), ... # intersect to
infsup (-inf, 0)); # speed up computation
zMinus = subsasgn (zMinus, idx, ...
@@ -117,7 +114,7 @@ if (any (any (xMinusWithIntegerY)))
## y contains several integers
idx.subs = {xMinusWithIntegerY & not(ySingleInteger)};
- if (any (any (idx.subs {1})))
+ if (any (idx.subs{1}(:)))
zMinus = subsasgn (zMinus, idx, ...
multipleintegers (subsref (x, idx), ...
subsref (y, idx)));
@@ -145,33 +142,32 @@ assert (all (all (y.inf < y.sup & x.inf < 0)));
## Heimlich, Oliver. 2011. “The General Interval Power Function.”
## Diplomarbeit, Institute for Computer Science, University of Würzburg.
## http://exp.ln0.de/heimlich-power-2011.htm.
-z = infsup ();
-z.inf = z.inf(ones (size (x.inf)));
-z.sup = z.sup(ones (size (x.sup)));
+z = repmat (infsup (), size (x.inf));
+
idx.type = "()";
idx.subs = {(x.sup <= -1 & y.sup <= 0)};
-if (any (any (idx.subs {1})))
+if (any (idx.subs{1}(:)))
xsup_idx = subsref (x.sup, idx);
y_idx = subsref (y, idx);
z = subsasgn (z, idx, twointegers (xsup_idx, goe (y_idx), gee (y_idx)));
endif
idx.subs = {(-1 <= x.inf & 0 <= y.inf)};
-if (any (any (idx.subs {1})))
+if (any (idx.subs{1}(:)))
xinf_idx = subsref (x.inf, idx);
y_idx = subsref (y, idx);
z = subsasgn (z, idx, twointegers (xinf_idx, loe (y_idx), lee (y_idx)));
endif
idx.subs = {((x.sup <= -1 | (x.inf < -1 & -1 < x.sup)) & ...
((0 <= y.inf & not (-1 <= x.inf)) | (y.inf <= -1 & 1 <= y.sup)))};
-if (any (any (idx.subs {1})))
+if (any (idx.subs{1}(:)))
xinf_idx = subsref (x.inf, idx);
y_idx = subsref (y, idx);
z = subsasgn (z, idx, twointegers (xinf_idx, goe (y_idx), gee (y_idx)));
endif
idx.subs = {(((x.inf < -1 & -1 < x.sup) | -1 <= x.inf) & ...
((y.inf <= -1 & 1 <= y.sup) | (y.sup <= 0 & not (x.sup <= -1))))};
-if (any (any (idx.subs {1})))
+if (any (idx.subs{1}(:)))
xsup_idx = subsref (x.sup, idx);
y_idx = subsref (y, idx);
z = subsasgn (z, idx, union (subsref (z, idx), ...
@@ -200,7 +196,7 @@ assert (all (all (oddexponent ~= 0)));
assert (all (all (not (isfinite (oddexponent) & isfinite (evenexponent)) | ...
abs (oddexponent - evenexponent) <= 1)));
base = abs (base);
-z.inf = z.sup = zeros (size (base));
+z = infsup (zeros (size (base)));
z.inf(base == 0 & oddexponent < 0) = -inf;
z.sup(base == 0 & evenexponent < 0) = inf;
z.sup(base == 0 & evenexponent == 0) = 1;
@@ -213,7 +209,7 @@ z.sup(base == 1) = 1;
z.sup(0 < base & base < 1 & evenexponent <= 0) = inf;
z.sup(1 < base & base < inf & evenexponent >= 0) = inf;
select = 0 < base & base < inf & isfinite (evenexponent);
-if (any (any (select)))
+if (any (select(:)))
z.sup(select) = sup (pown (infsup (base(select)), evenexponent(select)));
endif
@@ -226,11 +222,10 @@ select = 0 < base & base < inf & bigexponent;
z.inf(select) = -z.sup(select);
select = 0 < base & base < inf & isfinite (oddexponent) & not (bigexponent);
-if (any (any (select)))
+if (any (select(:)))
z.inf(select) = -sup (pown (infsup (base(select)), oddexponent(select)));
endif
-z = infsup (z.inf, z.sup);
endfunction
function e = goe (y)
@@ -265,6 +260,13 @@ e(odd) = mpfr_function_d ('plus', -inf, e(odd), 1);
e(e > y.sup) = nan (); # no odd number in interval
endfunction
-%!test "from the documentation string";
-%! assert (infsup (-5, 6) .^ infsup (2, 3) == infsup (-125, 216));
+%!# from the documentation string
+%!assert (infsup (-5, 6) .^ infsup (2, 3) == infsup (-125, 216));
+
%!assert (infsup (-10, 0) .^ infsup (0, 1:8) == infsup ([-1e1, -1e1, -1e3, -1e3, -1e5, -1e5, -1e7, -1e7], [1e0, 1e2, 1e2, 1e4, 1e4, 1e6, 1e6, 1e8]));
+
+%!# correct use of signed zeros
+%!test
+%! x = power (infsup (0), infsup (1));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/pown.m b/inst/@infsup/pown.m
index cbb6ff3..1ee8345 100644
--- a/inst/@infsup/pown.m
+++ b/inst/@infsup/pown.m
@@ -48,7 +48,7 @@ if (not (isnumeric (p)) || any (any (fix (p) ~= p)))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (p))
+if (not (size_equal (x.inf, p)))
x.inf = ones (size (p)) .* x.inf;
x.sup = ones (size (p)) .* x.sup;
p = ones (size (x.inf)) .* p;
@@ -61,17 +61,17 @@ result.inf(select) = result.sup(select) = 1;
idx.type = "()";
idx.subs = {(p == 2)}; # x^2
-if (any (any (idx.subs{1})))
+if (any (idx.subs{1}(:)))
result = subsasgn (result, idx, sqr (subsref (x, idx)));
endif
idx.subs = {(p == -1)}; # x^-1 = 1./x
-if (any (any (idx.subs{1})))
+if (any (idx.subs{1}(:)))
result = subsasgn (result, idx, 1 ./ subsref (x, idx));
endif
idx.subs = {(rem (p, 2) == 0 & p ~= 2 & p ~= 0)};
-if (any (any (idx.subs{1}))) # p even
+if (any (idx.subs{1}(:))) # p even
x_mig = mig (subsref (x, idx));
x_mig(isnan (x_mig)) = inf;
@@ -85,7 +85,7 @@ if (any (any (idx.subs{1}))) # p even
endif
idx.subs = {(rem (p, 2) ~= 0 & p ~= -1)};
-if (any (any (idx.subs{1}))) # p odd
+if (any (idx.subs{1}(:))) # p odd
x_idx = subsref (x, idx);
p_idx = infsup (subsref (p, idx));
result = subsasgn (result, idx, ...
@@ -100,7 +100,7 @@ result.sup(select) = +0;
endfunction
-function result = sqr (x)
+function x = sqr (x)
## Compute the square for each entry in @var{X}.
##
## Accuracy: The result is a tight enclosure.
@@ -109,13 +109,17 @@ l = mpfr_function_d ('sqr', -inf, mig (x));
u = mpfr_function_d ('sqr', +inf, mag (x));
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (pown (infsup (5, 6), 2) == infsup (25, 36));
+%!# from the documentation string
+%!assert (pown (infsup (5, 6), 2) == infsup (25, 36));
+
%!assert (pown (infsup (-2, 1), 2) == infsup (0, 4));
diff --git a/inst/@infsup/pownrev.m b/inst/@infsup/pownrev.m
index 4587083..282a790 100644
--- a/inst/@infsup/pownrev.m
+++ b/inst/@infsup/pownrev.m
@@ -56,18 +56,18 @@ if (not (isnumeric (p)) || fix (p) ~= p)
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (c.inf))
- x.inf = x.inf (ones (size (c.inf)));
- x.sup = x.sup (ones (size (c.inf)));
- c.inf = c.inf (ones (size (x.inf)));
- c.sup = c.sup (ones (size (x.inf)));
+if (not (size_equal (x.inf, c.inf)))
+ x.inf = ones (size (c.inf)) .* x.inf;
+ x.sup = ones (size (c.inf)) .* x.sup;
+ c.inf = ones (size (x.inf)) .* c.inf;
+ c.sup = ones (size (x.inf)) .* c.sup;
endif
if (p == 0) # x^p == 1
result = x;
emptyresult = c.inf > 1 | c.sup < 1;
- result.inf (emptyresult) = inf;
- result.sup (emptyresult) = -inf;
+ result.inf(emptyresult) = inf;
+ result.sup(emptyresult) = -inf;
else
even = mod (p, 2) == 0;
if (even)
diff --git a/inst/@infsup/powrev1.m b/inst/@infsup/powrev1.m
index 7a5dc49..89099e1 100644
--- a/inst/@infsup/powrev1.m
+++ b/inst/@infsup/powrev1.m
@@ -38,7 +38,7 @@
## Keywords: interval
## Created: 2011
-function result = powrev1 (b, c, x)
+function x = powrev1 (b, c, x)
if (nargin < 2 || nargin > 3)
print_usage ();
@@ -61,33 +61,19 @@ x = intersect (x, infsup (0, inf));
c = intersect (c, infsup (0, inf));
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (b.inf) ~= rows (c.inf))
- b.inf = ones (rows (c.inf), columns (b.inf)) .* b.inf;
- b.sup = ones (rows (c.inf), columns (b.inf)) .* b.sup;
- c.inf = ones (rows (b.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (b.inf), columns (c.inf)) .* c.sup;
-endif
-if (rows (b.inf) ~= rows (x.inf))
- b.inf = ones (rows (x.inf), columns (b.inf)) .* b.inf;
- b.sup = ones (rows (x.inf), columns (b.inf)) .* b.sup;
- c.inf = ones (rows (x.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (x.inf), columns (c.inf)) .* c.sup;
- x.inf = ones (rows (b.inf), columns (x.inf)) .* x.inf;
- x.sup = ones (rows (b.inf), columns (x.inf)) .* x.sup;
-endif
-if (columns (b.inf) ~= columns (c.inf))
- b.inf = ones (rows (b.inf), columns (c.inf)) .* b.inf;
- b.sup = ones (rows (b.inf), columns (c.inf)) .* b.sup;
- c.inf = ones (rows (c.inf), columns (b.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (b.inf)) .* c.sup;
-endif
-if (columns (b.inf) ~= columns (x.inf))
- b.inf = ones (rows (b.inf), columns (x.inf)) .* b.inf;
- b.sup = ones (rows (b.inf), columns (x.inf)) .* b.sup;
- c.inf = ones (rows (c.inf), columns (x.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (x.inf)) .* c.sup;
- x.inf = ones (rows (x.inf), columns (b.inf)) .* x.inf;
- x.sup = ones (rows (x.inf), columns (b.inf)) .* x.sup;
+if (not (size_equal (b.inf, c.inf)))
+ b.inf = ones (size (c.inf)) .* b.inf;
+ b.sup = ones (size (c.inf)) .* b.sup;
+ c.inf = ones (size (b.inf)) .* c.inf;
+ c.sup = ones (size (b.inf)) .* c.sup;
+endif
+if (not (size_equal (b.inf, x.inf)))
+ b.inf = ones (size (x.inf)) .* b.inf;
+ b.sup = ones (size (x.inf)) .* b.sup;
+ c.inf = ones (size (x.inf)) .* c.inf;
+ c.sup = ones (size (x.inf)) .* c.sup;
+ x.inf = ones (size (b.inf)) .* x.inf;
+ x.sup = ones (size (b.inf)) .* x.sup;
endif
l = x.inf;
@@ -95,8 +81,8 @@ u = x.sup;
emptyresult = isempty (b) | isempty (c) | (x.sup == 0 & b.sup <= 0) ...
| (b.sup <= 0 & ((x.sup <= 1 & c.sup < 1) | (x.inf >= 1 & c.inf > 1))) ...
| (b.inf >= 0 & ((x.sup <= 1 & c.inf > 1) | (x.inf >= 1 & c.sup < 1)));
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
## Implements Table B.1 in
## Heimlich, Oliver. 2011. “The General Interval Power Function.”
@@ -107,38 +93,38 @@ u (emptyresult) = -inf;
y = b.sup < 0;
z = c.sup < 1;
select = y & z & l < inf;
-if (any (any (select)))
- l (select) = max (l (select), ...
- powrev1rounded (c.sup (select), b.inf (select), -inf));
+if (any (select(:)))
+ l(select) = max (l(select), ...
+ powrev1rounded (c.sup(select), b.inf(select), -inf));
endif
z = c.sup == 1;
select = y & z & l < 1;
-l (select) = 1;
+l(select) = 1;
z = c.sup > 1 & c.sup < inf;
select = y & z & l < 1;
-if (any (any (select)))
- l (select) = max (l (select), ...
- powrev1rounded (c.sup (select), b.sup (select), -inf));
+if (any (select(:)))
+ l(select) = max (l(select), ...
+ powrev1rounded (c.sup(select), b.sup(select), -inf));
endif
z = c.inf > 0 & c.inf < 1;
select = y & z & u > 1;
-if (any (any (select)))
- u (select) = min (u (select), ...
- powrev1rounded (c.inf (select), b.sup (select), +inf));
+if (any (select(:)))
+ u(select) = min (u(select), ...
+ powrev1rounded (c.inf(select), b.sup(select), +inf));
endif
z = c.inf == 1;
select = y & z & u > 1;
-u (select) = 1;
+u(select) = 1;
z = c.inf > 1;
select = y & z & u > 0;
-if (any (any (select)))
- u (select) = min (u (select), ...
- powrev1rounded (c.inf (select), b.inf (select), +inf));
+if (any (select(:)))
+ u(select) = min (u(select), ...
+ powrev1rounded (c.inf(select), b.inf(select), +inf));
endif
## ismember (0, y) ============================================================
@@ -149,75 +135,78 @@ gap.sup = +inf (size (u));
z = c.sup < 1;
select = y & z & b.sup > 0;
-if (any (any (select)))
- gap.inf (select) = powrev1rounded (c.sup (select), b.sup (select), +inf);
+if (any (select(:)))
+ gap.inf(select) = powrev1rounded (c.sup(select), b.sup(select), +inf);
endif
select = y & z & b.inf < 0;
-if (any (any (select)))
- gap.sup (select) = powrev1rounded (c.sup (select), b.inf (select), -inf);
+if (any (select(:)))
+ gap.sup(select) = powrev1rounded (c.sup(select), b.inf(select), -inf);
endif
z = c.inf > 1;
select = y & z & b.inf < 0;
-if (any (any (select)))
- gap.inf (select) = powrev1rounded (c.inf (select), b.inf (select), +inf);
+if (any (select(:)))
+ gap.inf(select) = powrev1rounded (c.inf(select), b.inf(select), +inf);
endif
select = y & z & b.sup > 0;
-if (any (any (select)))
- gap.sup (select) = powrev1rounded (c.inf (select), b.sup (select), -inf);
+if (any (select(:)))
+ gap.sup(select) = powrev1rounded (c.inf(select), b.sup(select), -inf);
endif
z = c.sup < 1 | c.inf > 1;
select = y & z & (l > gap.inf | (gap.inf == 1 & l == 1));
-l (select) = max (l (select), gap.sup (select));
+l(select) = max (l(select), gap.sup(select));
select = y & z & (u < gap.sup | gap.sup == inf | (gap.sup == 1 & u == 1));
-u (select) = min (u (select), gap.inf (select));
+u(select) = min (u(select), gap.inf(select));
## y after [0, 0] =============================================================
y = b.inf > 0;
z = c.sup < 1;
select = y & z & u > 0;
-if (any (any (select)))
- u (select) = min (u (select), ...
- powrev1rounded (c.sup (select), b.sup (select), +inf));
+if (any (select(:)))
+ u(select) = min (u(select), ...
+ powrev1rounded (c.sup(select), b.sup(select), +inf));
endif
z = c.sup == 1;
select = y & z & u > 1;
-u (select) = 1;
+u(select) = 1;
z = c.sup > 1 & c.sup < inf;
select = y & z & u > 1;
-if (any (any (select)))
- u (select) = min (u (select), ...
- powrev1rounded (c.sup (select), b.inf (select), +inf));
+if (any (select(:)))
+ u(select) = min (u(select), ...
+ powrev1rounded (c.sup(select), b.inf(select), +inf));
endif
z = c.inf > 0 & c.inf < 1;
select = y & z & l < 1;
-if (any (any (select)))
- l (select) = max (l (select), ...
- powrev1rounded (c.inf (select), b.inf (select), -inf));
+if (any (select(:)))
+ l(select) = max (l(select), ...
+ powrev1rounded (c.inf(select), b.inf(select), -inf));
endif
z = c.inf == 1;
select = y & z & l < 1;
-l (select) = 1;
+l(select) = 1;
z = c.inf > 1;
select = y & z & l < inf;
-if (any (any (select)))
- l (select) = max (l (select), ...
- powrev1rounded (c.inf (select), b.sup (select), -inf));
+if (any (select(:)))
+ l(select) = max (l(select), ...
+ powrev1rounded (c.inf(select), b.sup(select), -inf));
endif
## ============================================================================
emptyresult = l > u | l == inf | u == -inf;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
+
+l(l == 0) = -0;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
@@ -226,17 +215,17 @@ function x = powrev1rounded (z, y, direction)
x = ones (size (z));
-x ((z == inf & y < 0) | (z == 0 & y > 0)) = 0;
-x ((z == inf & y > 0) | (z == 0 & y < 0)) = inf;
+x((z == inf & y < 0) | (z == 0 & y > 0)) = 0;
+x((z == inf & y > 0) | (z == 0 & y < 0)) = inf;
select = z > 1 & z < inf & isfinite (y);
-y (select) = mpfr_function_d ('rdivide', direction, 1, y (select));
+y(select) = mpfr_function_d ('rdivide', direction, 1, y(select));
select = z < 1 & z > 0 & isfinite (y);
-y (select) = mpfr_function_d ('rdivide', -direction, 1, y (select));
+y(select) = mpfr_function_d ('rdivide', -direction, 1, y(select));
select = isfinite (y) & z > 0 & z ~= 1 & z < inf;
-x (select) = mpfr_function_d ('pow', direction, z (select), y (select));
+x(select) = mpfr_function_d ('pow', direction, z(select), y(select));
endfunction
-%!test "from the documentation string";
-%! assert (powrev1 (infsup (2, 5), infsup (3, 6)) == "[0x1.3EE8390D43955, 0x1.3988E1409212Fp1]");
+%!# from the documentation string
+%!assert (powrev1 (infsup (2, 5), infsup (3, 6)) == "[0x1.3EE8390D43955, 0x1.3988E1409212Fp1]");
diff --git a/inst/@infsup/powrev2.m b/inst/@infsup/powrev2.m
index 64dbdc9..d5fa062 100644
--- a/inst/@infsup/powrev2.m
+++ b/inst/@infsup/powrev2.m
@@ -38,7 +38,7 @@
## Keywords: interval
## Created: 2011
-function result = powrev2 (a, c, y)
+function y = powrev2 (a, c, y)
if (nargin < 2 || nargin > 3)
print_usage ();
@@ -61,33 +61,19 @@ a = intersect (a, infsup (0, inf));
c = intersect (c, infsup (0, inf));
## Resize, if scalar × matrix or vector × matrix or scalar × vector
-if (rows (a.inf) ~= rows (c.inf))
- a.inf = ones (rows (c.inf), columns (a.inf)) .* a.inf;
- a.sup = ones (rows (c.inf), columns (a.inf)) .* a.sup;
- c.inf = ones (rows (a.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (a.inf), columns (c.inf)) .* c.sup;
+if (not (size_equal (a.inf, c.inf)))
+ a.inf = ones (size (c.inf)) .* a.inf;
+ a.sup = ones (size (c.inf)) .* a.sup;
+ c.inf = ones (size (a.inf)) .* c.inf;
+ c.sup = ones (size (a.inf)) .* c.sup;
endif
-if (rows (a.inf) ~= rows (y.inf))
- a.inf = ones (rows (y.inf), columns (a.inf)) .* a.inf;
- a.sup = ones (rows (y.inf), columns (a.inf)) .* a.sup;
- c.inf = ones (rows (y.inf), columns (c.inf)) .* c.inf;
- c.sup = ones (rows (y.inf), columns (c.inf)) .* c.sup;
- y.inf = ones (rows (a.inf), columns (y.inf)) .* y.inf;
- y.sup = ones (rows (a.inf), columns (y.inf)) .* y.sup;
-endif
-if (columns (a.inf) ~= columns (c.inf))
- a.inf = ones (rows (a.inf), columns (c.inf)) .* a.inf;
- a.sup = ones (rows (a.inf), columns (c.inf)) .* a.sup;
- c.inf = ones (rows (c.inf), columns (a.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (a.inf)) .* c.sup;
-endif
-if (columns (a.inf) ~= columns (y.inf))
- a.inf = ones (rows (a.inf), columns (y.inf)) .* a.inf;
- a.sup = ones (rows (a.inf), columns (y.inf)) .* a.sup;
- c.inf = ones (rows (c.inf), columns (y.inf)) .* c.inf;
- c.sup = ones (rows (c.inf), columns (y.inf)) .* c.sup;
- y.inf = ones (rows (y.inf), columns (a.inf)) .* y.inf;
- y.sup = ones (rows (y.inf), columns (a.inf)) .* y.sup;
+if (not (size_equal (a.inf, y.inf)))
+ a.inf = ones (size (y.inf)) .* a.inf;
+ a.sup = ones (size (y.inf)) .* a.sup;
+ c.inf = ones (size (y.inf)) .* c.inf;
+ c.sup = ones (size (y.inf)) .* c.sup;
+ y.inf = ones (size (a.inf)) .* y.inf;
+ y.sup = ones (size (a.inf)) .* y.sup;
endif
l = y.inf;
@@ -118,7 +104,7 @@ l(select) = 0;
z = c.sup > 1 & c.sup < inf;
select = x & z & l < 0;
-if (any (any (select)))
+if (any (select(:)))
l(select) = max (l(select), ...
powrev2rounded (a.sup(select), c.sup(select), -inf));
endif
@@ -129,7 +115,7 @@ u(select) = 0;
z = c.inf > 0 & c.inf < 1;
select = x & z & u > 0;
-if (any (any (select)))
+if (any (select(:)))
u (select) = min (u (select), powrev2rounded (a.sup, c.inf, +inf));
endif
@@ -138,14 +124,14 @@ x = a.inf > 0 & a.inf < 1 & a.sup <= 1;
z = c.sup < 1 & c.sup > 0;
select = x & z & l < inf;
-if (any (any (select)))
+if (any (select(:)))
l(select) = max (l(select), ...
powrev2rounded (a.inf(select), c.sup(select), -inf));
endif
z = c.inf > 1 & c.sup < inf;
select = x & z & u > -inf;
-if (any (any (select)))
+if (any (select(:)))
u(select) = min (u(select), ...
powrev2rounded (a.inf(select), c.inf (select), +inf));
endif
@@ -168,11 +154,11 @@ z = c.sup < 1;
select = x & z & a.inf == 0;
gap.sup(select) = 0;
select = x & z & a.sup > 1;
-if (any (any (select)))
+if (any (select(:)))
gap.inf(select) = powrev2rounded (a.sup(select), c.sup(select), +inf);
endif
select = x & z & a.inf > 0 & a.inf < 1 & a.sup > 1;
-if (any (any (select)))
+if (any (select(:)))
gap.sup(select) = powrev2rounded(a.inf(select), c.sup(select), -inf);
endif
@@ -180,11 +166,11 @@ z = c.inf > 1;
select = x & z & a.inf == 0;
gap.inf(select) = 0;
select = x & z & a.sup > 1;
-if (any (any (select)))
+if (any (select(:)))
gap.sup(select) = powrev2rounded (a.sup(select), c.inf(select), -inf);
endif
select = x & z & a.inf > 0 & a.inf < 1 & a.sup > 1;
-if (any (any (select)))
+if (any (select(:)))
gap.inf(select) = powrev2rounded (a.inf(select), c.inf(select), +inf);
endif
@@ -201,14 +187,14 @@ x = a.inf > 1;
z = c.sup < 1;
select = x & z & u > -inf;
-if (any (any (select)))
+if (any (select(:)))
u(select) = min (u(select), ...
powrev2rounded (a.sup(select), c.sup(select), +inf));
endif
z = c.inf > 0 & c.inf < 1;
select = x & z & l < 0;
-if (any (any (select)))
+if (any (select(:)))
l(select) = max (l(select), ...
powrev2rounded (a.inf(select), c.inf(select), -inf));
endif
@@ -219,18 +205,18 @@ l(select) = 0;
z = c.inf > 1;
select = x & z & l < inf;
-if (any (any (select)))
+if (any (select(:)))
l(select) = max (l(select), ...
powrev2rounded (a.sup(select), c.inf(select), -inf));
endif
z = c.sup == 1;
select = x & z & u > 0;
-u (select) = 0;
+u(select) = 0;
z = c.sup > 1 & c.sup < inf;
select = x & z & u > 0;
-if (any (any (select)))
+if (any (select(:)))
u(select) = min (u(select), ...
powrev2rounded (a.inf(select), c.sup(select), +inf));
endif
@@ -241,7 +227,10 @@ emptyresult = l > u | l == inf | u == -inf;
l(emptyresult) = inf;
u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+y.inf = l;
+y.sup = u;
endfunction
@@ -250,31 +239,31 @@ function y = powrev2rounded (x, z, direction)
y = nominator = denominator = zeros (size (x));
-y (z == inf & x < 1) = -inf;
-y (z == inf & x > 1 & x < inf) = inf;
+y(z == inf & x < 1) = -inf;
+y(z == inf & x > 1 & x < inf) = inf;
## We do not use log here, because log2 is able to produce some results without
## rounding errors.
rnd_log_numerator_up = (direction > 0) == (sign (x - 1) == sign (z - 1));
select = isfinite (x) & isfinite (z) & rnd_log_numerator_up;
-if (any (any (select)))
- denominator (select) = mpfr_function_d ('log2', -inf, x (select));
- nominator (select) = mpfr_function_d ('log2', +inf, z (select));
+if (any (select(:)))
+ denominator(select) = mpfr_function_d ('log2', -inf, x(select));
+ nominator(select) = mpfr_function_d ('log2', +inf, z(select));
endif
select = isfinite (x) & isfinite (z) & not (rnd_log_numerator_up);
-if (any (any (select)))
- denominator (select) = mpfr_function_d ('log2', +inf, x (select));
- nominator (select) = mpfr_function_d ('log2', -inf, z (select));
+if (any (select(:)))
+ denominator(select) = mpfr_function_d ('log2', +inf, x(select));
+ nominator(select) = mpfr_function_d ('log2', -inf, z(select));
endif
select = isfinite (x) & isfinite (z);
-if (any (any (select)))
- y (select) = mpfr_function_d ('rdivide', direction, ...
- nominator (select), ...
- denominator (select));
+if (any (select(:)))
+ y(select) = mpfr_function_d ('rdivide', direction, ...
+ nominator(select), ...
+ denominator(select));
endif
endfunction
-%!test "from the documentation string";
-%! assert (powrev2 (infsup (2, 5), infsup (3, 6)) == "[0x1.5D7E8F22BA886p-1, 0x1.4AE00D1CFDEB5p1]");
+%!# from the documentation string
+%!assert (powrev2 (infsup (2, 5), infsup (3, 6)) == "[0x1.5D7E8F22BA886p-1, 0x1.4AE00D1CFDEB5p1]");
diff --git a/inst/@infsup/prepad.m b/inst/@infsup/prepad.m
index af87194..fb0a188 100644
--- a/inst/@infsup/prepad.m
+++ b/inst/@infsup/prepad.m
@@ -45,13 +45,21 @@
## Keywords: interval
## Created: 2015-04-19
-function result = prepad (x, len, c, dim)
+function x = prepad (x, len, c, dim)
if (nargin < 2 || nargin > 4)
print_usage ();
return
endif
+if (not (isa (x, "infsup")))
+ x = infsup (x);
+endif
+
+if (isa (len, "infsup"))
+ error ("interval:InvalidOperand", "prepad: len must not be an interval");
+endif
+
if (nargin < 3)
c = infsup (0);
elseif (not (isa (c, "infsup")))
@@ -64,11 +72,12 @@ if (nargin < 4)
else
dim = 1;
endif
+elseif (isa (dim, "infsup"))
+ error ("interval:InvalidOperand", "prepad: dim must not be an interval");
endif
-l = prepad (x.inf, len, c.inf, dim);
-u = prepad (x.sup, len, c.sup, dim);
-result = infsup (l, u);
+x.inf = prepad (x.inf, len, c.inf, dim);
+x.sup = prepad (x.sup, len, c.sup, dim);
endfunction
diff --git a/inst/@infsup/prod.m b/inst/@infsup/prod.m
index 254c892..cb9a400 100644
--- a/inst/@infsup/prod.m
+++ b/inst/@infsup/prod.m
@@ -63,19 +63,19 @@ endswitch
## Short circuit in simple cases
emptyresult = any (isempty (x), dim);
-result.inf (emptyresult) = +inf;
-result.sup (emptyresult) = -inf;
+result.inf(emptyresult) = +inf;
+result.sup(emptyresult) = -inf;
zeroresult = not (emptyresult) & any (x.inf == 0 & x.sup == 0, dim);
-result.inf (zeroresult) = -0;
-result.sup (zeroresult) = +0;
+result.inf(zeroresult) = -0;
+result.sup(zeroresult) = +0;
entireresult = not (emptyresult | zeroresult) & any (isentire (x), dim);
-result.inf (entireresult) = -inf;
-result.sup (entireresult) = +inf;
+result.inf(entireresult) = -inf;
+result.sup(entireresult) = +inf;
idx.type = "()";
idx.subs = {":", ":"};
idx.subs{3 - dim} = not (emptyresult | zeroresult | entireresult);
-if (any (idx.subs{3 - dim}))
+if (any (idx.subs{3 - dim}(:)))
idx.subs{dim} = 1;
result2 = subsref (result, idx);
for i = 1 : size (x.inf, dim)
@@ -88,6 +88,7 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (prod (infsup (1 : 4)) == 24);
+%!# from the documentation string
+%!assert (prod (infsup (1 : 4)) == 24);
+
%!assert (prod (infsup ([])) == 1);
diff --git a/inst/@infsup/psi.m b/inst/@infsup/psi.m
index 370f79a..ec60c71 100644
--- a/inst/@infsup/psi.m
+++ b/inst/@infsup/psi.m
@@ -50,7 +50,7 @@
## Keywords: interval
## Created: 2015-02-28
-function result = psi (x)
+function x = psi (x)
if (nargin ~= 1)
print_usage ();
@@ -64,19 +64,22 @@ l = -u;
nosingularity = x.inf >= 0 | ceil (x.inf) > floor (x.sup) | ...
(ceil (x.inf) == floor (x.sup) & ...
(fix (x.inf) == x.inf | fix (x.sup) == x.sup));
-if (any (any (nosingularity)))
- x.inf (x.inf == 0) = 0; # fix negative zero
- l (nosingularity & (x.inf > 0 | fix (x.inf) ~= x.inf)) = ...
- mpfr_function_d ('psi', -inf, x.inf (nosingularity));
- u (nosingularity & (x.sup > 0 | fix (x.sup) ~= x.sup)) = ...
- mpfr_function_d ('psi', +inf, x.sup (nosingularity));
+if (any (nosingularity(:)))
+ x.inf(x.inf == 0) = 0; # fix negative zero
+ l(nosingularity & (x.inf > 0 | fix (x.inf) ~= x.inf)) = ...
+ mpfr_function_d ('psi', -inf, x.inf(nosingularity));
+ u(nosingularity & (x.sup > 0 | fix (x.sup) ~= x.sup)) = ...
+ mpfr_function_d ('psi', +inf, x.sup(nosingularity));
endif
emptyresult = x.inf == x.sup & fix (x.inf) == x.inf & x.inf <= 0;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
@@ -92,5 +95,5 @@ endfunction
%!assert (isentire (psi (infsup (-1-eps, -1+eps))));
%!assert (isentire (psi (infsup (-4.1, -3.9))));
-%!test "from the documentation string";
-%! assert (psi (infsup (1)) == "[-0x1.2788CFC6FB619p-1, -0x1.2788CFC6FB618p-1]");
+%!# from the documentation string
+%!assert (psi (infsup (1)) == "[-0x1.2788CFC6FB619p-1, -0x1.2788CFC6FB618p-1]");
diff --git a/inst/@infsup/qr.m b/inst/@infsup/qr.m
new file mode 100644
index 0000000..671170b
--- /dev/null
+++ b/inst/@infsup/qr.m
@@ -0,0 +1,161 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypemethod {@@infsup} {[@var{Q}, @var{R}] =} qr (@var{A})
+## @deftypemethodx {@@infsup} {[@var{Q}, @var{R}, @var{P}] =} qr (@var{A})
+## Compute the QR decomposition of @var{A}.
+##
+## @var{A} will be a subset of @var{Q} * @var{R} with orthogonal matrix @var{Q}
+## and triangular matrix @var{R}.
+##
+## The columns of @var{Q} are orthogonal unit vectors, that is, @code{Q' * Q}
+## equals the identity. @var{R} is an upper triangular matrix with positive
+## diagonal elements.
+##
+## The result is returned in a permuted form, according to the optional return
+## value @var{P}.
+##
+## Accuracy: The result is a valid enclosure.
+## @seealso{@@infsup/lu, @@infsup/chol}
+## @end deftypemethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-06-26
+
+function [Q, R, P] = qr (A)
+
+## We use the Gram-Schmidt process, since Householder reflections would
+## introduce a much larger overestimation for Q in most cases.
+
+n = length (A);
+Q = resize (A, n);
+R = zeros (n);
+P = eye (columns (A));
+
+for i = 1 : n
+ iColIdx = substruct ("()", {":", i});
+ if (nargout >= 3 && i < columns (A))
+ ## Swap columns of Q, choose the column with maximum norm as next pivot
+ B = subsref (Q, substruct ("()", {":", i : n}));
+ [~, j] = max (mig (sumsq (B, 1)));
+ j += i - 1;
+ if (j != i)
+ swapIdx = 1 : n;
+ swapIdx([i j]) = [j i];
+ swap = @(X) subsref (X, substruct ("()", {":", swapIdx}));
+ Q = swap (Q);
+ R = swap (R);
+ P = P(:, swapIdx(1 : columns (A)));
+ endif
+ endif
+ iCol = subsref (Q, iColIdx);
+ d = norm (iCol, 2);
+ iCol = mulrev (d, iCol, "[-1, +1]");
+ Q = subsasgn (Q, iColIdx, iCol);
+ R = subsasgn (R, substruct ("()", {i, i}), d);
+
+ if (i < n)
+ otherColsIdx = substruct ("()", {":", (i + 1) : n});
+ otherCols = subsref (Q, otherColsIdx);
+ d = dot (otherCols, iCol, 1);
+ otherCols -= d .* iCol;
+ Q = subsasgn (Q, otherColsIdx, otherCols);
+ R = subsasgn (R, substruct ("()", {i, (i + 1) : n}), d);
+ endif
+endfor
+
+Q = resize (Q, rows (A));
+R = resize (R, size (A));
+P = inv (P);
+
+endfunction
+
+%!test
+%! A = infsup ([1 2 3; 4 5 6]);
+%! [Q, R] = qr (A);
+%! assert (all (all (subset (A, Q * R))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-14);
+%!test
+%! A = infsup ([1 2; 3 4; 5 6]);
+%! [Q, R] = qr (A);
+%! assert (all (all (subset (A, Q * R))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q (:, [1 2])))) < 1e-14);
+%!test
+%! A = infsup ([1 2 3; 4 9 6; 9 8 7]);
+%! [Q, R] = qr (A);
+%! assert (all (all (subset (A, Q * R))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-13);
+%!test
+%! for n = 3 : 2 : 10
+%! A = infsup (magic (n));
+%! [Q, R] = qr (A);
+%! assert (all (all (subset (A, Q * R))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-10);
+%! endfor
+%!test
+%! A = infsup (magic (3)) + "[2, 2.2]";
+%! [Q, R] = qr (A);
+%! assert (all (all (subset (A, Q * R))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1.5);
+
+%!function result = is_permutation_matrix (P)
+%! result = isequal (P, eye (length (P))) || ...
+%! isequal (typeinfo (P), "permutation matrix");
+%!endfunction
+%!test
+%! A = infsup ([1 2 3; 4 5 6]);
+%! [Q, R, P] = qr (A);
+%! assert (all (all (subset (A, Q * R * P))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-14);
+%! assert (is_permutation_matrix (P));
+%!test
+%! A = infsup ([1 2; 3 4; 5 6]);
+%! [Q, R, P] = qr (A);
+%! assert (all (all (subset (A, Q * R * P))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q (:, [1 2])))) < 1e-14);
+%! assert (is_permutation_matrix (P));
+%!test
+%! A = infsup ([1 2 3; 4 9 6; 9 8 7]);
+%! [Q, R, P] = qr (A);
+%! assert (all (all (subset (A, Q * R * P))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-13);
+%! assert (is_permutation_matrix (P));
+%!test
+%! for n = 3 : 2 : 10
+%! A = infsup (magic (n));
+%! [Q, R, P] = qr (A);
+%! assert (all (all (subset (A, Q * R * P))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1e-10);
+%! assert (is_permutation_matrix (P));
+%! endfor
+%!test
+%! A = infsup (magic (3)) + "[2, 2.2]";
+%! [Q, R, P] = qr (A);
+%! assert (all (all (subset (A, Q * R * P))));
+%! assert (all (all (subset (eye (length (Q)), Q' * Q))));
+%! assert (max (max (wid (Q))) < 1.5);
+%! assert (is_permutation_matrix (P));
diff --git a/inst/@infsup/rad.m b/inst/@infsup/rad.m
index 55ec052..2e59ca1 100644
--- a/inst/@infsup/rad.m
+++ b/inst/@infsup/rad.m
@@ -70,5 +70,6 @@ endfunction
%! [m, r] = rad (infsup (2.5, 3.5));
%! assert (m, 3);
%! assert (r, .5);
-%!test "from the documentation string";
-%! assert (rad (infsup (2.5, 3.5)), .5);
+
+%!# from the documentation string
+%!assert (rad (infsup (2.5, 3.5)), .5);
diff --git a/inst/@infsup/rdivide.m b/inst/@infsup/rdivide.m
index d50482f..be2dfc5 100644
--- a/inst/@infsup/rdivide.m
+++ b/inst/@infsup/rdivide.m
@@ -58,10 +58,10 @@ elseif (isa (y, "infsupdec"))
endif
## Short-circuit evaluation for 1 ./ x
-if (all (all (x.inf == 1 & x.sup == 1)))
+if (all (vec (x.inf == 1 & x.sup == 1)))
result = recip (y);
## Resize, if scalar × matrix
- if (isscalar (x.inf) ~= isscalar (y.inf))
+ if (not (size_equal (x.inf, y.inf)))
result.inf = ones (size (x.inf)) .* result.inf;
result.sup = ones (size (x.inf)) .* result.sup;
endif
@@ -69,7 +69,7 @@ if (all (all (x.inf == 1 & x.sup == 1)))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -90,40 +90,44 @@ q10 = x.inf < 0 & 0 < x.sup & y.inf > 0;
l = u = zeros (size (x.inf));
-l (q1) = mpfr_function_d ('rdivide', -inf, x.sup (q1), y.inf (q1));
-l (q2) = mpfr_function_d ('rdivide', -inf, x.inf (q2), y.inf (q2));
-l (q3) = mpfr_function_d ('rdivide', -inf, x.sup (q3), y.inf (q3));
+l (q1) = mpfr_function_d ('rdivide', -inf, x.sup(q1), y.inf(q1));
+l (q2) = mpfr_function_d ('rdivide', -inf, x.inf(q2), y.inf(q2));
+l (q3) = mpfr_function_d ('rdivide', -inf, x.sup(q3), y.inf(q3));
l (q4) = -inf;
-l (q5) = mpfr_function_d ('rdivide', -inf, x.sup (q5), y.sup (q5));
-l (q6) = mpfr_function_d ('rdivide', -inf, x.inf (q6), y.sup (q6));
+l (q5) = mpfr_function_d ('rdivide', -inf, x.sup(q5), y.sup(q5));
+l (q6) = mpfr_function_d ('rdivide', -inf, x.inf(q6), y.sup(q6));
l (q7) = -inf;
-l (q8) = mpfr_function_d ('rdivide', -inf, x.inf (q8), y.sup (q8));
-l (q9) = mpfr_function_d ('rdivide', -inf, x.sup (q9), y.sup (q9));
-l (q10) = mpfr_function_d ('rdivide', -inf, x.inf (q10), y.inf (q10));
-u (q1) = mpfr_function_d ('rdivide', +inf, x.inf (q1), y.sup (q1));
-u (q2) = mpfr_function_d ('rdivide', +inf, x.sup (q2), y.sup (q2));
+l (q8) = mpfr_function_d ('rdivide', -inf, x.inf(q8), y.sup(q8));
+l (q9) = mpfr_function_d ('rdivide', -inf, x.sup(q9), y.sup(q9));
+l (q10) = mpfr_function_d ('rdivide', -inf, x.inf(q10), y.inf(q10));
+u (q1) = mpfr_function_d ('rdivide', +inf, x.inf(q1), y.sup(q1));
+u (q2) = mpfr_function_d ('rdivide', +inf, x.sup(q2), y.sup(q2));
u (q3) = inf;
-u (q4) = mpfr_function_d ('rdivide', +inf, x.sup (q4), y.sup (q4));
-u (q5) = mpfr_function_d ('rdivide', +inf, x.inf (q5), y.inf (q5));
-u (q6) = mpfr_function_d ('rdivide', +inf, x.sup (q6), y.inf (q6));
-u (q7) = mpfr_function_d ('rdivide', +inf, x.inf (q7), y.inf (q7));
+u (q4) = mpfr_function_d ('rdivide', +inf, x.sup(q4), y.sup(q4));
+u (q5) = mpfr_function_d ('rdivide', +inf, x.inf(q5), y.inf(q5));
+u (q6) = mpfr_function_d ('rdivide', +inf, x.sup(q6), y.inf(q6));
+u (q7) = mpfr_function_d ('rdivide', +inf, x.inf(q7), y.inf(q7));
u (q8) = inf;
-u (q9) = mpfr_function_d ('rdivide', +inf, x.inf (q9), y.sup (q9));
-u (q10) = mpfr_function_d ('rdivide', +inf, x.sup (q10), y.inf (q10));
+u (q9) = mpfr_function_d ('rdivide', +inf, x.inf(q9), y.sup(q9));
+u (q10) = mpfr_function_d ('rdivide', +inf, x.sup(q10), y.inf(q10));
entireresult = (y.inf < 0 & y.sup > 0) | (x.inf < 0 & x.sup > 0 & ...
(y.inf == 0 | y.sup == 0));
-l (entireresult) = -inf;
-u (entireresult) = inf;
+l(entireresult) = -inf;
+u(entireresult) = inf;
zeroresult = x.inf == 0 & x.sup == 0;
-l (zeroresult) = u (zeroresult) = 0;
+l(zeroresult) = u(zeroresult) = 0;
+
+l(l == 0) = -0;
emptyresult = isempty (x) | isempty (y) | (y.inf == 0 & y.sup == 0);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+result = infsup ();
+result.inf = l;
+result.sup = u;
endfunction
@@ -147,7 +151,7 @@ select = (x.inf >= 0 | x.sup <= 0) & ...
not (x.inf == 0 & x.sup == 0) & ...
# x is not empty
x.inf < inf;
-if (any (any (select)))
+if (any (select(:)))
## recip is monotonically decreasing
l(select) = mpfr_function_d ('rdivide', -inf, 1, x.sup(select));
u(select) = mpfr_function_d ('rdivide', +inf, 1, x.inf(select));
@@ -155,15 +159,20 @@ endif
## singularity at x = 0
select = x.inf < 0 & x.sup > 0;
-if (any (any (select)))
+if (any (select(:)))
l(select) = -inf;
u(select) = +inf;
endif
-result = infsup (l, u);
+l(l == 0) = -0;
+
+result = infsup ();
+result.inf = l;
+result.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (infsup (2, 3) ./ infsup (1, 2) == infsup (1, 3));
+%!# from the documentation string
+%!assert (infsup (2, 3) ./ infsup (1, 2) == infsup (1, 3));
+
%!assert (1 ./ infsup (1, 4) == infsup (0.25, 1));
diff --git a/inst/@infsup/realsqrt.m b/inst/@infsup/realsqrt.m
index 650dd02..b163301 100644
--- a/inst/@infsup/realsqrt.m
+++ b/inst/@infsup/realsqrt.m
@@ -34,18 +34,30 @@
## Keywords: interval
## Created: 2014-10-01
-function result = realsqrt (x)
+function x = realsqrt (x)
l = mpfr_function_d ('realsqrt', -inf, max (0, x.inf));
u = mpfr_function_d ('realsqrt', +inf, max (0, x.sup));
emptyresult = isempty (x) | x.sup < 0;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (realsqrt (infsup (-6, 4)) == infsup (0, 2));
+%!# from the documentation string
+%!assert (realsqrt (infsup (-6, 4)) == infsup (0, 2));
+
+%!# correct use of signed zeros
+%!test
+%! x = realsqrt (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = realsqrt (infsup (0, 2));
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/recip.m b/inst/@infsup/recip.m
deleted file mode 100644
index 5da34d9..0000000
--- a/inst/@infsup/recip.m
+++ /dev/null
@@ -1,52 +0,0 @@
-## Copyright 2015-2016 Oliver Heimlich
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @documentencoding UTF-8
-## @defmethod {@@infsup} recip (@var{X})
-##
-## Compute the reciprocal of @var{X}.
-##
-## THIS FUNCTION IS DEPRECATED AND WILL BE REMOVED IN A FUTURE RELEASE OF THIS
-## SOFTWARE. PLEASE USE @code{1 ./ @var{X}} INSTEAD.
-##
-## Accuracy: The result is a tight enclosure.
-##
-## @example
-## @group
-## recip (infsup (1, 4)) @c doctest: +SKIP
-## @result{} ans = [0.25, 1]
-## @end group
-## @end example
-## @seealso{@@infsup/inv, @@infsup/rdivide}
-## @end defmethod
-
-## Author: Oliver Heimlich
-## Keywords: interval
-## Created: 2015-11-07
-
-function result = recip (x)
-
-if (nargin ~= 1)
- print_usage ();
- return
-endif
-
-warning ("interval:deprecated", ...
- "recip: This function is deprecated, please use 1 ./ x instead")
-
-result = rdivide (1, x);
-
-endfunction
diff --git a/inst/@infsup/reshape.m b/inst/@infsup/reshape.m
index 39e8ff6..60bf452 100644
--- a/inst/@infsup/reshape.m
+++ b/inst/@infsup/reshape.m
@@ -41,7 +41,7 @@
## Keywords: interval
## Created: 2015-04-19
-function result = reshape (a, m, n)
+function a = reshape (a, m, n)
switch nargin
case 2
@@ -49,8 +49,8 @@ switch nargin
error ("interval:InvalidOperand", ...
"reshape: SIZE must have 2 dimensions")
else
- n = m (2);
- m = m (1);
+ n = m(2);
+ m = m(1);
endif
case 3
## Nothing to do
@@ -64,10 +64,8 @@ if (not (isa (a, "infsup")))
return
endif
-l = reshape (a.inf, m, n);
-u = reshape (a.sup, m, n);
-
-result = infsup (l, u);
+a.inf = reshape (a.inf, m, n);
+a.sup = reshape (a.sup, m, n);
endfunction
diff --git a/inst/@infsup/resize.m b/inst/@infsup/resize.m
index 0300022..79b7636 100644
--- a/inst/@infsup/resize.m
+++ b/inst/@infsup/resize.m
@@ -23,7 +23,7 @@
##
## In the result, element with certain indices is equal to the corresponding
## element of @var{X} if the indices are within the bounds of @var{X};
-## otherwise, the element is set to the empty interval.
+## otherwise, the element is set to zero.
##
## If only @var{M} is supplied, and it is a scalar, the dimension of the result
## is @var{M}-by- at var{M}. If @var{M} and @var{N} are all scalars, then the
@@ -35,10 +35,10 @@
## @group
## resize (infsup (magic (3)), 4, 2)
## @result{} ans = 4×2 interval matrix
-## [8] [1]
-## [3] [5]
-## [4] [9]
-## [Empty] [Empty]
+## [8] [1]
+## [3] [5]
+## [4] [9]
+## [0] [0]
## @end group
## @end example
## @seealso{@@infsup/reshape, @@infsup/cat, @@infsup/postpad, @@infsup/prepad}
@@ -48,7 +48,7 @@
## Keywords: interval
## Created: 2015-04-19
-function result = resize (x, m, n)
+function x = resize (x, m, n)
switch nargin
case 2
@@ -60,8 +60,8 @@ switch nargin
error ("interval:InvalidOperand", ...
"resize: no more than 2 dimensions are supported")
else
- n = m (2);
- m = m (1);
+ n = m(2);
+ m = m(1);
endif
case 3
## Nothing to do
@@ -75,21 +75,11 @@ if (not (isa (x, "infsup")))
return
endif
-l = resize (x.inf, m, n);
-u = resize (x.sup, m, n);
+x.inf = resize (x.inf, m, n);
+x.sup = resize (x.sup, m, n);
-## Implicit new elements in the matrices take the value 0. We can detect them
-## in the inf matrix, because zeros in the inf matrix are set to -0 by the
-## infsup constructor.
-
-newelements = not (signbit (l)) & (l == 0);
-
-## Set the implicit new elements to [Empty].
-l (newelements) = inf;
-u (newelements) = -inf;
-
-result = infsup (l, u);
+x.inf(x.inf == 0) = -0;
endfunction
-%!assert (resize (infsup (magic (3)), 4, 2) == [infsup([8, 1; 3, 5; 4, 9]); infsup([inf, inf], [-inf, -inf])]);
+%!assert (resize (infsup (magic (3)), 4, 2) == infsup ([8, 1; 3, 5; 4, 9; 0, 0]));
diff --git a/inst/@infsup/round.m b/inst/@infsup/round.m
index 1a22e4c..07a6973 100644
--- a/inst/@infsup/round.m
+++ b/inst/@infsup/round.m
@@ -37,36 +37,53 @@
## Keywords: interval
## Created: 2014-10-04
-function result = round (x)
+function x = round (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = infsup (round (x.inf), round (x.sup));
+x.inf = round (x.inf);
+x.sup = round (x.sup);
+
+x.inf(x.inf == 0) = -0;
+x.sup(x.sup == 0) = +0;
endfunction
-%!test "Empty interval";
-%! assert (round (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (round (infsup (0)) == infsup (0));
-%! assert (round (infsup (0.5)) == infsup (1));
-%! assert (round (infsup (0.25)) == infsup (0));
-%! assert (round (infsup (0.75)) == infsup (1));
-%! assert (round (infsup (-0.5)) == infsup (-1));
-%!test "Bounded intervals";
-%! assert (round (infsup (-0.5, 0)) == infsup (-1, 0));
-%! assert (round (infsup (0, 0.5)) == infsup (0, 1));
-%! assert (round (infsup (0.25, 0.5)) == infsup (0, 1));
-%! assert (round (infsup (-1, 0)) == infsup (-1, 0));
-%! assert (round (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (round (infsup (-realmin, realmin)) == infsup (0));
-%! assert (round (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
-%!test "Unbounded intervals";
-%! assert (round (infsup (-realmin, inf)) == infsup (0, inf));
-%! assert (round (infsup (-realmax, inf)) == infsup (-realmax, inf));
-%! assert (round (infsup (-inf, realmin)) == infsup (-inf, 0));
-%! assert (round (infsup (-inf, realmax)) == infsup (-inf, realmax));
-%! assert (round (infsup (-inf, inf)) == infsup (-inf, inf));
+%!# Empty interval
+%!assert (round (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (round (infsup (0)) == infsup (0));
+%!assert (round (infsup (0.5)) == infsup (1));
+%!assert (round (infsup (0.25)) == infsup (0));
+%!assert (round (infsup (0.75)) == infsup (1));
+%!assert (round (infsup (-0.5)) == infsup (-1));
+
+%!# Bounded intervals
+%!assert (round (infsup (-0.5, 0)) == infsup (-1, 0));
+%!assert (round (infsup (0, 0.5)) == infsup (0, 1));
+%!assert (round (infsup (0.25, 0.5)) == infsup (0, 1));
+%!assert (round (infsup (-1, 0)) == infsup (-1, 0));
+%!assert (round (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (round (infsup (-realmin, realmin)) == infsup (0));
+%!assert (round (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
+
+%!# Unbounded intervals
+%!assert (round (infsup (-realmin, inf)) == infsup (0, inf));
+%!assert (round (infsup (-realmax, inf)) == infsup (-realmax, inf));
+%!assert (round (infsup (-inf, realmin)) == infsup (-inf, 0));
+%!assert (round (infsup (-inf, realmax)) == infsup (-inf, realmax));
+%!assert (round (infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# correct use of signed zeros
+%!test
+%! x = round (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = round (infsup (-0.25, 0.25));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/roundb.m b/inst/@infsup/roundb.m
index b2c9133..a13b703 100644
--- a/inst/@infsup/roundb.m
+++ b/inst/@infsup/roundb.m
@@ -37,38 +37,55 @@
## Keywords: interval
## Created: 2014-10-04
-function result = roundb (x)
+function x = roundb (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = infsup (roundb (x.inf), roundb (x.sup));
+x.inf = roundb (x.inf);
+x.sup = roundb (x.sup);
+
+x.inf(x.inf == 0) = -0;
+x.sup(x.sup == 0) = +0;
endfunction
-%!test "Empty interval";
-%! assert (roundb (infsup ()) == infsup ());
-%!test "Singleton intervals";
-%! assert (roundb (infsup (0)) == infsup (0));
-%! assert (roundb (infsup (0.5)) == infsup (0));
-%! assert (roundb (infsup (0.25)) == infsup (0));
-%! assert (roundb (infsup (0.75)) == infsup (1));
-%! assert (roundb (infsup (1.5)) == infsup (2));
-%! assert (roundb (infsup (-0.5)) == infsup (0));
-%! assert (roundb (infsup (-1.5)) == infsup (-2));
-%!test "Bounded intervals";
-%! assert (roundb (infsup (-0.5, 0)) == infsup (0));
-%! assert (roundb (infsup (0, 0.5)) == infsup (0));
-%! assert (roundb (infsup (0.25, 0.5)) == infsup (0));
-%! assert (roundb (infsup (-1, 0)) == infsup (-1, 0));
-%! assert (roundb (infsup (-1, 1)) == infsup (-1, 1));
-%! assert (roundb (infsup (-realmin, realmin)) == infsup (0));
-%! assert (roundb (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
-%!test "Unbounded intervals";
-%! assert (roundb (infsup (-realmin, inf)) == infsup (0, inf));
-%! assert (roundb (infsup (-realmax, inf)) == infsup (-realmax, inf));
-%! assert (roundb (infsup (-inf, realmin)) == infsup (-inf, 0));
-%! assert (roundb (infsup (-inf, realmax)) == infsup (-inf, realmax));
-%! assert (roundb (infsup (-inf, inf)) == infsup (-inf, inf));
+%!# Empty interval
+%!assert (roundb (infsup ()) == infsup ());
+
+%!# Singleton intervals
+%!assert (roundb (infsup (0)) == infsup (0));
+%!assert (roundb (infsup (0.5)) == infsup (0));
+%!assert (roundb (infsup (0.25)) == infsup (0));
+%!assert (roundb (infsup (0.75)) == infsup (1));
+%!assert (roundb (infsup (1.5)) == infsup (2));
+%!assert (roundb (infsup (-0.5)) == infsup (0));
+%!assert (roundb (infsup (-1.5)) == infsup (-2));
+
+%!# Bounded intervals
+%!assert (roundb (infsup (-0.5, 0)) == infsup (0));
+%!assert (roundb (infsup (0, 0.5)) == infsup (0));
+%!assert (roundb (infsup (0.25, 0.5)) == infsup (0));
+%!assert (roundb (infsup (-1, 0)) == infsup (-1, 0));
+%!assert (roundb (infsup (-1, 1)) == infsup (-1, 1));
+%!assert (roundb (infsup (-realmin, realmin)) == infsup (0));
+%!assert (roundb (infsup (-realmax, realmax)) == infsup (-realmax, realmax));
+
+%!# Unbounded intervals
+%!assert (roundb (infsup (-realmin, inf)) == infsup (0, inf));
+%!assert (roundb (infsup (-realmax, inf)) == infsup (-realmax, inf));
+%!assert (roundb (infsup (-inf, realmin)) == infsup (-inf, 0));
+%!assert (roundb (infsup (-inf, realmax)) == infsup (-inf, realmax));
+%!assert (roundb (infsup (-inf, inf)) == infsup (-inf, inf));
+
+%!# correct use of signed zeros
+%!test
+%! x = roundb (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
+%!test
+%! x = roundb (infsup (-0.25, 0.25));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/rows.m b/inst/@infsup/rows.m
index cb49cb3..95a814e 100644
--- a/inst/@infsup/rows.m
+++ b/inst/@infsup/rows.m
@@ -36,5 +36,4 @@ result = rows (a.inf);
endfunction
-%!test;
-%! assert (rows (infsup (zeros (3, 4))), 3);
+%!assert (rows (infsup (zeros (3, 4))), 3);
diff --git a/inst/@infsup/rsqrt.m b/inst/@infsup/rsqrt.m
index b9cabce..17969e4 100644
--- a/inst/@infsup/rsqrt.m
+++ b/inst/@infsup/rsqrt.m
@@ -34,18 +34,26 @@
## Keywords: interval
## Created: 2015-03-15
-function result = rsqrt (x)
+function x = rsqrt (x)
l = mpfr_function_d ('rsqrt', -inf, max (0, x.sup));
u = mpfr_function_d ('rsqrt', +inf, max (0, x.inf));
emptyresult = isempty (x) | x.sup <= 0;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (rsqrt (infsup (-6, 4)) == infsup (.5, inf));
+%!# from the documentation string
+%!assert (rsqrt (infsup (-6, 4)) == infsup (.5, inf));
+
+%!# correct use of signed zeros
+%!test
+%! x = rsqrt (infsup (0, inf));
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/sdist.m b/inst/@infsup/sdist.m
index c0ffe0e..388db89 100644
--- a/inst/@infsup/sdist.m
+++ b/inst/@infsup/sdist.m
@@ -61,7 +61,7 @@ if (not (isa (y, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (x.inf) ~= isscalar (y.inf))
+if (not (size_equal (x.inf, y.inf)))
x.inf = ones (size (y.inf)) .* x.inf;
x.sup = ones (size (y.inf)) .* x.sup;
y.inf = ones (size (x.inf)) .* y.inf;
@@ -70,20 +70,20 @@ endif
result = zeros (size (x.inf));
select = x.sup < y.inf;
-if (any (any (select)))
- result (select) = ...
- mpfr_function_d ('minus', -inf, x.sup (select), y.inf (select));
+if (any (select(:)))
+ result(select) = ...
+ mpfr_function_d ('minus', -inf, x.sup(select), y.inf(select));
endif
select = x.inf > y.sup;
-if (any (any (select)))
- result (select) = max (result (select), ...
- mpfr_function_d ('minus', +inf, x.inf (select), y.sup (select)));
+if (any (select(:)))
+ result(select) = max (result(select), ...
+ mpfr_function_d ('minus', +inf, x.inf(select), y.sup(select)));
endif
-result (isempty (x) | isempty (y)) = nan ();
+result(isempty (x) | isempty (y)) = nan ();
endfunction
-%!test "from the documentation string";
-%! assert (sdist (infsup (0, 6), infsup (7, 20)), -1);
-%! assert (sdist (infsup (3, 5), infsup (0, 1)), 2);
+%!# from the documentation string
+%!assert (sdist (infsup (0, 6), infsup (7, 20)), -1);
+%!assert (sdist (infsup (3, 5), infsup (0, 1)), 2);
diff --git a/inst/@infsup/sec.m b/inst/@infsup/sec.m
index 55a4f96..401f2ab 100644
--- a/inst/@infsup/sec.m
+++ b/inst/@infsup/sec.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = sec (x)
+function x = sec (x)
if (nargin ~= 1)
print_usage ();
@@ -46,41 +46,42 @@ l = u = derivl = derivu = zeros (size (x.inf));
## Check, if wid (x) is certainly greater than 2*pi. This can save the
## computation if some values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-certainlysingularity = width >= pi.sup;
+persistent pi = infsup ("pi");
+certainlysingularity = width >= sup (pi);
## We simply compute the secant for both endpoints.
select = not (certainlysingularity);
-l (select) = min (...
- mpfr_function_d ('sec', -inf, x.inf (select)), ...
- mpfr_function_d ('sec', -inf, x.sup (select)));
-u (select) = max (...
- mpfr_function_d ('sec', inf, x.inf (select)), ...
- mpfr_function_d ('sec', inf, x.sup (select)));
+l(select) = min (...
+ mpfr_function_d ('sec', -inf, x.inf(select)), ...
+ mpfr_function_d ('sec', -inf, x.sup(select)));
+u(select) = max (...
+ mpfr_function_d ('sec', inf, x.inf(select)), ...
+ mpfr_function_d ('sec', inf, x.sup(select)));
## A change of sign is a sufficient singularity indicator
certainlysingularity = certainlysingularity | (select & sign (l) ~= sign (u));
-l (certainlysingularity) = -inf;
-u (certainlysingularity) = inf;
+l(certainlysingularity) = -inf;
+u(certainlysingularity) = inf;
## Check, whether the interval contains a local extremum using the derivative
select = not (certainlysingularity);
-derivl (select) = mpfr_function_d ('sec', 0, x.inf (select)) .* ...
- mpfr_function_d ('tan', 0, x.inf (select));
-derivu (select) = mpfr_function_d ('sec', 0, x.sup (select)) .* ...
- mpfr_function_d ('tan', 0, x.sup (select));
+derivl(select) = mpfr_function_d ('sec', 0, x.inf(select)) .* ...
+ mpfr_function_d ('tan', 0, x.inf(select));
+derivu(select) = mpfr_function_d ('sec', 0, x.sup(select)) .* ...
+ mpfr_function_d ('tan', 0, x.sup(select));
hasextremum = select & ((derivl <= 0 & derivu >= 0) | ...
(derivl >= 0 & derivu <= 0));
-l (hasextremum & l > 0) = 1;
-u (hasextremum & u < 0) = -1;
+l(hasextremum & l > 0) = 1;
+u(hasextremum & u < 0) = -1;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sec (infsup (1)) == "[0x1.D9CF0F125CC29, 0x1.D9CF0F125CC2A]");
+%!# from the documentation string
+%!assert (sec (infsup (1)) == "[0x1.D9CF0F125CC29, 0x1.D9CF0F125CC2A]");
diff --git a/inst/@infsup/sech.m b/inst/@infsup/sech.m
index 0e5002e..bf8d470 100644
--- a/inst/@infsup/sech.m
+++ b/inst/@infsup/sech.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2015-03-15
-function result = sech (x)
+function x = sech (x)
if (nargin ~= 1)
print_usage ();
@@ -45,12 +45,20 @@ l = mpfr_function_d ('sech', -inf, mag (x));
u = mpfr_function_d ('sech', +inf, mig (x));
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sech (infsup (1)) == "[0x1.4BCDC50ED6BE7p-1, 0x1.4BCDC50ED6BE8p-1]");
+%!# from the documentation string
+%!assert (sech (infsup (1)) == "[0x1.4BCDC50ED6BE7p-1, 0x1.4BCDC50ED6BE8p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = sech (infsup (0, inf));
+%! assert (signbit (inf (x)));
diff --git a/inst/@infsup/setdiff.m b/inst/@infsup/setdiff.m
index 2204336..f848a8d 100644
--- a/inst/@infsup/setdiff.m
+++ b/inst/@infsup/setdiff.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2015-04-03
-function result = setdiff (a, b)
+function a = setdiff (a, b)
if (nargin ~= 2)
print_usage ();
@@ -50,7 +50,7 @@ if (not (isa (b, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (a.inf) ~= isscalar (b.inf))
+if (not (size_equal (a.inf, b.inf)))
a.inf = ones (size (b.inf)) .* a.inf;
a.sup = ones (size (b.inf)) .* a.sup;
b.inf = ones (size (a.inf)) .* b.inf;
@@ -61,16 +61,20 @@ l = a.inf;
u = a.sup;
select = b.sup >= a.sup & b.inf > a.inf;
-u (select) = min (u (select), b.inf (select));
+u(select) = min (u(select), b.inf(select));
select = b.inf <= a.inf & b.sup < a.sup;
-l (select) = max (l (select), b.sup (select));
+l(select) = max (l(select), b.sup(select));
emptyresult = b.inf <= a.inf & b.sup >= a.sup;
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+u(u == 0) = +0;
+
+a.inf = l;
+a.sup = u;
endfunction
@@ -79,5 +83,6 @@ endfunction
%!assert (isempty (setdiff (infsup (1, 3), infsup (-inf, inf))));
%!assert (isempty (setdiff (infsup (1, 3), infsup (1, 4))));
%!assert (setdiff (infsup (-inf, inf), infsup (1, 4)) == infsup (-inf, inf));
-%!test "from the documentation string";
+
+%!# from the documentation string
%! assert (setdiff (infsup (1, 3), infsup (2, 4)) == infsup (1, 2));
diff --git a/inst/@infsup/setxor.m b/inst/@infsup/setxor.m
index c93bcf0..5c25e21 100644
--- a/inst/@infsup/setxor.m
+++ b/inst/@infsup/setxor.m
@@ -58,7 +58,7 @@ if (not (isa (b, "infsup")))
endif
## Resize, if scalar × matrix
-if (isscalar (a.inf) ~= isscalar (b.inf))
+if (not (size_equal (a.inf, b.inf)))
a.inf = ones (size (b.inf)) .* a.inf;
a.sup = ones (size (b.inf)) .* a.sup;
b.inf = ones (size (a.inf)) .* b.inf;
@@ -78,37 +78,54 @@ l = b1;
u = b4;
select = a.inf == b.inf;
-l (select) = b3 (select);
+l(select) = b3(select);
select = a.sup == b.sup;
-u (select) = b2 (select);
+u(select) = b2(select);
select = a.inf == b.inf & a.sup == b.sup;
-l (select) = inf;
-u (select) = -inf;
+l(select) = inf;
+u(select) = -inf;
-c = infsup (l, u);
+l(l == 0) = -0;
+u(u == 0) = +0;
+
+c = infsup ();
+c.inf = l;
+c.sup = u;
if (nargout > 1)
select = isempty (a) | isempty (b);
- b1 (select) = a.inf (select);
- b2 (select) = a.sup (select);
- b3 (select) = b.inf (select);
- b4 (select) = b.sup (select);
+ b1(select) = a.inf(select);
+ b2(select) = a.sup(select);
+ b3(select) = b.inf(select);
+ b4(select) = b.sup(select);
l1 = b1;
u1 = b2;
select = a.inf == b.inf;
- l1 (select) = inf;
- u1 (select) = -inf;
- c1 = infsup (l1, u1);
+ l1(select) = inf;
+ u1(select) = -inf;
+
+ l1(l1 == 0) = -0;
+ u1(u1 == 0) = +0;
+
+ c1 = infsup ();
+ c1.inf = l1;
+ c1.sup = u1;
l2 = b3;
u2 = b4;
select = a.sup == b.sup;
- l2 (select) = inf;
- u2 (select) = -inf;
- c2 = infsup (l2, u2);
+ l2(select) = inf;
+ u2(select) = -inf;
+
+ l2(l2 == 0) = -0;
+ u2(u2 == 0) = +0;
+
+ c2 = infsup ();
+ c2.inf = l2;
+ c2.sup = u2;
endif
endfunction
@@ -138,7 +155,9 @@ endfunction
%! assert (z == infsup (2.5, 3));
%! assert (z1 == infsup ());
%! assert (z2 == infsup (2.5, 3));
-%!test "from the documentation string";
+
+%!# from the documentation string
+%!test
%! [z, z1, z2] = setxor (infsup (1, 3), infsup (2, 4));
%! assert (z == infsup (1, 4));
%! assert (z1 == infsup (1, 2));
diff --git a/inst/@infsup/sign.m b/inst/@infsup/sign.m
index 3c37e93..0d0efac 100644
--- a/inst/@infsup/sign.m
+++ b/inst/@infsup/sign.m
@@ -37,7 +37,7 @@
## Keywords: interval
## Created: 2014-10-04
-function result = sign (x)
+function x = sign (x)
if (nargin ~= 1)
print_usage ();
@@ -48,14 +48,23 @@ l = sign (x.inf);
u = sign (x.sup);
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sign (infsup (2, 3)) == infsup (1));
-%! assert (sign (infsup (0, 5)) == infsup (0, 1));
-%! assert (sign (infsup (-17)) == infsup (-1));
+%!# from the documentation string
+%!assert (sign (infsup (2, 3)) == infsup (1));
+%!assert (sign (infsup (0, 5)) == infsup (0, 1));
+%!assert (sign (infsup (-17)) == infsup (-1));
+
+%!# correct use of signed zeros
+%!test
+%! x = sign (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sin.m b/inst/@infsup/sin.m
index 4669831..91ecff8 100644
--- a/inst/@infsup/sin.m
+++ b/inst/@infsup/sin.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-05
-function result = sin (x)
+function x = sin (x)
if (nargin ~= 1)
print_usage ();
@@ -46,47 +46,56 @@ l = u = cossignl = cossignu = zeros (size (x.inf));
## Check, if wid (x) is certainly greater than 2*pi. This can save the
## computation if some sine values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-twopi.sup = 2 * pi.sup;
-certainlyfullperiod = width >= twopi.sup;
-l (certainlyfullperiod) = -1;
-u (certainlyfullperiod) = 1;
+persistent pi = infsup ("pi");
+persistent twopi = 2 .* pi;
+certainlyfullperiod = width >= sup (twopi);
+l(certainlyfullperiod) = -1;
+u(certainlyfullperiod) = 1;
possiblynotfullperiod = not (certainlyfullperiod);
-l (possiblynotfullperiod) = min (...
- mpfr_function_d ('sin', -inf, x.inf (possiblynotfullperiod)), ...
- mpfr_function_d ('sin', -inf, x.sup (possiblynotfullperiod)));
-u (possiblynotfullperiod) = max (...
- mpfr_function_d ('sin', inf, x.inf (possiblynotfullperiod)), ...
- mpfr_function_d ('sin', inf, x.sup (possiblynotfullperiod)));
+l(possiblynotfullperiod) = min (...
+ mpfr_function_d ('sin', -inf, x.inf(possiblynotfullperiod)), ...
+ mpfr_function_d ('sin', -inf, x.sup(possiblynotfullperiod)));
+u(possiblynotfullperiod) = max (...
+ mpfr_function_d ('sin', inf, x.inf(possiblynotfullperiod)), ...
+ mpfr_function_d ('sin', inf, x.sup(possiblynotfullperiod)));
## We use sign (cos) to know the gradient at the boundaries.
-cossignl (possiblynotfullperiod) = sign (...
- mpfr_function_d ('cos', .5, x.inf (possiblynotfullperiod)));
-cossignu (possiblynotfullperiod) = sign (...
- mpfr_function_d ('cos', .5, x.sup (possiblynotfullperiod)));
+cossignl(possiblynotfullperiod) = sign (...
+ mpfr_function_d ('cos', .5, x.inf(possiblynotfullperiod)));
+cossignu(possiblynotfullperiod) = sign (...
+ mpfr_function_d ('cos', .5, x.sup(possiblynotfullperiod)));
## In case of sign (cos) == 0, we conservatively use sign (cos) of nextout.
-cossignl (cossignl == 0) = sign (l (cossignl == 0));
-cossignu (cossignu == 0) = (-1) * sign (u (cossignu == 0));
+cossignl(cossignl == 0) = sign (l(cossignl == 0));
+cossignu(cossignu == 0) = (-1) * sign (u(cossignu == 0));
containsinf = possiblynotfullperiod & ((cossignl == -1 & cossignu == 1) | ...
(cossignl == cossignu & ...
- width >= pi.sup));
-l (containsinf) = -1;
+ width >= sup (pi)));
+l(containsinf) = -1;
containssup = possiblynotfullperiod & ((cossignl == 1 & cossignu == -1) | ...
(cossignl == cossignu & ...
- width >= pi.sup));
-u (containssup) = 1;
+ width >= sup (pi)));
+u(containssup) = 1;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sin (infsup (1)) == "[0x1.AED548F090CEEp-1, 0x1.AED548F090CEFp-1]");
+%!# from the documentation string
+%!assert (sin (infsup (1)) == "[0x1.AED548F090CEEp-1, 0x1.AED548F090CEFp-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = sin (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sinh.m b/inst/@infsup/sinh.m
index 0ba8258..5a4731f 100644
--- a/inst/@infsup/sinh.m
+++ b/inst/@infsup/sinh.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-06
-function result = sinh (x)
+function x = sinh (x)
if (nargin ~= 1)
print_usage ();
@@ -45,12 +45,21 @@ l = mpfr_function_d ('sinh', -inf, x.inf);
u = mpfr_function_d ('sinh', +inf, x.sup);
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sinh (infsup (1)) == "[0x1.2CD9FC44EB982, 0x1.2CD9FC44EB983]");
+%!# from the documentation string
+%!assert (sinh (infsup (1)) == "[0x1.2CD9FC44EB982, 0x1.2CD9FC44EB983]");
+
+%!# correct use of signed zeros
+%!test
+%! x = sinh (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sinrev.m b/inst/@infsup/sinrev.m
index 98b5c68..09e7824 100644
--- a/inst/@infsup/sinrev.m
+++ b/inst/@infsup/sinrev.m
@@ -59,29 +59,29 @@ arcsine = asin (c);
result = x;
## Resize, if scalar × matrix
-if (isscalar (arcsine.inf) ~= isscalar (result.inf))
+if (not (size_equal (arcsine.inf, result.inf)))
arcsine.inf = ones (size (result.inf)) .* arcsine.inf;
arcsine.sup = ones (size (result.inf)) .* arcsine.sup;
result.inf = ones (size (arcsine.inf)) .* result.inf;
result.sup = ones (size (arcsine.inf)) .* result.sup;
endif
-result.inf (isempty (arcsine)) = inf;
-result.sup (isempty (arcsine)) = -inf;
+result.inf(isempty (arcsine)) = inf;
+result.sup(isempty (arcsine)) = -inf;
idx.type = '()';
-pi = infsup ("pi");
+persistent pi = infsup ("pi");
select = not (isempty (result)) ...
& not (subset (infsup (-pi.sup / 2, pi.sup / 2), arcsine));
-if (any (any (select)))
+if (any (select(:)))
## Find a smaller upper bound for x, if the restriction from c allows it
u = inf (size (result.inf));
select_u = select & result.sup < inf;
## Find n, such that result.sup is within a distance of pi/2 around n * pi.
n = result.sup;
- n (select_u) = ceil (floor (sup (n (select_u) ./ (pi ./ 2))) ./ 2);
+ n(select_u) = ceil (floor (sup (n(select_u) ./ (pi ./ 2))) ./ 2);
arcsineshifted = arcsine;
idx.subs = {(select_u & rem (n, 2) == 0)};
arcsineshifted = subsasgn (arcsineshifted, idx, ...
@@ -90,17 +90,17 @@ if (any (any (select)))
arcsineshifted = subsasgn (arcsineshifted, idx, ...
subsref (n, idx) .* pi - subsref (arcsineshifted, idx));
overlapping = not (isempty (intersect (result, arcsineshifted)));
- u (select_u & overlapping) = ...
- min (result.sup (select_u & overlapping), ...
- arcsineshifted.sup (select_u & overlapping));
+ u(select_u & overlapping) = ...
+ min (result.sup(select_u & overlapping), ...
+ arcsineshifted.sup(select_u & overlapping));
m = n;
- m (select_u & ~overlapping) = ...
- mpfr_function_d ('minus', +inf, m (select_u & ~overlapping), 1);
+ m(select_u & ~overlapping) = ...
+ mpfr_function_d ('minus', +inf, m(select_u & ~overlapping), 1);
idx.subs = {(select_u & ~overlapping & rem (n, 2) == 0)};
- u (idx.subs {1}) = ...
+ u(idx.subs{1}) = ...
sup (subsref (m, idx) .* pi - subsref (arcsine, idx));
idx.subs = {(select_u & ~overlapping & rem (n, 2) ~= 0)};
- u (idx.subs {1}) = ...
+ u(idx.subs{1}) = ...
sup (subsref (arcsine, idx) + subsref (m, idx) .* pi);
## Find a larger lower bound for x, if the restriction from c allows it
@@ -108,7 +108,7 @@ if (any (any (select)))
select_l = select & result.inf > -inf;
## Find n, such that result.inf is within a distance of pi/2 around n * pi.
n = result.inf;
- n (select_l) = floor (ceil (inf (n (select_l) ./ (pi ./ 2))) ./ 2);
+ n(select_l) = floor (ceil (inf (n(select_l) ./ (pi ./ 2))) ./ 2);
arcsineshifted = arcsine;
idx.subs = {(select_l & rem (n, 2) == 0)};
arcsineshifted = subsasgn (arcsineshifted, idx, ...
@@ -117,27 +117,27 @@ if (any (any (select)))
arcsineshifted = subsasgn (arcsineshifted, idx, ...
subsref (n, idx) .* pi - subsref (arcsineshifted, idx));
overlapping = not (isempty (intersect (result, arcsineshifted)));
- l (select_l & overlapping) = ...
- max (result.inf (select_l & overlapping), ...
- arcsineshifted.inf (select_l & overlapping));
+ l(select_l & overlapping) = ...
+ max (result.inf(select_l & overlapping), ...
+ arcsineshifted.inf(select_l & overlapping));
m = n;
- m (select_l & ~overlapping) = ...
- mpfr_function_d ('plus', -inf, m (select_l & ~overlapping), 1);
+ m(select_l & ~overlapping) = ...
+ mpfr_function_d ('plus', -inf, m(select_l & ~overlapping), 1);
idx.subs = {(select_l & ~overlapping & rem (n, 2) == 0)};
- l (idx.subs {1}) = ...
+ l(idx.subs {1}) = ...
inf (subsref (m, idx) .* pi - subsref (arcsine, idx));
idx.subs = {(select_l & ~overlapping & rem (n, 2) ~= 0)};
- l (idx.subs {1}) = ...
+ l(idx.subs {1}) = ...
inf (subsref (arcsine, idx) + subsref (m, idx) .* pi);
- result.inf (select) = max (l (select), result.inf (select));
- result.sup (select) = min (u (select), result.sup (select));
+ result.inf(select) = max (l(select), result.inf(select));
+ result.sup(select) = min (u(select), result.sup(select));
- result.inf (result.inf > result.sup) = inf;
- result.sup (result.inf > result.sup) = -inf;
+ result.inf(result.inf > result.sup) = inf;
+ result.sup(result.inf > result.sup) = -inf;
endif
endfunction
-%!test "from the documentation string";
-%! assert (sinrev (infsup (-1), infsup (0, 6)) == "[0x1.2D97C7F3321D2p2, 0x1.2D97C7F3321D3p2]");
+%!# from the documentation string
+%!assert (sinrev (infsup (-1), infsup (0, 6)) == "[0x1.2D97C7F3321D2p2, 0x1.2D97C7F3321D3p2]");
diff --git a/inst/@infsup/size.m b/inst/@infsup/size.m
index af90772..ba130cf 100644
--- a/inst/@infsup/size.m
+++ b/inst/@infsup/size.m
@@ -42,15 +42,14 @@ endif
if (nargin == 1)
if (nargout <= 1)
- varargout {1} = size (a.inf);
+ varargout{1} = size (a.inf);
else
- varargout = mat2cell (size (a.inf) (1 : nargout)', ones (nargout, 1));
+ varargout = mat2cell (size (a.inf)(1 : nargout)', ones (nargout, 1));
endif
else
- varargout {1} = size (a.inf, dim);
+ varargout{1} = size (a.inf, dim);
endif
endfunction
-%!test;
-%! assert (size (infsup (zeros (3, 4))), [3 4]);
+%!assert (size (infsup (zeros (3, 4))), [3 4]);
diff --git a/inst/@infsup/smig.m b/inst/@infsup/smig.m
index f228ab2..9427e46 100644
--- a/inst/@infsup/smig.m
+++ b/inst/@infsup/smig.m
@@ -45,9 +45,9 @@ if (nargin ~= 1)
endif
result = zeros (size (x.inf));
-result (x.inf > 0) = x.inf;
-result (x.sup < 0) = x.sup;
-result (isempty (x)) = nan ();
+result(x.inf > 0) = x.inf;
+result(x.sup < 0) = x.sup;
+result(isempty (x)) = nan ();
endfunction
diff --git a/inst/@infsup/sqr.m b/inst/@infsup/sqr.m
deleted file mode 100644
index 33388e6..0000000
--- a/inst/@infsup/sqr.m
+++ /dev/null
@@ -1,52 +0,0 @@
-## Copyright 2014-2016 Oliver Heimlich
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @documentencoding UTF-8
-## @defmethod {@@infsup} sqr (@var{X})
-##
-## Compute the square for each entry in @var{X}.
-##
-## THIS FUNCTION IS DEPRECATED AND WILL BE REMOVED IN A FUTURE RELEASE OF THIS
-## SOFTWARE. PLEASE USE @code{@var{X} .^ 2} INSTEAD.
-##
-## Accuracy: The result is a tight enclosure.
-##
-## @example
-## @group
-## sqr (infsup (-2, 1)) @c doctest: +SKIP
-## @result{} ans = [0, 4]
-## @end group
-## @end example
-## @seealso{@@infsup/realsqrt, @@infsup/pown, @@infsup/pow}
-## @end defmethod
-
-## Author: Oliver Heimlich
-## Keywords: interval
-## Created: 2014-09-30
-
-function result = sqr (x)
-
-if (nargin ~= 1)
- print_usage ();
- return
-endif
-
-warning ("interval:deprecated", ...
- "sqr: This function is deprecated, please use x .^ 2 instead")
-
-result = power (x, 2);
-
-endfunction
diff --git a/inst/@infsup/sqrrev.m b/inst/@infsup/sqrrev.m
index 2812414..e442e3d 100644
--- a/inst/@infsup/sqrrev.m
+++ b/inst/@infsup/sqrrev.m
@@ -56,11 +56,11 @@ if (not (isa (x, "infsup")))
endif
p = sqrt (c);
-n = - p;
+n = -p;
result = union (intersect (p, x), intersect (n, x));
endfunction
-%!test "from the documentation string";
-%! assert (sqrrev (infsup (-2, 1)) == infsup (-1, 1));
+%!# from the documentation string
+%!assert (sqrrev (infsup (-2, 1)) == infsup (-1, 1));
diff --git a/inst/@infsup/sqrt.m b/inst/@infsup/sqrt.m
index aef2431..6a4b790 100644
--- a/inst/@infsup/sqrt.m
+++ b/inst/@infsup/sqrt.m
@@ -48,5 +48,5 @@ result = realsqrt (x);
endfunction
-%!test "from the documentation string";
-%! assert (sqrt (infsup (-6, 4)) == infsup (0, 2));
+%!# from the documentation string
+%!assert (sqrt (infsup (-6, 4)) == infsup (0, 2));
diff --git a/inst/@infsup/strictprecedes.m b/inst/@infsup/strictprecedes.m
index 23f837a..db87494 100644
--- a/inst/@infsup/strictprecedes.m
+++ b/inst/@infsup/strictprecedes.m
@@ -45,7 +45,7 @@ endif
result = (a.sup < b.inf);
-result (isempty (a) | isempty (b)) = true ();
+result(isempty (a) | isempty (b)) = true ();
endfunction
diff --git a/inst/@infsup/subsasgn.m b/inst/@infsup/subsasgn.m
index 8bf6e18..1feaeac 100644
--- a/inst/@infsup/subsasgn.m
+++ b/inst/@infsup/subsasgn.m
@@ -32,7 +32,7 @@
## Keywords: interval
## Created: 2014-10-29
-function result = subsasgn (A, S, B)
+function A = subsasgn (A, S, B)
if (nargin ~= 3)
print_usage ();
@@ -45,21 +45,21 @@ if (not (isa (B, "infsup")))
B = infsup (B);
elseif (isa (B, "infsupdec"))
## Workaround for bug #42735
- result = subsasgn (A, S, B);
+ A = subsasgn (A, S, B);
return
endif
assert (strcmp (S.type, "()"), "only subscripts with parenthesis allowed");
-l = subsasgn (A.inf, S, B.inf);
-u = subsasgn (A.sup, S, B.sup);
-result = infsup (l, u);
-
+A.inf = subsasgn (A.inf, S, B.inf);
+A.sup = subsasgn (A.sup, S, B.sup);
+A.inf(A.inf == 0) = -0; # any new elements are stored as [-0, +0] internally
+
endfunction
%!test
%! A = infsup (magic (3));
-%! A (4, 4) = 42;
+%! A(4, 4) = 42;
%! assert (inf (A), [magic(3),[0;0;0];0,0,0,42]);
%! assert (sup (A), [magic(3),[0;0;0];0,0,0,42]);
diff --git a/inst/@infsup/subsref.m b/inst/@infsup/subsref.m
index eded67b..4385425 100644
--- a/inst/@infsup/subsref.m
+++ b/inst/@infsup/subsref.m
@@ -51,18 +51,17 @@
## Keywords: interval
## Created: 2014-10-29
-function result = subsref (A, S)
+function A = subsref (A, S)
if (nargin ~= 2)
print_usage ();
return
endif
-switch (S (1).type)
+switch S(1).type
case "()"
- A.inf = subsref (A.inf, S (1));
- A.sup = subsref (A.sup, S (1));
- result = A;
+ A.inf = subsref (A.inf, S(1));
+ A.sup = subsref (A.sup, S(1));
case "{}"
error ("interval cannot be indexed with {}")
case "."
@@ -73,20 +72,22 @@ switch (S (1).type)
if (nargin (functionname) ~= 1)
error (["‘", S(1).subs, "’ is not a valid interval property"])
endif
- result = feval (S (1).subs, A);
+ A = feval (S(1).subs, A);
otherwise
error ("invalid subscript type")
endswitch
if (numel (S) > 1)
- result = subsref (result, S (2:end));
+ A = subsref (A, S(2 : end));
endif
endfunction
-%!assert (infsup (magic (3)) ([1, 2, 3]) == magic (3) ([1, 2, 3]));
-%!test "from the documentation string";
+%!assert (infsup (magic (3))([1, 2, 3]) == magic (3)([1, 2, 3]));
+
+%!# from the documentation string
+%!test
%! x = infsup (magic (3), magic (3) + 1);
-%! assert (x (1) == infsup (8, 9));
-%! assert (x (:, 2) == infsup ([1; 5; 9], [2; 6; 10]));
+%! assert (x(1) == infsup (8, 9));
+%! assert (x(:, 2) == infsup ([1; 5; 9], [2; 6; 10]));
%! assert (x.inf, magic (3));
diff --git a/inst/@infsup/sum.m b/inst/@infsup/sum.m
index 2eedbb2..2e96d45 100644
--- a/inst/@infsup/sum.m
+++ b/inst/@infsup/sum.m
@@ -72,8 +72,8 @@ l = u = zeros (resultsize);
for n = 1 : size (x.inf, 3 - dim)
idx.type = "()";
idx.subs = cell (1, 2);
- idx.subs {dim} = ":";
- idx.subs {3 - dim} = n;
+ idx.subs{dim} = ":";
+ idx.subs{3 - dim} = n;
## Select current vector in matrix
if (size (x.inf, 3 - dim) == 1)
@@ -82,20 +82,29 @@ for n = 1 : size (x.inf, 3 - dim)
vector.x = subsref (x, idx);
endif
- if (any (isempty (vector.x)))
+ if (any (isempty (vector.x)(:)))
## One of the intervals is empty
- l (n) = inf;
- u (n) = -inf;
+ l(n) = inf;
+ u(n) = -inf;
else
- l (n) = mpfr_vector_sum_d (-inf, vector.x.inf);
- u (n) = mpfr_vector_sum_d (+inf, vector.x.sup);
+ l(n) = mpfr_vector_sum_d (-inf, vector.x.inf);
+ u(n) = mpfr_vector_sum_d (+inf, vector.x.sup);
endif
endfor
-result = infsup (l, u);
+result = infsup ();
+result.inf = l;
+result.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (sum ([infsup(1), pow2(-1074), -1]) == infsup (pow2 (-1074)));
+%!# from the documentation string
+%!assert (sum ([infsup(1), pow2(-1074), -1]) == infsup (pow2 (-1074)));
+
%!assert (sum (infsup ([])) == 0);
+
+%!# correct use of signed zeros
+%!test
+%! x = sum (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sumabs.m b/inst/@infsup/sumabs.m
index c49bf48..6bc66e4 100644
--- a/inst/@infsup/sumabs.m
+++ b/inst/@infsup/sumabs.m
@@ -51,6 +51,13 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (sumabs ([infsup(1), pow2(-1074), -1]) == infsup (2, 2+eps*2));
-%!assert (sumabs (infsup ([])) == 0);
\ No newline at end of file
+%!# from the documentation string
+%!assert (sumabs ([infsup(1), pow2(-1074), -1]) == infsup (2, 2+eps*2));
+
+%!assert (sumabs (infsup ([])) == 0);
+
+%!# correct use of signed zeros
+%!test
+%! x = sumabs (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sumsq.m b/inst/@infsup/sumsq.m
index e12028e..7abf24e 100644
--- a/inst/@infsup/sumsq.m
+++ b/inst/@infsup/sumsq.m
@@ -60,6 +60,13 @@ else
endif
endfunction
-%!test "from the documentation string";
-%! assert (sumsq ([infsup(1), pow2(-1074), -1]) == infsup (2, 2+eps*2));
-%!assert (sumsq (infsup ([])) == 0);
\ No newline at end of file
+%!# from the documentation string
+%!assert (sumsq ([infsup(1), pow2(-1074), -1]) == infsup (2, 2+eps*2));
+
+%!assert (sumsq (infsup ([])) == 0);
+
+%!# correct use of signed zeros
+%!test
+%! x = sumsq (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/sup.m b/inst/@infsup/sup.m
index f97a0db..13a58d2 100644
--- a/inst/@infsup/sup.m
+++ b/inst/@infsup/sup.m
@@ -16,6 +16,7 @@
## -*- texinfo -*-
## @documentencoding UTF-8
## @defmethod {@@infsup} sup (@var{X})
+## @comment DO NOT SYNCHRONIZE DOCUMENTATION STRING
##
## Get the (least) upper boundary for all numbers of interval @var{X}.
##
@@ -43,16 +44,9 @@ if (nargin ~= 1)
return
endif
-if (isa (x, "infsupdec"))
- ## We cannot override this function in infsupdec, because that would create
- ## an infinite loop.
- if (isnai (x))
- error ("interval:NaI", "NaI has no supremum")
- endif
-endif
-
result = x.sup;
+
endfunction
-%!test "from the documentation string";
-%! assert (sup (infsup (2.5, 3.5)), 3.5);
+%!# from the documentation string
+%!assert (sup (infsup (2.5, 3.5)), 3.5);
diff --git a/inst/@infsup/tan.m b/inst/@infsup/tan.m
index c13d0cd..cdbd421 100644
--- a/inst/@infsup/tan.m
+++ b/inst/@infsup/tan.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-06
-function result = tan (x)
+function x = tan (x)
if (nargin ~= 1)
print_usage ();
@@ -46,12 +46,12 @@ l = u = zeros (size (x));
## Check, if wid (x) is certainly greater than pi. This may save computation of
## some tangent values.
width = mpfr_function_d ('minus', -inf, x.sup, x.inf);
-pi.sup = 0x6487ED5 * pow2 (-25) + 0x442D190 * pow2 (-55);
-certainlyfullperiod = width >= pi.sup;
+persistent pi = infsup ("pi");
+certainlyfullperiod = width >= sup (pi);
possiblynotfullperiod = not (certainlyfullperiod);
-l (possiblynotfullperiod) = mpfr_function_d ('tan', -inf, x.inf (possiblynotfullperiod));
-u (possiblynotfullperiod) = mpfr_function_d ('tan', inf, x.sup (possiblynotfullperiod));
+l(possiblynotfullperiod) = mpfr_function_d ('tan', -inf, x.inf(possiblynotfullperiod));
+u(possiblynotfullperiod) = mpfr_function_d ('tan', inf, x.sup(possiblynotfullperiod));
singularity = certainlyfullperiod | ...
l > u | (...
@@ -59,16 +59,25 @@ singularity = certainlyfullperiod | ...
sign (l) == sign (u) | ...
max (abs (l), abs (u)) < 1));
-l (singularity) = -inf;
-u (singularity) = inf;
+l(singularity) = -inf;
+u(singularity) = inf;
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (tan (infsup (1)) == "[0x1.8EB245CBEE3A5, 0x1.8EB245CBEE3A6]");
+%!# from the documentation string
+%!assert (tan (infsup (1)) == "[0x1.8EB245CBEE3A5, 0x1.8EB245CBEE3A6]");
+
+%!# correct use of signed zeros
+%!test
+%! x = tan (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/tanh.m b/inst/@infsup/tanh.m
index f36dbe9..9096c5a 100644
--- a/inst/@infsup/tanh.m
+++ b/inst/@infsup/tanh.m
@@ -34,7 +34,7 @@
## Keywords: interval
## Created: 2014-10-07
-function result = tanh (x)
+function x = tanh (x)
if (nargin ~= 1)
print_usage ();
@@ -46,12 +46,21 @@ l = mpfr_function_d ('tanh', -inf, x.inf);
u = mpfr_function_d ('tanh', +inf, x.sup);
emptyresult = isempty (x);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (tanh (infsup (1)) == "[0x1.85EFAB514F394p-1, 0x1.85EFAB514F395p-1]");
+%!# from the documentation string
+%!assert (tanh (infsup (1)) == "[0x1.85EFAB514F394p-1, 0x1.85EFAB514F395p-1]");
+
+%!# correct use of signed zeros
+%!test
+%! x = tanh (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/tanrev.m b/inst/@infsup/tanrev.m
index 210c950..40e4e89 100644
--- a/inst/@infsup/tanrev.m
+++ b/inst/@infsup/tanrev.m
@@ -59,41 +59,41 @@ arctangent = atan (c);
result = x;
## Resize, if scalar × matrix
-if (isscalar (arctangent.inf) ~= isscalar (result.inf))
+if (not (size_equal (arctangent.inf, result.inf)))
arctangent.inf = ones (size (result.inf)) .* arctangent.inf;
arctangent.sup = ones (size (result.inf)) .* arctangent.sup;
result.inf = ones (size (arctangent.inf)) .* result.inf;
result.sup = ones (size (arctangent.inf)) .* result.sup;
endif
-result.inf (isempty (arctangent)) = inf;
-result.sup (isempty (arctangent)) = -inf;
+result.inf(isempty (arctangent)) = inf;
+result.sup(isempty (arctangent)) = -inf;
idx.type = '()';
-pi = infsup ("pi");
+persistent pi = infsup ("pi");
select = not (isempty (result)) ...
& not (subset (infsup (-pi.sup / 2, pi.sup / 2), arctangent));
-if (any (any (select)))
+if (any (select(:)))
## Find a smaller upper bound for x, if the restriction from c allows it
u = inf (size (result.inf));
select_u = select & result.sup < inf;
## Find n, such that result.sup is within a distance of pi/2 around n * pi.
n = result.sup;
- n (select_u) = ceil (floor (sup (n (select_u) ./ (pi ./ 2))) ./ 2);
+ n(select_u) = ceil (floor (sup (n(select_u) ./ (pi ./ 2))) ./ 2);
arctangentshifted = arctangent;
idx.subs = {select_u};
arctangentshifted = subsasgn (arctangentshifted, idx, ...
- subsref (arctangentshifted, idx) + n (select_u) .* pi);
+ subsref (arctangentshifted, idx) + n(select_u) .* pi);
overlapping = not (isempty (intersect (result, arctangentshifted)));
- u (select_u & overlapping) = ...
- min (result.sup (select_u & overlapping), ...
- arctangentshifted.sup (select_u & overlapping));
- n (select_u & ~overlapping) = ...
- mpfr_function_d ('minus', +inf, n (select_u & ~overlapping), 1);
+ u(select_u & overlapping) = ...
+ min (result.sup(select_u & overlapping), ...
+ arctangentshifted.sup(select_u & overlapping));
+ n(select_u & ~overlapping) = ...
+ mpfr_function_d ('minus', +inf, n(select_u & ~overlapping), 1);
idx.subs = {(select_u & ~overlapping)};
- u (idx.subs {1}) = ...
+ u(idx.subs{1}) = ...
sup (subsref (arctangent, idx) + subsref (n, idx) .* pi);
## Find a larger lower bound for x, if the restriction from c allows it
@@ -101,29 +101,29 @@ if (any (any (select)))
select_l = select & result.inf > -inf;
## Find n, such that result.inf is within a distance of pi/2 around n * pi.
n = result.inf;
- n (select_l) = floor (ceil (inf (n (select_l) ./ (pi ./ 2))) ./ 2);
+ n(select_l) = floor (ceil (inf (n(select_l) ./ (pi ./ 2))) ./ 2);
arctangentshifted = arctangent;
idx.subs = {select_l};
arctangentshifted = subsasgn (arctangentshifted, idx, ...
- subsref (arctangentshifted, idx) + n (select_l) .* pi);
+ subsref (arctangentshifted, idx) + n(select_l) .* pi);
overlapping = not (isempty (intersect (result, arctangentshifted)));
- l (select_l & overlapping) = ...
+ l(select_l & overlapping) = ...
max (result.inf (select_l & overlapping), ...
- arctangentshifted.inf (select_l & overlapping));
- n (select_l & ~overlapping) = ...
- mpfr_function_d ('plus', -inf, n (select_l & ~overlapping), 1);
+ arctangentshifted.inf(select_l & overlapping));
+ n(select_l & ~overlapping) = ...
+ mpfr_function_d ('plus', -inf, n(select_l & ~overlapping), 1);
idx.subs = {(select_l & ~overlapping)};
- l (idx.subs {1}) = ...
+ l(idx.subs {1}) = ...
inf (subsref (arctangent, idx) + subsref (n, idx) .* pi);
- result.inf (select) = max (l (select), result.inf (select));
- result.sup (select) = min (u (select), result.sup (select));
+ result.inf(select) = max (l(select), result.inf(select));
+ result.sup(select) = min (u(select), result.sup(select));
- result.inf (result.inf > result.sup) = inf;
- result.sup (result.inf > result.sup) = -inf;
+ result.inf(result.inf > result.sup) = inf;
+ result.sup(result.inf > result.sup) = -inf;
endif
endfunction
-%!test "from the documentation string";
-%! assert (tanrev (infsup (0), infsup (2, 4)) == infsup ("pi"));
+%!# from the documentation string
+%!assert (tanrev (infsup (0), infsup (2, 4)) == infsup ("pi"));
diff --git a/inst/@infsup/times.m b/inst/@infsup/times.m
index 90839b0..2d7e6ad 100644
--- a/inst/@infsup/times.m
+++ b/inst/@infsup/times.m
@@ -37,7 +37,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = times (x, y)
+function x = times (x, y)
if (nargin ~= 2)
print_usage ();
@@ -78,18 +78,21 @@ u = max (max (max (...
## [Entire] × anything but [0] = [Entire] × [Entire]
## This prevents the cases where 0 × inf would produce NaNs.
entireproduct = isentire (x) | isentire (y);
-l (entireproduct) = -inf;
-u (entireproduct) = inf;
+l(entireproduct) = -inf;
+u(entireproduct) = inf;
zeroproduct = (x.inf == 0 & x.sup == 0) | (y.inf == 0 & y.sup == 0);
-l (zeroproduct) = 0;
-u (zeroproduct) = 0;
+l(zeroproduct) = -0;
+u(zeroproduct) = +0;
emptyresult = isempty (x) | isempty (y);
-l (emptyresult) = inf;
-u (emptyresult) = -inf;
+l(emptyresult) = inf;
+u(emptyresult) = -inf;
-result = infsup (l, u);
+l(l == 0) = -0;
+
+x.inf = l;
+x.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (infsup (2, 3) .* infsup (1, 2) == infsup (2, 6));
+%!# from the documentation string
+%!assert (infsup (2, 3) .* infsup (1, 2) == infsup (2, 6));
diff --git a/inst/@infsup/transpose.m b/inst/@infsup/transpose.m
index d3b7c27..5af32e9 100644
--- a/inst/@infsup/transpose.m
+++ b/inst/@infsup/transpose.m
@@ -36,20 +36,19 @@
## Keywords: interval
## Created: 2014-10-29
-function result = transpose (x)
+function x = transpose (x)
if (nargin ~= 1)
print_usage ();
return
endif
-l = transpose (x.inf);
-u = transpose (x.sup);
-
-result = infsup (l, u);
+x.inf = transpose (x.inf);
+x.sup = transpose (x.sup);
endfunction
%!assert (transpose (infsup (magic (3))) == infsup (magic (3).'));
-%!test "from the documentation string";
-%! assert (transpose (infsup (zeros (1, 3), ones (1, 3))) == infsup (zeros (3, 1), ones (3, 1)));
+
+%!# from the documentation string
+%!assert (transpose (infsup (zeros (1, 3), ones (1, 3))) == infsup (zeros (3, 1), ones (3, 1)));
diff --git a/inst/@infsup/tril.m b/inst/@infsup/tril.m
new file mode 100644
index 0000000..f33cff4
--- /dev/null
+++ b/inst/@infsup/tril.m
@@ -0,0 +1,57 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @defmethod {@@infsup} tril (@var{A})
+## @defmethodx {@@infsup} tril (@var{A}, @var{k})
+## @defmethodx {@@infsup} tril (@var{A}, @var{k}, "pack")
+## Return a new matrix formed by extracting the lower triangular part of the
+## matrix @var{A}, and setting all other elements to zero.
+##
+## The second argument is optional, and specifies how many diagonals above or
+## below the main diagonal should also be set to zero.
+##
+## If the option @option{pack} is given as third argument, the extracted
+## elements are not inserted into a matrix, but rather stacked column-wise one
+## above other.
+##
+## @seealso{@@infsup/triu, @@infsup/diag}
+## @end defmethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-08-04
+
+function A = tril (A, varargin)
+
+if (nargin >= 2 && isa (varargin{1}, 'infsup'))
+ error ('tril: invalid second argument; it must not be an interval');
+endif
+if (nargin >= 3 && isa (varargin{2}, 'infsup'))
+ error ('tril: invalid third argument; it must not be an interval');
+endif
+
+A.inf = tril (A.inf, varargin{:});
+A.sup = tril (A.sup, varargin{:});
+
+A.inf(A.inf == 0) = -0;
+
+endfunction
+
+%!assert (tril (infsup (magic (10))) == tril (magic (10)));
+%!assert (tril (infsup (magic (10)), 1) == tril (magic (10), 1));
+%!assert (tril (infsup (magic (10)), -1) == tril (magic (10), -1));
+%!assert (tril (infsup (magic (10)), 0, "pack") == tril (magic (10), 0, "pack"));
diff --git a/inst/@infsup/triu.m b/inst/@infsup/triu.m
new file mode 100644
index 0000000..983c725
--- /dev/null
+++ b/inst/@infsup/triu.m
@@ -0,0 +1,57 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @defmethod {@@infsup} triu (@var{A})
+## @defmethodx {@@infsup} triu (@var{A}, @var{k})
+## @defmethodx {@@infsup} triu (@var{A}, @var{k}, "pack")
+## Return a new matrix formed by extracting the upper triangular part of the
+## matrix @var{A}, and setting all other elements to zero.
+##
+## The second argument is optional, and specifies how many diagonals above or
+## below the main diagonal should also be set to zero.
+##
+## If the option @option{pack} is given as third argument, the extracted
+## elements are not inserted into a matrix, but rather stacked column-wise one
+## above other.
+##
+## @seealso{@@infsup/tril, @@infsup/diag}
+## @end defmethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-08-04
+
+function A = triu (A, varargin)
+
+if (nargin >= 2 && isa (varargin{1}, 'infsup'))
+ error ('triu: invalid second argument; it must not be an interval');
+endif
+if (nargin >= 3 && isa (varargin{2}, 'infsup'))
+ error ('triu: invalid third argument; it must not be an interval');
+endif
+
+A.inf = triu (A.inf, varargin{:});
+A.sup = triu (A.sup, varargin{:});
+
+A.inf(A.inf == 0) = -0;
+
+endfunction
+
+%!assert (triu (infsup (magic (10))) == triu (magic (10)));
+%!assert (triu (infsup (magic (10)), 1) == triu (magic (10), 1));
+%!assert (triu (infsup (magic (10)), -1) == triu (magic (10), -1));
+%!assert (triu (infsup (magic (10)), 0, "pack") == triu (magic (10), 0, "pack"));
diff --git a/inst/@infsup/uminus.m b/inst/@infsup/uminus.m
index 3fcc75d..9fd4ff6 100644
--- a/inst/@infsup/uminus.m
+++ b/inst/@infsup/uminus.m
@@ -36,7 +36,7 @@
## Keywords: interval
## Created: 2014-09-30
-function result = uminus (x)
+function x = uminus (x)
if (nargin ~= 1)
print_usage ();
@@ -44,12 +44,15 @@ if (nargin ~= 1)
endif
## This also works for empty / entire intervals
-l = -x.sup;
-u = -x.inf;
-
-result = infsup (l, u);
+[x.inf, x.sup] = deal (-x.sup, -x.inf);
endfunction
-%!test "from the documentation string";
-%! assert (-infsup (2, 3) == infsup (-3, -2));
+%!# from the documentation string
+%!assert (-infsup (2, 3) == infsup (-3, -2));
+
+%!# correct use of signed zeros
+%!test
+%! x = uminus (infsup (0));
+%! assert (signbit (inf (x)));
+%! assert (not (signbit (sup (x))));
diff --git a/inst/@infsup/union.m b/inst/@infsup/union.m
index cc200e4..dfbd28b 100644
--- a/inst/@infsup/union.m
+++ b/inst/@infsup/union.m
@@ -42,7 +42,7 @@
## Keywords: interval
## Created: 2014-10-02
-function result = union (a, b, dim)
+function a = union (a, b, dim)
if (not (isa (a, "infsup")))
a = infsup (a);
@@ -69,9 +69,10 @@ switch (nargin)
return
endswitch
-result = infsup (l, u);
+a.inf = l;
+a.sup = u;
endfunction
-%!test "from the documentation string";
-%! assert (union (infsup (1, 3), infsup (2, 4)) == infsup (1, 4));
+%!# from the documentation string
+%!assert (union (infsup (1, 3), infsup (2, 4)) == infsup (1, 4));
diff --git a/inst/@infsup/uplus.m b/inst/@infsup/uplus.m
index 6410988..4cf8970 100644
--- a/inst/@infsup/uplus.m
+++ b/inst/@infsup/uplus.m
@@ -45,5 +45,5 @@ endif
endfunction
-%!test "from the documentation string";
-%! assert (+infsup (2, 3) == infsup (2, 3));
+%!# from the documentation string
+%!assert (+infsup (2, 3) == infsup (2, 3));
diff --git a/inst/@infsup/vertcat.m b/inst/@infsup/vertcat.m
index bd6bd3e..7dd4528 100644
--- a/inst/@infsup/vertcat.m
+++ b/inst/@infsup/vertcat.m
@@ -40,22 +40,12 @@
function result = vertcat (varargin)
-varargin = transpose (varargin);
-
-## Conversion to interval
-intervals = cellfun ("isclass", varargin, "infsup");
-to_convert = not (intervals);
-varargin (to_convert) = cellfun (@infsup, varargin (to_convert), ...
- "UniformOutput", false ());
-
-l = cell2mat (cellfun (@(x) x.inf, varargin, "UniformOutput", false ()));
-u = cell2mat (cellfun (@(x) x.sup, varargin, "UniformOutput", false ()));
-
-result = infsup (l, u);
+result = cat (1, varargin{:});
endfunction
%!assert (vertcat (infsup (1), infsup (2)) == infsup (vertcat (1, 2)));
-%!test "from the documentation string";
+%!test
+%! # from the documentation string
%! a = infsup (2, 5);
%! assert (vertcat (a, a, a) == infsup ([2; 2; 2], [5; 5; 5]));
diff --git a/inst/@infsup/wid.m b/inst/@infsup/wid.m
index fb25377..53851ad 100644
--- a/inst/@infsup/wid.m
+++ b/inst/@infsup/wid.m
@@ -47,9 +47,9 @@ endif
result = mpfr_function_d ('minus', +inf, x.sup, x.inf);
-result (isempty (x)) = nan ();
+result(isempty (x)) = nan ();
endfunction
-%!test "from the documentation string";
-%! assert (wid (infsup (2.5, 3.5)), 1);
+%!# from the documentation string
+%!assert (wid (infsup (2.5, 3.5)), 1);
diff --git a/inst/@infsupdec/abs.m b/inst/@infsupdec/abs.m
index f65ab88..f24272c 100644
--- a/inst/@infsupdec/abs.m
+++ b/inst/@infsupdec/abs.m
@@ -43,41 +43,40 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (abs (intervalpart (x)));
+result = newdec (abs (x.infsup));
## abs is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "Empty interval";
-%! assert (isequal (abs (infsupdec ()), infsupdec ()));
-%!test "Singleton intervals";
-%! assert (isequal (abs (infsupdec (1)), infsupdec (1)));
-%! assert (isequal (abs (infsupdec (0)), infsupdec (0)));
-%! assert (isequal (abs (infsupdec (-1)), infsupdec (1)));
-%! assert (isequal (abs (infsupdec (realmax)), infsupdec (realmax)));
-%! assert (isequal (abs (infsupdec (realmin)), infsupdec (realmin)));
-%! assert (isequal (abs (infsupdec (-realmin)), infsupdec (realmin)));
-%! assert (isequal (abs (infsupdec (-realmax)), infsupdec (realmax)));
-%!test "Bounded intervals";
-%! assert (isequal (abs (infsupdec (1, 2)), infsupdec (1, 2)));
-%! assert (isequal (abs (infsupdec (0, 1)), infsupdec (0, 1)));
-%! assert (isequal (abs (infsupdec (-1, 1)), infsupdec (0, 1)));
-%! assert (isequal (abs (infsupdec (-1, 0)), infsupdec (0, 1)));
-%! assert (isequal (abs (infsupdec (-2, -1)), infsupdec (1, 2)));
-%!test "Unbounded intervals";
-%! assert (isequal (abs (infsupdec (0, inf)), infsupdec (0, inf)));
-%! assert (isequal (abs (infsupdec (-inf, inf)), infsupdec (0, inf)));
-%! assert (isequal (abs (infsupdec (-inf, 0)), infsupdec (0, inf)));
-%! assert (isequal (abs (infsupdec (1, inf)), infsupdec (1, inf)));
-%! assert (isequal (abs (infsupdec (-1, inf)), infsupdec (0, inf)));
-%! assert (isequal (abs (infsupdec (-inf, -1)), infsupdec (1, inf)));
-%! assert (isequal (abs (infsupdec (-inf, 1)), infsupdec (0, inf)));
-%!test "from the documentation string";
-%! assert (isequal (abs (infsupdec (2.5, 3.5)), infsupdec (2.5, 3.5)));
-%! assert (isequal (abs (infsupdec (-0.5, 5.5)), infsupdec (0, 5.5)));
+%!# Empty interval
+%!assert (isequal (abs (infsupdec ()), infsupdec ()));
+
+%!# Singleton intervals
+%!assert (isequal (abs (infsupdec (1)), infsupdec (1)));
+%!assert (isequal (abs (infsupdec (0)), infsupdec (0)));
+%!assert (isequal (abs (infsupdec (-1)), infsupdec (1)));
+%!assert (isequal (abs (infsupdec (realmax)), infsupdec (realmax)));
+%!assert (isequal (abs (infsupdec (realmin)), infsupdec (realmin)));
+%!assert (isequal (abs (infsupdec (-realmin)), infsupdec (realmin)));
+%!assert (isequal (abs (infsupdec (-realmax)), infsupdec (realmax)));
+
+%!# Bounded intervals
+%!assert (isequal (abs (infsupdec (1, 2)), infsupdec (1, 2)));
+%!assert (isequal (abs (infsupdec (0, 1)), infsupdec (0, 1)));
+%!assert (isequal (abs (infsupdec (-1, 1)), infsupdec (0, 1)));
+%!assert (isequal (abs (infsupdec (-1, 0)), infsupdec (0, 1)));
+%!assert (isequal (abs (infsupdec (-2, -1)), infsupdec (1, 2)));
+
+%!# Unbounded intervals
+%!assert (isequal (abs (infsupdec (0, inf)), infsupdec (0, inf)));
+%!assert (isequal (abs (infsupdec (-inf, inf)), infsupdec (0, inf)));
+%!assert (isequal (abs (infsupdec (-inf, 0)), infsupdec (0, inf)));
+%!assert (isequal (abs (infsupdec (1, inf)), infsupdec (1, inf)));
+%!assert (isequal (abs (infsupdec (-1, inf)), infsupdec (0, inf)));
+%!assert (isequal (abs (infsupdec (-inf, -1)), infsupdec (1, inf)));
+%!assert (isequal (abs (infsupdec (-inf, 1)), infsupdec (0, inf)));
+
+%!# from the documentation string
+%!assert (isequal (abs (infsupdec (2.5, 3.5)), infsupdec (2.5, 3.5)));
+%!assert (isequal (abs (infsupdec (-0.5, 5.5)), infsupdec (0, 5.5)));
diff --git a/inst/@infsupdec/absrev.m b/inst/@infsupdec/absrev.m
index 0079e5f..71f8bd9 100644
--- a/inst/@infsupdec/absrev.m
+++ b/inst/@infsupdec/absrev.m
@@ -59,46 +59,42 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (absrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (absrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "Empty interval";
-%! assert (isequal (absrev (infsupdec ()), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (0, 1), infsupdec ()), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (0, 1), infsupdec (7, 9)), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (), infsupdec (0, 1)), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (-2, -1)), infsupdec ()));
-%!test "Singleton intervals";
-%! assert (isequal (absrev (infsupdec (1)), infsupdec (-1, 1, "trv")));
-%! assert (isequal (absrev (infsupdec (0)), infsupdec (0, "trv")));
-%! assert (isequal (absrev (infsupdec (-1)), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (realmax)), infsupdec (-realmax, realmax, "trv")));
-%! assert (isequal (absrev (infsupdec (realmin)), infsupdec (-realmin, realmin, "trv")));
-%! assert (isequal (absrev (infsupdec (-realmin)), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (-realmax)), infsupdec ()));
-%!test "Bound intervals";
-%! assert (isequal (absrev (infsupdec (1, 2)), infsupdec (-2, 2, "trv")));
-%! assert (isequal (absrev (infsupdec (1, 2), infsupdec (0, 2)), infsupdec (1, 2, "trv")));
-%! assert (isequal (absrev (infsupdec (0, 1), infsupdec (-0.5, 2)), infsupdec (-0.5, 1, "trv")));
-%! assert (isequal (absrev (infsupdec (-1, 1)), infsupdec (-1, 1, "trv")));
-%! assert (isequal (absrev (infsupdec (-1, 0)), infsupdec (0, "trv")));
-%!test "Unbound intervals";
-%! assert (isequal (absrev (infsupdec (0, inf)), infsupdec (-inf, inf, "trv")));
-%! assert (isequal (absrev (infsupdec (-inf, inf)), infsupdec (-inf, inf, "trv")));
-%! assert (isequal (absrev (infsupdec (-inf, 0)), infsupdec (0, "trv")));
-%! assert (isequal (absrev (infsupdec (1, inf), infsupdec (-inf, 0)), infsupdec (-inf, -1, "trv")));
-%! assert (isequal (absrev (infsupdec (-1, inf)), infsupdec (-inf, inf, "trv")));
-%! assert (isequal (absrev (infsupdec (-inf, -1)), infsupdec ()));
-%! assert (isequal (absrev (infsupdec (-inf, 1)), infsupdec (-1, 1, "trv")));
-%!test "from the documentation string";
-%! assert (isequal (absrev (infsupdec (-2, 1)), infsupdec (-1, 1, "trv")));
+%!# Empty interval
+%!assert (isequal (absrev (infsupdec ()), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (0, 1), infsupdec ()), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (0, 1), infsupdec (7, 9)), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (), infsupdec (0, 1)), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (-2, -1)), infsupdec ()));
+
+%!# Singleton intervals
+%!assert (isequal (absrev (infsupdec (1)), infsupdec (-1, 1, "trv")));
+%!assert (isequal (absrev (infsupdec (0)), infsupdec (0, "trv")));
+%!assert (isequal (absrev (infsupdec (-1)), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (realmax)), infsupdec (-realmax, realmax, "trv")));
+%!assert (isequal (absrev (infsupdec (realmin)), infsupdec (-realmin, realmin, "trv")));
+%!assert (isequal (absrev (infsupdec (-realmin)), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (-realmax)), infsupdec ()));
+
+%!# Bound intervals
+%!assert (isequal (absrev (infsupdec (1, 2)), infsupdec (-2, 2, "trv")));
+%!assert (isequal (absrev (infsupdec (1, 2), infsupdec (0, 2)), infsupdec (1, 2, "trv")));
+%!assert (isequal (absrev (infsupdec (0, 1), infsupdec (-0.5, 2)), infsupdec (-0.5, 1, "trv")));
+%!assert (isequal (absrev (infsupdec (-1, 1)), infsupdec (-1, 1, "trv")));
+%!assert (isequal (absrev (infsupdec (-1, 0)), infsupdec (0, "trv")));
+
+%!# Unbound intervals
+%!assert (isequal (absrev (infsupdec (0, inf)), infsupdec (-inf, inf, "trv")));
+%!assert (isequal (absrev (infsupdec (-inf, inf)), infsupdec (-inf, inf, "trv")));
+%!assert (isequal (absrev (infsupdec (-inf, 0)), infsupdec (0, "trv")));
+%!assert (isequal (absrev (infsupdec (1, inf), infsupdec (-inf, 0)), infsupdec (-inf, -1, "trv")));
+%!assert (isequal (absrev (infsupdec (-1, inf)), infsupdec (-inf, inf, "trv")));
+%!assert (isequal (absrev (infsupdec (-inf, -1)), infsupdec ()));
+%!assert (isequal (absrev (infsupdec (-inf, 1)), infsupdec (-1, 1, "trv")));
+
+%!# from the documentation string
+%!assert (isequal (absrev (infsupdec (-2, 1)), infsupdec (-1, 1, "trv")));
diff --git a/inst/@infsupdec/acos.m b/inst/@infsupdec/acos.m
index fc15492..8e28a7e 100644
--- a/inst/@infsupdec/acos.m
+++ b/inst/@infsupdec/acos.m
@@ -41,17 +41,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
+result = newdec (acos (x.infsup));
-result = newdec (acos (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
## acos is continuous everywhere, but defined for [-1, 1] only
-result.dec (not (subset (x, infsupdec (-1, 1)))) = _trv ();
+persistent domain = infsup (-1, 1);
+result.dec(not (subset (x.infsup, domain))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (acos (infsupdec (.5)), infsupdec ("[0x1.0C152382D7365, 0x1.0C152382D7366]")));
+%!# from the documentation string
+%!assert (isequal (acos (infsupdec (.5)), infsupdec ("[0x1.0C152382D7365, 0x1.0C152382D7366]")));
diff --git a/inst/@infsupdec/acosh.m b/inst/@infsupdec/acosh.m
index 028b68f..91f3e98 100644
--- a/inst/@infsupdec/acosh.m
+++ b/inst/@infsupdec/acosh.m
@@ -41,17 +41,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
+result = newdec (acosh (x.infsup));
-result = newdec (acosh (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
## acosh is continuous everywhere, but defined for [1, Inf] only
-result.dec (not (subset (x, infsupdec (1, inf)))) = _trv ();
+persistent domain = infsup (1, inf);
+result.dec(not (subset (x.infsup, domain))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (acosh (infsupdec (2)), infsupdec ("[0x1.5124271980434, 0x1.5124271980435]")));
+%!# from the documentation string
+%!assert (isequal (acosh (infsupdec (2)), infsupdec ("[0x1.5124271980434, 0x1.5124271980435]")));
diff --git a/inst/@infsupdec/asin.m b/inst/@infsupdec/asin.m
index b211576..fe26593 100644
--- a/inst/@infsupdec/asin.m
+++ b/inst/@infsupdec/asin.m
@@ -41,17 +41,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
+result = newdec (asin (x.infsup));
-result = newdec (asin (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
## asin is continuous everywhere, but defined for [-1, 1] only
-result.dec (not (subset (x, infsupdec (-1, 1)))) = _trv ();
+persistent domain = infsup (-1, 1);
+result.dec(not (subset (x.infsup, domain))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (asin (infsupdec (.5)), infsupdec ("[0x1.0C152382D7365p-1, 0x1.0C152382D7366p-1]")));
+%!# from the documentation string
+%!assert (isequal (asin (infsupdec (.5)), infsupdec ("[0x1.0C152382D7365p-1, 0x1.0C152382D7366p-1]")));
diff --git a/inst/@infsupdec/asinh.m b/inst/@infsupdec/asinh.m
index 419d1bc..66c1fdc 100644
--- a/inst/@infsupdec/asinh.m
+++ b/inst/@infsupdec/asinh.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (asinh (intervalpart (x)));
+result = newdec (asinh (x.infsup));
## asinh is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (asinh (infsupdec (1)), infsupdec ("[0x1.C34366179D426p-1, 0x1.C34366179D427p-1]")));
+%!# from the documentation string
+%!assert (isequal (asinh (infsupdec (1)), infsupdec ("[0x1.C34366179D426p-1, 0x1.C34366179D427p-1]")));
diff --git a/inst/@infsupdec/atan.m b/inst/@infsupdec/atan.m
index 53dc645..d44eef3 100644
--- a/inst/@infsupdec/atan.m
+++ b/inst/@infsupdec/atan.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (atan (intervalpart (x)));
+result = newdec (atan (x.infsup));
## atan is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (atan (infsupdec (1)), infsupdec ("[0x1.921FB54442D18p-1, 0x1.921FB54442D19p-1]")));
+%!# from the documentation string
+%!assert (isequal (atan (infsupdec (1)), infsupdec ("[0x1.921FB54442D18p-1, 0x1.921FB54442D19p-1]")));
diff --git a/inst/@infsupdec/atan2.m b/inst/@infsupdec/atan2.m
index a2d8dce..dc7b779 100644
--- a/inst/@infsupdec/atan2.m
+++ b/inst/@infsupdec/atan2.m
@@ -48,31 +48,23 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (atan2 (intervalpart (y), intervalpart (x)));
-result.dec = min (result.dec, min (y.dec, x.dec));
+result = newdec (atan2 (y.infsup, x.infsup));
## The function is discontinuous for x <= 0 and y == 0
discontinuos = inf (y) < 0 & sup (y) >= 0 & inf (x) < 0;
-result.dec (discontinuos) = min (result.dec (discontinuos), _def ());
+result.dec(discontinuos) = min (result.dec(discontinuos), _def ());
## For y = [0, y.sup] the function is discontinuous, but its restriction is not
onlyrestrictioncontinuous = inf (y) == 0 & inf (x) < 0;
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
## The only undefined input is <0,0>
-result.dec (ismember (0, y) & ismember (0, x)) = _trv ();
+result.dec(ismember (0, y) & ismember (0, x)) = _trv ();
+
+result.dec = min (result.dec, min (y.dec, x.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (atan2 (infsupdec (1), infsupdec (-1)), infsupdec ("[0x1.2D97C7F3321D2p1, 0x1.2D97C7F3321D3p1]")));
+%!# from the documentation string
+%!assert (isequal (atan2 (infsupdec (1), infsupdec (-1)), infsupdec ("[0x1.2D97C7F3321D2p1, 0x1.2D97C7F3321D3p1]")));
diff --git a/inst/@infsupdec/atan2rev1.m b/inst/@infsupdec/atan2rev1.m
index 957d825..7edbe3b 100644
--- a/inst/@infsupdec/atan2rev1.m
+++ b/inst/@infsupdec/atan2rev1.m
@@ -62,24 +62,12 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (y))
- result = y;
- return
-endif
-if (isnai (b))
- result = b;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = atan2rev1 (intervalpart (b), intervalpart (c), intervalpart (y));
## inverse atan2 is not a point function
-result = infsupdec (result, "trv");
+result = infsupdec (atan2rev1 (b.infsup, c.infsup, y.infsup), "trv");
+
+result.dec(isnai (y) | isnai (b) | isnai (c)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (atan2rev1 (infsupdec (1, 2), infsupdec ("pi") / 4), infsupdec ("[0x1.FFFFFFFFFFFFFp-1, 0x1.0000000000001p1]_trv")));
+%!# from the documentation string
+%!assert (isequal (atan2rev1 (infsupdec (1, 2), infsupdec ("pi") / 4), infsupdec ("[0x1.FFFFFFFFFFFFFp-1, 0x1.0000000000001p1]_trv")));
diff --git a/inst/@infsupdec/atan2rev2.m b/inst/@infsupdec/atan2rev2.m
index 8f7cf69..50e2b1a 100644
--- a/inst/@infsupdec/atan2rev2.m
+++ b/inst/@infsupdec/atan2rev2.m
@@ -62,24 +62,12 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (a))
- result = b;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = atan2rev2 (intervalpart (a), intervalpart (c), intervalpart (x));
## inverse atan2 is not a point function
-result = infsupdec (result, "trv");
+result = infsupdec (atan2rev2 (a.infsup, c.infsup, x.infsup), "trv");
+
+result.dec(isnai (x) | isnai (a) | isnai (c)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (atan2rev2 (infsupdec (1, 2), infsupdec ("pi") / 4), infsupdec ("[0x1.FFFFFFFFFFFFEp-1, 0x1.0000000000001p1]_trv")));
+%!# from the documentation string
+%!assert (isequal (atan2rev2 (infsupdec (1, 2), infsupdec ("pi") / 4), infsupdec ("[0x1.FFFFFFFFFFFFEp-1, 0x1.0000000000001p1]_trv")));
diff --git a/inst/@infsupdec/atanh.m b/inst/@infsupdec/atanh.m
index b2fd7f2..63d1c4a 100644
--- a/inst/@infsupdec/atanh.m
+++ b/inst/@infsupdec/atanh.m
@@ -41,17 +41,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
+result = newdec (atanh (x.infsup));
-result = newdec (atanh (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
## atanh is continuous everywhere, but defined for ]-1, 1[ only
-result.dec (not (interior (x, infsupdec (-1, 1)))) = _trv ();
+persistent domain_hull = infsup (-1, 1);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (atanh (infsupdec (.5)), infsupdec ("[0x1.193EA7AAD030Ap-1, 0x1.193EA7AAD030Bp-1]")));
+%!# from the documentation string
+%!assert (isequal (atanh (infsupdec (.5)), infsupdec ("[0x1.193EA7AAD030Ap-1, 0x1.193EA7AAD030Bp-1]")));
diff --git a/inst/@infsupdec/bisect.m b/inst/@infsupdec/bisect.m
index 9a54202..6be102e 100644
--- a/inst/@infsupdec/bisect.m
+++ b/inst/@infsupdec/bisect.m
@@ -56,20 +56,17 @@ if (nargin > 1)
return
endif
-if (isnai (x))
- a = x;
- b = x;
- return
-endif
-
## bisect must not retain any useful decoration
-[a, b] = bisect (intervalpart (x));
+[a, b] = bisect (x.infsup);
a = infsupdec (a, "trv");
b = infsupdec (b, "trv");
+a.dec(isnai (x)) = b.dec(isnai (x)) = _ill ();
+
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
+%!test
%! [a, b] = bisect (infsupdec (2, 32));
%! assert (a == infsupdec (2, 8, "trv"));
%! assert (b == infsupdec (8, 32, "trv"));
diff --git a/inst/@infsupdec/bitunpack.m b/inst/@infsupdec/bitunpack.m
index 24f7ac8..fea220d 100644
--- a/inst/@infsupdec/bitunpack.m
+++ b/inst/@infsupdec/bitunpack.m
@@ -46,15 +46,15 @@ if (nargin ~= 1)
return
endif
+bare = bitunpack (x.infsup);
+d = bitunpack (x.dec);
+
## The exchange representation of [NaI] is (NaN, NaN, ill).
-if (isnai (x))
- result = [bitunpack(zeros (1, 'uint8')), bitunpack(nan (1, 2))];
- return
+if (any (isnai (x)(:)))
+ bare(vec (1:128) + 128 .* vec (find (isnai (x)) - 1, 2)) = ...
+ [bitunpack(nan (sum (isnai (x)), 2))];
endif
-bare = bitunpack (intervalpart (x));
-d = bitunpack (x.dec);
-
## Initialize result vector
result = zeros (1, length (bare) + length (d), 'logical');
if (not (isrow (bare)))
@@ -65,13 +65,13 @@ endif
## into result.
target_bare = reshape (1 : length (result), 8, length (result) / 8);
target_d = target_bare (:, 17 : 17 : size (target_bare, 2));
-target_bare (:, 17 : 17 : size (target_bare, 2)) = [];
-result (target_bare) = bare;
-result (target_d) = d;
+target_bare(:, 17 : 17 : size (target_bare, 2)) = [];
+result(target_bare) = bare;
+result(target_d) = d;
endfunction
-%!test;
+%!test
%! littleendian = bitunpack (uint16 (1))(1);
%! b = zeros (1, 136);
%! if (littleendian)
diff --git a/inst/@infsupdec/cancelminus.m b/inst/@infsupdec/cancelminus.m
index 3386f9f..b1bba6e 100644
--- a/inst/@infsupdec/cancelminus.m
+++ b/inst/@infsupdec/cancelminus.m
@@ -52,20 +52,12 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return;
-endif
-
-result = cancelminus (intervalpart (x), intervalpart (y));
## cancelMinus must not retain any useful decoration
-result = infsupdec (result, "trv");
+result = infsupdec (cancelminus (x.infsup, y.infsup), "trv");
+
+result.dec(isnai (x) | isnai (y)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cancelminus (infsupdec (2, 3), infsupdec (1, 1.5)), infsupdec (1, 1.5, "trv")));
+%!# from the documentation string
+%!assert (isequal (cancelminus (infsupdec (2, 3), infsupdec (1, 1.5)), infsupdec (1, 1.5, "trv")));
diff --git a/inst/@infsupdec/cat.m b/inst/@infsupdec/cat.m
new file mode 100644
index 0000000..15fdf10
--- /dev/null
+++ b/inst/@infsupdec/cat.m
@@ -0,0 +1,81 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @defmethod {@@infsupdec} cat (@var{DIM}, @var{MATRIX1}, @var{MATRIX2}, @dots{})
+##
+## Return the concatenation of interval matrices @var{MATRIX1}, @var{MATRIX2},
+## … along dimension @var{DIM}.
+##
+## Interval matrices support no more than 2 dimensions.
+##
+## @example
+## @group
+## cat (2, infsupdec (magic (3)), infsupdec (pascal (3)))
+## @result{} 3×6 interval matrix
+##
+## [8]_com [1]_com [6]_com [1]_com [1]_com [1]_com
+## [3]_com [5]_com [7]_com [1]_com [2]_com [3]_com
+## [4]_com [9]_com [2]_com [1]_com [3]_com [6]_com
+## @end group
+## @end example
+## @seealso{@@infsup/horzcat, @@infsup/vertcat}
+## @end defmethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-10-09
+
+function result = cat (dim, varargin)
+
+if (isa (dim, "infsup"))
+ print_usage ();
+ return
+endif
+
+if (dim > 2)
+ error ("interval:InvalidOperand", ...
+ "cat: no more than 2 dimensions are supported");
+endif
+
+## Conversion of non-interval and undecorated parameters to decorated intervals
+decorated_interval_idx = cellfun ("isclass", varargin, "infsupdec");
+to_convert_idx = not (decorated_interval_idx);
+varargin(to_convert_idx) = cellfun (@infsupdec, ...
+ varargin(to_convert_idx), ...
+ "UniformOutput", false);
+
+## Stack intervals along dimension dim
+s = cellfun ("struct", varargin); # struct array
+result = infsupdec ();
+result.infsup = cat (dim, s.infsup);
+result.dec = cat (dim, s.dec);
+
+endfunction
+
+%!assert (size (cat (1, infsupdec ([]), infsupdec ([]))), [0 0]);
+%!assert (isequal (cat (1, infsupdec (1), infsupdec (2)), infsupdec (cat (1, 1, 2))));
+%!assert (isequal (cat (2, infsupdec (1), infsupdec (2)), infsupdec (cat (2, 1, 2))));
+
+%!assert (isequal (horzcat (infsupdec (1), infsupdec (2)), infsupdec (horzcat (1, 2))));
+%!test
+%! a = infsupdec (2, 5);
+%! assert (isequal (horzcat (a, a, a), infsupdec ([2, 2, 2], [5, 5, 5])));
+
+%!assert (isequal (vertcat (infsupdec (1), infsupdec (2)), infsupdec (vertcat (1, 2))));
+%!test
+%! a = infsupdec (2, 5);
+%! assert (isequal (vertcat (a, a, a), infsupdec ([2; 2; 2], [5; 5; 5])));
diff --git a/inst/@infsupdec/cbrt.m b/inst/@infsupdec/cbrt.m
index c7fac31..32fdf5e 100644
--- a/inst/@infsupdec/cbrt.m
+++ b/inst/@infsupdec/cbrt.m
@@ -41,15 +41,10 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (cbrt (intervalpart (x)));
+result = newdec (cbrt (x.infsup));
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cbrt (infsupdec (-27, 27)), infsupdec (-3, 3)));
+%!# from the documentation string
+%!assert (isequal (cbrt (infsupdec (-27, 27)), infsupdec (-3, 3)));
diff --git a/inst/@infsupdec/ceil.m b/inst/@infsupdec/ceil.m
index 89c1ee1..2dcc88e 100644
--- a/inst/@infsupdec/ceil.m
+++ b/inst/@infsupdec/ceil.m
@@ -43,24 +43,20 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (ceil (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (ceil (x.infsup));
## Between two integral numbers the function is constant, thus continuous
discontinuos = not (issingleton (result));
-result.dec (discontinuos) = min (result.dec (discontinuos), _def ());
+result.dec(discontinuos) = min (result.dec(discontinuos), _def ());
onlyrestrictioncontinuous = issingleton (result) & fix (sup (x)) == sup (x);
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (ceil (infsupdec (2.5, 3.5)), infsupdec (3, 4, "def")));
-%! assert (isequal (ceil (infsupdec (-.5, 5)), infsupdec (0, 5, "def")));
+%!# from the documentation string
+%!assert (isequal (ceil (infsupdec (2.5, 3.5)), infsupdec (3, 4, "def")));
+%!assert (isequal (ceil (infsupdec (-.5, 5)), infsupdec (0, 5, "def")));
diff --git a/inst/@infsupdec/cos.m b/inst/@infsupdec/cos.m
index 280b650..cebf3d3 100644
--- a/inst/@infsupdec/cos.m
+++ b/inst/@infsupdec/cos.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (cos (intervalpart (x)));
+result = newdec (cos (x.infsup));
## cos is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cos (infsupdec (1)), infsupdec ("[0x1.14A280FB5068Bp-1, 0x1.14A280FB5068Cp-1]")));
+%!# from the documentation string
+%!assert (isequal (cos (infsupdec (1)), infsupdec ("[0x1.14A280FB5068Bp-1, 0x1.14A280FB5068Cp-1]")));
diff --git a/inst/@infsupdec/cosh.m b/inst/@infsupdec/cosh.m
index 2b00293..68b6bfa 100644
--- a/inst/@infsupdec/cosh.m
+++ b/inst/@infsupdec/cosh.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (cosh (intervalpart (x)));
+result = newdec (cosh (x.infsup));
## cosh is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cosh (infsupdec (1)), infsupdec ("[0x1.8B07551D9F55, 0x1.8B07551D9F551]")));
+%!# from the documentation string
+%!assert (isequal (cosh (infsupdec (1)), infsupdec ("[0x1.8B07551D9F55, 0x1.8B07551D9F551]")));
diff --git a/inst/@infsupdec/coshrev.m b/inst/@infsupdec/coshrev.m
index 1f089ce..b5f6c6d 100644
--- a/inst/@infsupdec/coshrev.m
+++ b/inst/@infsupdec/coshrev.m
@@ -59,18 +59,10 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (coshrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (coshrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (coshrev (infsupdec (-2, 1)), infsupdec (0, "trv")));
+%!# from the documentation string
+%!assert (isequal (coshrev (infsupdec (-2, 1)), infsupdec (0, "trv")));
diff --git a/inst/@infsupdec/cosrev.m b/inst/@infsupdec/cosrev.m
index df5a2af..dfee4b2 100644
--- a/inst/@infsupdec/cosrev.m
+++ b/inst/@infsupdec/cosrev.m
@@ -59,18 +59,10 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (cosrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (cosrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cosrev (0, infsupdec (6, 9)), infsupdec ("[0x1.F6A7A2955385Ep2, 0x1.F6A7A2955386p2]_trv")));
+%!# from the documentation string
+%!assert (isequal (cosrev (0, infsupdec (6, 9)), infsupdec ("[0x1.F6A7A2955385Ep2, 0x1.F6A7A2955386p2]_trv")));
diff --git a/inst/@infsupdec/cot.m b/inst/@infsupdec/cot.m
index a1d887b..20da7e7 100644
--- a/inst/@infsupdec/cot.m
+++ b/inst/@infsupdec/cot.m
@@ -41,20 +41,16 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (cot (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (cot (x.infsup));
## Because tan (nextdown (pi)) < realmax, we can simple check for
## a singularity by comparing the result with entire for x ~= 0.
domain = not (isentire (result)) | (inf (x) <= 0 & sup (x) >= 0);
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (cot (infsupdec (1)), infsupdec ("[0x1.48C05D04E1CFDp-1, 0x1.48C05D04E1CFEp-1]")));
+%!# from the documentation string
+%!assert (isequal (cot (infsupdec (1)), infsupdec ("[0x1.48C05D04E1CFDp-1, 0x1.48C05D04E1CFEp-1]")));
diff --git a/inst/@infsupdec/coth.m b/inst/@infsupdec/coth.m
index d6b0673..297f307 100644
--- a/inst/@infsupdec/coth.m
+++ b/inst/@infsupdec/coth.m
@@ -41,17 +41,13 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (coth (intervalpart (x)));
+result = newdec (coth (x.infsup));
## coth is defined and continuous for x ~= 0
-result.dec = min (result.dec, x.dec);
result.dec (inf (x) <= 0 & sup (x) >= 0) = _trv ();
+result.dec = min (result.dec, x.dec);
+
endfunction
-%!test "from the documentation string";
-%! assert (isequal (coth (infsupdec (1)), infsupdec ("[0x1.50231499B6B1D, 0x1.50231499B6B1E]_com")));
+%!# from the documentation string
+%!assert (isequal (coth (infsupdec (1)), infsupdec ("[0x1.50231499B6B1D, 0x1.50231499B6B1E]_com")));
diff --git a/inst/@infsupdec/csc.m b/inst/@infsupdec/csc.m
index d3b8814..85dc10a 100644
--- a/inst/@infsupdec/csc.m
+++ b/inst/@infsupdec/csc.m
@@ -41,20 +41,16 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (csc (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (csc (x.infsup));
## Because csc (nextdown (pi)) < realmax, we can simple check for
## a singularity by comparing the result with entire for x ~= 0.
domain = not (isentire (result)) | (inf (x) <= 0 & sup (x) >= 0);
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (csc (infsupdec (1)), infsupdec ("[0x1.303AA9620B223, 0x1.303AA9620B224]_com")));
+%!# from the documentation string
+%!assert (isequal (csc (infsupdec (1)), infsupdec ("[0x1.303AA9620B223, 0x1.303AA9620B224]_com")));
diff --git a/inst/@infsupdec/csch.m b/inst/@infsupdec/csch.m
index 75534e1..55a1933 100644
--- a/inst/@infsupdec/csch.m
+++ b/inst/@infsupdec/csch.m
@@ -46,12 +46,13 @@ if (isnai (x))
return
endif
-result = newdec (csch (intervalpart (x)));
+result = newdec (csch (x.infsup));
## csch is defined and continuous for x ~= 0
-result.dec = min (result.dec, x.dec);
result.dec (inf (x) <= 0 & sup (x) >= 0) = _trv ();
+result.dec = min (result.dec, x.dec);
+
endfunction
-%!test "from the documentation string";
-%! assert (isequal (csch (infsupdec (1)), infsupdec ("[0x1.B3AB8A78B90Cp-1, 0x1.B3AB8A78B90C1p-1]_com")));
+%!# from the documentation string
+%!assert (isequal (csch (infsupdec (1)), infsupdec ("[0x1.B3AB8A78B90Cp-1, 0x1.B3AB8A78B90C1p-1]_com")));
diff --git a/inst/@infsupdec/decorationpart.m b/inst/@infsupdec/decorationpart.m
index 30a61d0..eac2df7 100644
--- a/inst/@infsupdec/decorationpart.m
+++ b/inst/@infsupdec/decorationpart.m
@@ -92,7 +92,7 @@ persistent dec_translation = {...
"com"};
dec = cell (size (x.dec));
-dec (:) = dec_translation (x.dec (:) + 1);
+dec(:) = dec_translation(x.dec(:) + 1);
endfunction
diff --git a/inst/@infsupdec/det.m b/inst/@infsupdec/det.m
index 500749d..8f40128 100644
--- a/inst/@infsupdec/det.m
+++ b/inst/@infsupdec/det.m
@@ -44,15 +44,10 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (det (intervalpart (x)));
+result = newdec (det (x.infsup));
result.dec = min (result.dec, min (min (x.dec)));
endfunction
-%!test "from the documentation string";
-%! assert (det (infsupdec (magic (3))) == -360);
+%!# from the documentation string
+%!assert (det (infsupdec (magic (3))) == -360);
diff --git a/inst/@infsupdec/diag.m b/inst/@infsupdec/diag.m
index 78bc6b0..1036f54 100644
--- a/inst/@infsupdec/diag.m
+++ b/inst/@infsupdec/diag.m
@@ -42,36 +42,30 @@
## Keywords: interval
## Created: 2015-10-24
-function result = diag (x, m, n)
+function x = diag (x, varargin)
-if (not (isa (x, 'infsupdec')))
- error ('diag: invalid argument; only the first may be an interval');
-endif
-if (isnai (x))
- result = x;
+if (nargin > 3)
+ print_usage ();
return
endif
-switch (nargin)
- case 1
- result = newdec (diag (intervalpart (x)));
- result.dec = diag (x.dec);
- case 2
- result = newdec (diag (intervalpart (x), m));
- result.dec = diag (x.dec, m);
- case 3
- result = newdec (diag (intervalpart (x), m, n));
- result.dec = diag (x.dec, m, n);
- otherwise
- print_usage ();
-endswitch
+if ((nargin >= 2 && isa (varargin{1}, 'infsup')) || ...
+ (nargin >= 3 && isa (varargin{2}, 'infsup')))
+ error ('diag: invalid argument; only the first may be an interval');
+endif
+
+x.dec(x.dec == 0) = uint8 (255);
+
+x.infsup = diag (x.infsup, varargin{:});
+x.dec = diag (x.dec, varargin{:});
-result.dec (result.dec == 0) = _com (); # any new elements are [0]_com
+x.dec(x.dec == uint8 (0)) = _com (); # any new elements are [0]_com
+x.dec(x.dec == uint8 (255)) = uint8 (0);
endfunction
%!assert (diag (infsupdec (-inf, inf)) == "[Entire]");
%!assert (diag (infsupdec ()) == "[Empty]");
%!assert (numel (diag (infsupdec ([]))), 0);
-%!xtest assert (isequal (diag (infsupdec (magic (3))), infsupdec ([8; 5; 2])));
-%!xtest assert (isequal (diag (infsupdec ([8 5 3])), infsupdec ([8 0 0; 0 5 0; 0 0 3])));
+%!assert (isequal (diag (infsupdec (magic (3))), infsupdec ([8; 5; 2])));
+%!assert (isequal (diag (infsupdec ([8 5 3])), infsupdec ([8 0 0; 0 5 0; 0 0 3])));
diff --git a/inst/@infsupdec/dilog.m b/inst/@infsupdec/dilog.m
index 54995e9..6115d9c 100644
--- a/inst/@infsupdec/dilog.m
+++ b/inst/@infsupdec/dilog.m
@@ -57,17 +57,13 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (dilog (intervalpart (x)));
+result = newdec (dilog (x.infsup));
## dilog is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
%!assert (isequal (dilog (infsupdec (-inf, inf)), infsupdec ("[-Inf, +0x1.3BD3CC9BE45DFp1]_dac")));
-%!test "from the documentation string";
-%! assert (isequal (dilog (infsupdec (1)), infsupdec ("[0x1.A51A6625307D3, 0x1.A51A6625307D4]_com")));
+
+%!# from the documentation string
+%!assert (isequal (dilog (infsupdec (1)), infsupdec ("[0x1.A51A6625307D3, 0x1.A51A6625307D4]_com")));
diff --git a/inst/@infsupdec/disjoint.m b/inst/@infsupdec/disjoint.m
index b0a4128..3b528d1 100644
--- a/inst/@infsupdec/disjoint.m
+++ b/inst/@infsupdec/disjoint.m
@@ -45,11 +45,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = disjoint (intervalpart (a), intervalpart (b));
-endif
+result = disjoint (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false ();
endfunction
diff --git a/inst/@infsupdec/dot.m b/inst/@infsupdec/dot.m
index a2566de..236795b 100644
--- a/inst/@infsupdec/dot.m
+++ b/inst/@infsupdec/dot.m
@@ -86,12 +86,13 @@ if ((min (size (x.dec, 1), size (y.dec, 1)) > 1 && ...
error ("interval:InvalidOperand", "dot: sizes of X and Y must match")
endif
-result = newdec (dot (intervalpart (x), intervalpart (y), dim));
+result = newdec (dot (x.infsup, y.infsup, dim));
+warning ("off", "Octave:broadcast", "local");
result.dec = min (result.dec, ...
min (min (x.dec, [], dim), min (y.dec, [], dim)));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (dot ([infsupdec(1), 2, 3], [infsupdec(2), 3, 4]), infsupdec (20)));
-%! assert (isequal (dot (infsupdec ([realmax; realmin; realmax]), [1; -1; -1], 1), infsupdec (-realmin)));
+%!# from the documentation string
+%!assert (isequal (dot ([infsupdec(1), 2, 3], [infsupdec(2), 3, 4]), infsupdec (20)));
+%!assert (isequal (dot (infsupdec ([realmax; realmin; realmax]), [1; -1; -1], 1), infsupdec (-realmin)));
diff --git a/inst/@infsupdec/ei.m b/inst/@infsupdec/ei.m
index bc90762..8c20250 100644
--- a/inst/@infsupdec/ei.m
+++ b/inst/@infsupdec/ei.m
@@ -57,16 +57,13 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (ei (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (ei (x.infsup));
## ei is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec (not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
@@ -75,5 +72,5 @@ endfunction
%!assert (isequal (ei (infsupdec (0, inf)), infsupdec ("[Entire]_trv")));
%!assert (isequal (ei (infsupdec (1, inf)), infsupdec ("[0x1.E52670F350D08, Inf]_dac")));
-%!test "from the documentation string";
-%! assert (isequal (ei (infsupdec (1)), infsupdec ("[0x1.E52670F350D08, 0x1.E52670F350D09]_com")));
+%!# from the documentation string
+%!assert (isequal (ei (infsupdec (1)), infsupdec ("[0x1.E52670F350D08, 0x1.E52670F350D09]_com")));
diff --git a/inst/@infsupdec/eq.m b/inst/@infsupdec/eq.m
index 53a1142..5004964 100644
--- a/inst/@infsupdec/eq.m
+++ b/inst/@infsupdec/eq.m
@@ -53,31 +53,31 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = eq (intervalpart (a), intervalpart (b));
-endif
+result = eq (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false ();
endfunction
-%!test "Empty interval";
-%! assert (eq (infsupdec (), infsupdec ()) == true);
-%! assert (eq (infsupdec (), infsupdec (1)) == false);
-%! assert (eq (infsupdec (0), infsupdec ()) == false);
-%! assert (eq (infsupdec (-inf, inf), infsupdec ()) == false);
-%!test "Singleton intervals";
-%! assert (eq (infsupdec (0), infsupdec (1)) == false);
-%! assert (eq (infsupdec (0), infsupdec (0)) == true);
-%!test "Bounded intervals";
-%! assert (eq (infsupdec (1, 2), infsupdec (3, 4)) == false);
-%! assert (eq (infsupdec (1, 2), infsupdec (2, 3)) == false);
-%! assert (eq (infsupdec (1, 2), infsupdec (1.5, 2.5)) == false);
-%! assert (eq (infsupdec (1, 2), infsupdec (1, 2)) == true);
-%!test "Unbounded intervals";
-%! assert (eq (infsupdec (0, inf), infsupdec (-inf, 0)) == false);
-%! assert (eq (infsupdec (0, inf), infsupdec (0, inf)) == true);
-%! assert (eq (infsupdec (-inf, 0), infsupdec (-inf, 0)) == true);
-%! assert (eq (infsupdec (-inf, inf), infsupdec (42)) == false);
-%! assert (eq (infsupdec (-inf, 0), infsupdec (-inf, inf)) == false);
-%! assert (eq (infsupdec (-inf, inf), infsupdec (-inf, inf)) == true);
+%!# Empty interval
+%!assert (eq (infsupdec (), infsupdec ()) == true);
+%!assert (eq (infsupdec (), infsupdec (1)) == false);
+%!assert (eq (infsupdec (0), infsupdec ()) == false);
+%!assert (eq (infsupdec (-inf, inf), infsupdec ()) == false);
+
+%!# Singleton intervals
+%!assert (eq (infsupdec (0), infsupdec (1)) == false);
+%!assert (eq (infsupdec (0), infsupdec (0)) == true);
+
+%!# Bounded intervals
+%!assert (eq (infsupdec (1, 2), infsupdec (3, 4)) == false);
+%!assert (eq (infsupdec (1, 2), infsupdec (2, 3)) == false);
+%!assert (eq (infsupdec (1, 2), infsupdec (1.5, 2.5)) == false);
+%!assert (eq (infsupdec (1, 2), infsupdec (1, 2)) == true);
+
+%!# Unbounded intervals
+%!assert (eq (infsupdec (0, inf), infsupdec (-inf, 0)) == false);
+%!assert (eq (infsupdec (0, inf), infsupdec (0, inf)) == true);
+%!assert (eq (infsupdec (-inf, 0), infsupdec (-inf, 0)) == true);
+%!assert (eq (infsupdec (-inf, inf), infsupdec (42)) == false);
+%!assert (eq (infsupdec (-inf, 0), infsupdec (-inf, inf)) == false);
+%!assert (eq (infsupdec (-inf, inf), infsupdec (-inf, inf)) == true);
diff --git a/inst/@infsupdec/erf.m b/inst/@infsupdec/erf.m
index f465789..c6bc20c 100644
--- a/inst/@infsupdec/erf.m
+++ b/inst/@infsupdec/erf.m
@@ -58,16 +58,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (erf (intervalpart (x)));
+result = newdec (erf (x.infsup));
## erf is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (erf (infsupdec (1)) == "[0x1.AF767A741088Ap-1, 0x1.AF767A741088Bp-1]");
+%!# from the documentation string
+%!assert (erf (infsupdec (1)) == "[0x1.AF767A741088Ap-1, 0x1.AF767A741088Bp-1]");
diff --git a/inst/@infsupdec/erfc.m b/inst/@infsupdec/erfc.m
index 94cf1ec..64c1d7c 100644
--- a/inst/@infsupdec/erfc.m
+++ b/inst/@infsupdec/erfc.m
@@ -17,7 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsupdec} erfc (@var{X})
##
-## Compute the complementary error function.
+## Compute the complementary error function @code{1 - erf (@var{X})}.
##
## @tex
## $$
@@ -58,16 +58,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (erfc (intervalpart (x)));
+result = newdec (erfc (x.infsup));
## erfc is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (erfc (infsupdec (1)) == "[0x1.4226162FBDDD4p-3, 0x1.4226162FBDDD5p-3]");
+%!# from the documentation string
+%!assert (erfc (infsupdec (1)) == "[0x1.4226162FBDDD4p-3, 0x1.4226162FBDDD5p-3]");
diff --git a/inst/@infsupdec/exp.m b/inst/@infsupdec/exp.m
index 98262ea..86627ee 100644
--- a/inst/@infsupdec/exp.m
+++ b/inst/@infsupdec/exp.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (exp (intervalpart (x)));
+result = newdec (exp (x.infsup));
## exp is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (exp (infsupdec (1)), infsupdec ("e")));
+%!# from the documentation string
+%!assert (isequal (exp (infsupdec (1)), infsupdec ("e")));
diff --git a/inst/@infsupdec/expm1.m b/inst/@infsupdec/expm1.m
index 7e37da7..c36e407 100644
--- a/inst/@infsupdec/expm1.m
+++ b/inst/@infsupdec/expm1.m
@@ -17,7 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsupdec} expm1 (@var{X})
##
-## Compute @code{exp (@var{X} - 1)} accurately in the neighborhood of zero.
+## Compute @code{exp (@var{X}) - 1} accurately in the neighborhood of zero.
##
## Accuracy: The result is a tight enclosure.
##
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (expm1 (intervalpart (x)));
+result = newdec (expm1 (x.infsup));
## expm1 is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (expm1 (infsupdec (eps)), infsupdec ("[0x1p-52, 0x1.0000000000001p-52]")));
+%!# from the documentation string
+%!assert (isequal (expm1 (infsupdec (eps)), infsupdec ("[0x1p-52, 0x1.0000000000001p-52]")));
diff --git a/inst/@infsupdec/factorial.m b/inst/@infsupdec/factorial.m
index dd5d6d7..fd6eec6 100644
--- a/inst/@infsupdec/factorial.m
+++ b/inst/@infsupdec/factorial.m
@@ -17,8 +17,7 @@
## @documentencoding UTF-8
## @defmethod {@@infsup} factorial (@var{N})
##
-## Compute the factorial of @var{N} where @var{N} is a real non-negative
-## integer.
+## Compute the factorial of @var{N} where @var{N} is a non-negative integer.
##
## If @var{N} is a scalar, this is equivalent to
## @display
@@ -28,7 +27,7 @@
## array.
##
## For non-integers see the generalized factorial function @command{gamma}.
-## Not that the factorial function grows large quite quickly, and the result
+## Note that the factorial function grows large quite quickly, and the result
## cannot be represented exactly in binary64 for @var{N} ≥ 23 and will overflow
## for @var{N} ≥ 171.
##
@@ -54,24 +53,21 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
## The function is not continuous, since it is defined for non-negative
## integrals only. Thus the best possible decoration can be “dac”.
-result = infsupdec (factorial (intervalpart (x)), "dac");
-result.dec = min (result.dec, x.dec);
+result = infsupdec (factorial (x.infsup), "dac");
## The function is defined for non-negative integrals only
defined = issingleton (x) & fix (sup (x)) == sup (x);
-result.dec (not (defined)) = _trv ();
+result.dec(not (defined)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (factorial (infsupdec (6)) == infsupdec (720, "dac"));
+%!# from the documentation string
+%!assert (factorial (infsupdec (6)) == infsupdec (720, "dac"));
+
%!assert (factorial (infsupdec (0)) == infsupdec (1, "dac"));
%!assert (factorial (infsupdec ("[0, 1.99]")) == infsupdec (1, "trv"));
%!assert (factorial (infsupdec ("[0, 2]")) == "[1, 2]_trv");
diff --git a/inst/@infsupdec/fix.m b/inst/@infsupdec/fix.m
index 10c8a53..4eab307 100644
--- a/inst/@infsupdec/fix.m
+++ b/inst/@infsupdec/fix.m
@@ -44,27 +44,23 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (fix (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (fix (x.infsup));
## Between two integral numbers the function is constant, thus continuous
## At x == 0 the function is continuous.
discontinuous = not (issingleton (result));
-result.dec (discontinuous) = min (result.dec (discontinuous), _def ());
+result.dec(discontinuous) = min (result.dec(discontinuous), _def ());
onlyrestrictioncontinuous = issingleton (result) & ...
((sup (x) < 0 & fix (sup (x)) == sup (x)) | ...
(inf (x) > 0 & fix (inf (x)) == inf (x)));
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (fix (infsupdec (2.5, 3.5)), infsupdec (2, 3, "def")));
-%! assert (isequal (fix (infsupdec (-0.5, 5)), infsupdec (0, 5, "def")));
+%!# from the documentation string
+%!assert (isequal (fix (infsupdec (2.5, 3.5)), infsupdec (2, 3, "def")));
+%!assert (isequal (fix (infsupdec (-0.5, 5)), infsupdec (0, 5, "def")));
diff --git a/inst/@infsupdec/floor.m b/inst/@infsupdec/floor.m
index c36a961..4bcf94c 100644
--- a/inst/@infsupdec/floor.m
+++ b/inst/@infsupdec/floor.m
@@ -43,24 +43,20 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (floor (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (floor (x.infsup));
## Between two integral numbers the function is constant, thus continuous
discontinuous = not (issingleton (result));
-result.dec (discontinuous) = min (result.dec (discontinuous), _def ());
+result.dec(discontinuous) = min (result.dec(discontinuous), _def ());
onlyrestrictioncontinuous = issingleton (result) & fix (inf (x)) == inf (x);
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (floor (infsupdec (2.5, 3.5)), infsupdec (2, 3, "def")));
-%! assert (isequal (floor (infsupdec (-0.5, 5)), infsupdec (-1, 5, "def")));
+%!# from the documentation string
+%!assert (isequal (floor (infsupdec (2.5, 3.5)), infsupdec (2, 3, "def")));
+%!assert (isequal (floor (infsupdec (-0.5, 5)), infsupdec (-1, 5, "def")));
diff --git a/inst/@infsupdec/fma.m b/inst/@infsupdec/fma.m
index 1f7b2de..380eb2f 100644
--- a/inst/@infsupdec/fma.m
+++ b/inst/@infsupdec/fma.m
@@ -58,25 +58,11 @@ if (not (isa (z, "infsupdec")))
z = infsupdec (z);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-if (isnai (z))
- result = z;
- return
-endif
-
-result = newdec (...
- fma (intervalpart (x), intervalpart (y), intervalpart (z)));
+result = newdec (fma (x.infsup, y.infsup, z.infsup));
## fma is defined and continuous everywhere
result.dec = min (result.dec, min (x.dec, min (y.dec, z.dec)));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (fma (infsupdec (1+eps), infsupdec (7), infsupdec ("0.1")), infsupdec ("[0x1.C666666666668p2, 0x1.C666666666669p2]")));
+%!# from the documentation string
+%!assert (isequal (fma (infsupdec (1+eps), infsupdec (7), infsupdec ("0.1")), infsupdec ("[0x1.C666666666668p2, 0x1.C666666666669p2]")));
diff --git a/inst/@infsupdec/gamma.m b/inst/@infsupdec/gamma.m
index add96e3..17385f8 100644
--- a/inst/@infsupdec/gamma.m
+++ b/inst/@infsupdec/gamma.m
@@ -59,21 +59,17 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (gamma (intervalpart (x)));
+result = newdec (gamma (x.infsup));
## gamma is continuous where it is defined
-result.dec = min (result.dec, x.dec);
undefined = (inf (x) <= 0 & fix (inf (x)) == inf (x)) | ...
(sup (x) <= 0 & fix (sup (x)) == sup (x)) | ...
(inf (x) < 0 & ceil (inf (x)) <= floor (sup (x)));
-result.dec (undefined) = min (result.dec (undefined), _trv ());
+result.dec(undefined) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (gamma (infsupdec (1.5)), infsupdec ("[0x1.C5BF891B4EF6Ap-1, 0x1.C5BF891B4EF6Bp-1]_com")));
+%!# from the documentation string
+%!assert (isequal (gamma (infsupdec (1.5)), infsupdec ("[0x1.C5BF891B4EF6Ap-1, 0x1.C5BF891B4EF6Bp-1]_com")));
diff --git a/inst/@infsupdec/gammaln.m b/inst/@infsupdec/gammaln.m
index f65c652..ef21e2c 100644
--- a/inst/@infsupdec/gammaln.m
+++ b/inst/@infsupdec/gammaln.m
@@ -58,19 +58,17 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (gammaln (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (gammaln (x.infsup));
## gammaln is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
%!assert (isequal (gammaln (infsupdec (-inf, inf)), infsupdec ("[-0x1.F19B9BCC38A42p-4, +Inf]_trv")));
-%!test "from the documentation string";
-%! assert (isequal (gammaln (infsupdec (1.5)), infsupdec ("[-0x1.EEB95B094C192p-4, -0x1.EEB95B094C191p-4]_com")));
+
+%!# from the documentation string
+%!assert (isequal (gammaln (infsupdec (1.5)), infsupdec ("[-0x1.EEB95B094C192p-4, -0x1.EEB95B094C191p-4]_com")));
diff --git a/inst/@infsupdec/gauss.m b/inst/@infsupdec/gauss.m
index d5babe5..3899b1e 100644
--- a/inst/@infsupdec/gauss.m
+++ b/inst/@infsupdec/gauss.m
@@ -57,18 +57,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = infsupdec (gauss (intervalpart (x), intervalpart (y)), "trv");
+result = infsupdec (gauss (x.infsup, y.infsup), "trv");
+warning ("off", "Octave:broadcast", "local");
+result.dec = min (result.dec, min (vec (min (x.dec, y.dec))));
endfunction
-%!xtest "from the documentation string";
-%! assert (isequal (gauss (infsupdec ([1, 0; 0, 2]), [2, 0; 0, 4]), infsupdec ([2, 0; 0, 2], "trv")));
+%!# from the documentation string
+%!assert (isequal (gauss (infsupdec ([1, 0; 0, 2]), [2, 0; 0, 4]), infsupdec ([2, 0; 0, 2], "trv")));
diff --git a/inst/@infsupdec/horzcat.m b/inst/@infsupdec/horzcat.m
deleted file mode 100644
index f7adc57..0000000
--- a/inst/@infsupdec/horzcat.m
+++ /dev/null
@@ -1,66 +0,0 @@
-## Copyright 2014-2016 Oliver Heimlich
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @documentencoding UTF-8
-## @defop Method {@@infsupdec} horzcat (@var{ARRAY1}, @var{ARRAY2}, @dots{})
-## @defopx Operator {@@infsupdec} {[@var{ARRAY1}, @var{ARRAY2}, @dots{}]}
-##
-## Return the horizontal concatenation of interval array objects along
-## dimension 2.
-##
-## @example
-## @group
-## a = infsupdec (2, 5);
-## [a, a, a]
-## @result{} ans = 1×3 interval vector
-## [2, 5]_com [2, 5]_com [2, 5]_com
-## @end group
-## @end example
-## @seealso{@@infsupdec/vertcat}
-## @end defop
-
-## Author: Oliver Heimlich
-## Keywords: interval
-## Created: 2014-11-02
-
-function result = horzcat (varargin)
-
-## Conversion to interval
-decoratedintervals = cellfun ("isclass", varargin, "infsupdec");
-to_convert = not (decoratedintervals);
-varargin (to_convert) = cellfun (@infsupdec, varargin (to_convert), ...
- "UniformOutput", false ());
-
-nais = cellfun (@isnai, varargin);
-if (any (nais))
- ## Simply return first NaI
- result = varargin {find (nais, 1)};
- return
-endif
-
-l = cell2mat (cellfun (@inf, varargin, "UniformOutput", false ()));
-u = cell2mat (cellfun (@sup, varargin, "UniformOutput", false ()));
-d = cell2mat (cellfun (@(x) x.dec, varargin, "UniformOutput", false ()));
-
-result = newdec (infsup (l, u));
-result.dec = d;
-
-endfunction
-
-%!xtest assert (isequal (horzcat (infsupdec (1), infsupdec (2)), infsupdec (horzcat (1, 2))));
-%!xtest "from the documentation string";
-%! a = infsupdec (2, 5);
-%! assert (isequal (horzcat (a, a, a), infsupdec ([2, 2, 2], [5, 5, 5])));
diff --git a/inst/@infsupdec/hypot.m b/inst/@infsupdec/hypot.m
index a143d2a..d9196ab 100644
--- a/inst/@infsupdec/hypot.m
+++ b/inst/@infsupdec/hypot.m
@@ -51,20 +51,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (hypot (intervalpart (x), intervalpart (y)));
+result = newdec (hypot (x.infsup, y.infsup));
## hypot is continuous and defined everywhere
result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (hypot (infsupdec (2, 3), infsupdec (1, 2)), infsupdec ("[0x1.1E3779B97F4A7p1, 0x1.CD82B446159F4p1]")));
+%!# from the documentation string
+%!assert (isequal (hypot (infsupdec (2, 3), infsupdec (1, 2)), infsupdec ("[0x1.1E3779B97F4A7p1, 0x1.CD82B446159F4p1]")));
diff --git a/inst/@infsup/inf.m b/inst/@infsupdec/inf.m
similarity index 67%
copy from inst/@infsup/inf.m
copy to inst/@infsupdec/inf.m
index e8ae8de..144bfed 100644
--- a/inst/@infsup/inf.m
+++ b/inst/@infsupdec/inf.m
@@ -1,4 +1,4 @@
-## Copyright 2014-2016 Oliver Heimlich
+## Copyright 2016 Oliver Heimlich
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -15,26 +15,28 @@
## -*- texinfo -*-
## @documentencoding UTF-8
-## @defmethod {@@infsup} inf (@var{X})
+## @defmethod {@@infsupdec} inf (@var{X})
+## @comment DO NOT SYNCHRONIZE DOCUMENTATION STRING
##
## Get the (greatest) lower boundary for all numbers of interval @var{X}.
##
-## If @var{X} is empty, @code{inf (@var{X})} is positive infinity.
+## If @var{X} is empty, @code{inf (@var{X})} is positive infinity. If @var{X}
+## is NaI, @code{inf (@var{X})} is NaN.
##
## Accuracy: The result is exact.
##
## @example
## @group
-## inf (infsup (2.5, 3.5))
+## inf (infsupdec (2.5, 3.5))
## @result{} ans = 2.5000
## @end group
## @end example
-## @seealso{@@infsup/sup, @@infsup/mid}
+## @seealso{@@infsupdec/sup, @@infsup/mid}
## @end defmethod
## Author: Oliver Heimlich
## Keywords: interval
-## Created: 2014-09-27
+## Created: 2016-09-18
function result = inf (x)
@@ -43,16 +45,13 @@ if (nargin ~= 1)
return
endif
-if (isa (x, "infsupdec"))
- ## We cannot override this function in infsupdec, because that would create
- ## an infinite loop.
- if (isnai (x))
- error ("interval:NaI", "NaI has no infimum")
- endif
-endif
+result = inf (x.infsup);
+result(isnai (x)) = nan;
-result = x.inf;
endfunction
-%!test "from the documentation string";
-%! assert (inf (infsup (2.5, 3.5)), 2.5);
+%!assert (inf (infsupdec (2.5, 3.5)), 2.5);
+%!assert (inf (infsupdec ()), +inf);
+%!assert (inf (infsupdec ("[nai]")), nan);
+%!warning id=interval:UndefinedOperation
+%! assert (inf (infsupdec (2, 1)), nan);
diff --git a/inst/@infsupdec/infsupdec.m b/inst/@infsupdec/infsupdec.m
index db15854..ef82554 100644
--- a/inst/@infsupdec/infsupdec.m
+++ b/inst/@infsupdec/infsupdec.m
@@ -101,262 +101,360 @@
function [x, isexact] = infsupdec (varargin)
-## The decorated version must return NaI instead of an error if interval
-## construction failed, so we use a try & catch block.
-try
- if (nargin >= 1 && ischar (varargin {end}))
- varargin {end} = __split_interval_literals__ (varargin {end});
+persistent scalar_empty_interval = class (struct ("dec", _trv), ...
+ "infsupdec", infsup ());
+
+## Enable all mixed mode functions to use decorated variants with implicit
+## conversion from bare to decorated intervals.
+##
+## There is bug #42735 in GNU Octave core, which makes this a little
+## complicated: When [infsup] [operator] [infsupdec] syntax is used, the
+## decoration from the second argument would be lost, because the bare
+## implementation for the operator is evaluated. However, sufficient runtime
+## checks have been placed in the overloaded class operator implementations of
+## the infsup class as a workaround.
+##
+## The workaround is necessary, because otherwise this could lead to wrong
+## results, which is catastrophic for a verified computation package.
+superiorto ("infsup");
+
+if (nargin == 0)
+ x = scalar_empty_interval;
+ isexact = true;
+ return
+endif
+
+if (nargin == 1 && isa (varargin{1}, "infsupdec"))
+ x = varargin{1};
+ isexact = true;
+ return
+endif
+
+for i = 1 : numel (varargin)
+ if (ischar (varargin{i}))
+ varargin{i} = __split_interval_literals__ (varargin{i});
endif
+endfor
+
+if (nargin >= 1 && ...
+ iscellstr (varargin{end}) && ...
+ not (isempty (varargin{end})) && ...
+ any (strcmpi (varargin{end}{1}, ...
+ {"com", "dac", "def", "trv", "ill"})))
+ ## The decoration information has been passed as the last parameter
+ decstr = varargin{end};
+ varargin = varargin(1 : end - 1);
## The setDec function, as described by IEEE Std 1788-2015,
## may fix decorations
- fix_illegal_decorations = true ();
+ fix_illegal_decorations = true;
+elseif (nargin == 1 && iscell (varargin{1}))
+ ## Extract decorations from possibly decorated interval literals
+ char_idx = cellfun ("ischar", varargin{1});
- if (nargin >= 1 && ...
- iscellstr (varargin {end}) && ...
- not (isempty (varargin {end})) && ...
- any (strcmpi (varargin {end} {1}, ...
- {"com", "dac", "def", "trv", "ill"})))
- ## The decoration information has been passed as the last parameter
- decstr = varargin {end};
- switch nargin
- case 1
- [bare, isexact] = infsup ();
- case 2
- if (isa (varargin {1}, "infsup"))
- bare = infsup (inf (varargin {1}), sup (varargin {1}));
- isexact = true ();
- else
- [bare, isexact] = infsup (varargin {1});
- endif
- case 3
- [bare, isexact] = infsup (varargin {1}, varargin {2});
- otherwise
- print_usage ();
- return
- endswitch
- elseif (nargin == 1 && iscell (varargin {1}))
- ## Parse possibly decorated interval literals
- chars = cellfun ("ischar", varargin {1});
- varargin {1} (chars) = cellfun (@strsplit, ...
- varargin {1} (chars), ...
- {"_"}, ...
- "UniformOutput", false);
- if (any (any (cellfun ("size", varargin {1} (chars), 2) > 2)))
- ## More than 2 underscores in any literal
- error ("interval:InvalidOperand", ...
- "illegal decorated interval literal")
- endif
- ## Extract decoration
- decstr = cell (size (varargin {1}));
- hasdec = false (size (varargin {1}));
- hasdec (chars) = cellfun ("size", varargin {1} (chars), 2) == 2;
- decstr (hasdec) = cellfun (@(x) x {2}, varargin {1} (hasdec), ...
- "UniformOutput", false);
- varargin {1} (chars) = cellfun (@(x) x {1}, varargin {1} (chars), ...
- "UniformOutput", false);
-
- ## Note: The representation of NaI, will trigger an error in the infsup
- ## constructor
- [bare, isexact, overflow] = infsup (varargin {1});
-
- ## Silently fix decorated interval literals when overflow occurred
- decstr (overflow & strcmpi (decstr, "com")) = "dac";
-
- ## Interval literals must not carry illegal decorations
- fix_illegal_decorations = false ();
- else
- ## Undecorated interval boundaries
- decstr = {""};
- switch nargin
- case 0
- [bare, isexact] = infsup ();
- case 1
- if (isa (varargin {1}, "infsupdec"))
- x = varargin {1};
- isexact = true ();
- return
- elseif (isa (varargin {1}, "infsup"))
- bare = varargin {1};
- isexact = true ();
- if (not (all (all (isempty (bare)))))
- warning ("interval:ImplicitPromote", ...
- ["Implicitly decorated bare interval; ", ...
- "resulting decoration may be wrong"]);
- endif
- else
- [bare, isexact] = infsup (varargin {1});
- endif
- case 2
- [bare, isexact] = infsup (varargin {1}, varargin {2});
- otherwise
- print_usage ();
- endswitch
+ ## Split bare interval literal and decoration
+ literal_and_decoration = cellfun ("strsplit", ...
+ varargin{1}(char_idx), {"_"}, ...
+ "UniformOutput", false);
+
+ number_of_parts = cellfun ("numel", literal_and_decoration);
+ illegal_local_idx = number_of_parts > 2;
+ if (any (illegal_local_idx(:)))
+ ## More than 2 underscores in any literal
+ warning ("interval:UndefinedOperation", ...
+ "illegal decorated interval literal")
+ literal_and_decoration(illegal_local_idx) = {"[nai]"};
endif
- assert (isa (bare, "infsup"));
- assert (iscell (decstr));
+ ## Ignore strings without decoration
+ has_decoration_local_idx = (number_of_parts == 2);
+ literal_and_decoration = literal_and_decoration(has_decoration_local_idx);
+ char_idx(char_idx) = has_decoration_local_idx;
+
+ ## Extract decoration
+ decstr = cell (size (varargin{1}));
+ decstr(char_idx) = vertcat ({}, ...
+ cellindexmat (literal_and_decoration, 2){:});
+ varargin{1}(char_idx) = vertcat({}, ...
+ cellindexmat (literal_and_decoration, 1){:});
+
+ ## Interval literals must not carry illegal decorations
+ fix_illegal_decorations = false;
+else
+ ## Undecorated interval boundaries
+ decstr = {""};
+ ## No need to fix illegal decorations
+ fix_illegal_decorations = false;
+endif
- ## Convert decoration strings into decoration matrix.
- ## Initialize the matrix with the ill decoration, which is not allowed to
- ## be used explicitly as a parameter to this function.
- dec = _ill () (ones (size (decstr)));
+switch numel (varargin)
+ case 0
+ [bare, isexact] = infsup ();
+ isnai = overflow = false;
- ## Missing decorations will later be assigned their final value
- missingdecoration_value = uint8 (1); # magic value, not used otherwise
- dec (cellfun ("isempty", decstr)) = missingdecoration_value;
+ case 1
+ switch class (varargin{1})
+ case "infsup"
+ bare = varargin{1};
+ isexact = true;
+ isnai = overflow = false (size (bare));
+ if (nargin == 1 && any (not (isempty (bare)(:))))
+ warning ("interval:ImplicitPromote", ...
+ ["Implicitly decorated bare interval; ", ...
+ "resulting decoration may be wrong"]);
+ endif
+
+ case "infsupdec"
+ ## setDec and newDec replace the current decoration
+ ## with a new one
+ bare = struct (varargin{1}).infsup;
+ isexact = true;
+ isnai = overflow = false (size (bare));
+
+ case "cell"
+ ## [nai] is a legal literal, but not allowed in the infsup
+ ## constructor. Create a silent nai in these cases.
+ nai_literal_idx = not (cellfun ("isempty", ...
+ regexp (varargin{1}, '^\[\s*nai\s*\]$', ...
+ "ignorecase")));
+ varargin{1}(nai_literal_idx) = "[]";
+ [bare, isexact, overflow, isnai] = infsup (varargin{1});
+ isnai(nai_literal_idx) = true;
+
+ otherwise
+ [bare, isexact, overflow, isnai] = infsup (varargin{1});
+
+ endswitch
+
+ case 2
+ [bare, isexact, overflow, isnai] = infsup (varargin{1}, varargin{2});
- dec (strcmpi (decstr, "com")) = _com ();
- dec (strcmpi (decstr, "dac")) = _dac ();
- dec (strcmpi (decstr, "def")) = _def ();
- dec (strcmpi (decstr, "trv")) = _trv ();
+ otherwise
+ print_usage ();
+ return
+endswitch
- if (any (any (dec == _ill ())))
- error ("interval:InvalidOperand", "illegal decoration");
- endif
+## Convert decoration strings into decoration matrix.
+## Initialize the matrix with the ill decoration, which is not allowed to
+## be used explicitly as a parameter to this function.
+dec = repmat (_ill, size (decstr));
- ## Broadcast decoration
- if (isscalar (dec) && not (isscalar (bare)))
- dec = dec (ones (size (bare)));
- elseif (not (all (size (dec) == size (bare))))
- error ("interval:InvalidOperand", "decoration size mismatch")
- endif
+## Missing decorations will later be assigned their final value
+missingdecoration_value = uint8 (1); # magic value, not used otherwise
+dec(cellfun ("isempty", decstr)) = missingdecoration_value;
- ## Add missing decoration
- missingdecoration = dec == missingdecoration_value;
- dec (missingdecoration) = _dac ();
- dec (missingdecoration & isempty (bare)) = _trv ();
- dec (missingdecoration & iscommoninterval (bare)) = _com ();
-
- ## Check decoration
- empty_not_trv = isempty (bare) & dec ~= _trv ();
- if (any (any (empty_not_trv)))
- if (not (fix_illegal_decorations))
- error ("interval:InvalidOperand", ...
- "illegal decorated interval literal")
+dec(strcmpi (decstr, "com")) = _com;
+dec(strcmpi (decstr, "dac")) = _dac;
+dec(strcmpi (decstr, "def")) = _def;
+dec(strcmpi (decstr, "trv")) = _trv;
+
+if (any ((dec == _ill)(:)))
+ warning ("interval:UndefinedOperation", "illegal decoration");
+endif
+
+## Broadcast decoration and bare interval
+if (not (isequal (size (bare), size (dec))))
+ for dim = 1 : max (ndims (bare), ndims (dec))
+ if (size (bare, dim) != 1 && size (dec, dim) != 1 && ...
+ size (bare, dim) != size (dec, dim))
+ warning ("interval:InvalidOperand", ...
+ ["infsupdec: Dimensions of decoration and interval ", ...
+ "are not compatible"]);
+ ## Unable to recover from this kind of error
+ x = scalar_empty_interval;
+ isexact = false;
+ return
endif
- isexact = false ();
- dec (empty_not_trv) = _trv ();
+ endfor
+ dec = dec + zeros (size (bare), "uint8");
+ bare = bare + zeros (size (dec));
+endif
+
+## If creation failed in infsup constructor, make an illegal interval
+dec(isnai) = _ill;
+
+## Silently fix decoration when overflow occurred
+dec(overflow & (dec == _com)) = _dac;
+
+## Add missing decoration
+missingdecoration = (dec == missingdecoration_value);
+dec(missingdecoration) = _dac;
+dec(missingdecoration & isempty (bare)) = _trv;
+dec(missingdecoration & iscommoninterval (bare)) = _com;
+
+## Check decoration
+empty_not_trv = isempty (bare) & (dec ~= _trv) & (dec ~= _ill);
+if (any (empty_not_trv(:)))
+ if (not (fix_illegal_decorations))
+ warning ("interval:UndefinedOperation", ...
+ "illegal decorated empty interval literal")
+ dec(empty_not_trv) = _ill;
+ else
+ dec(empty_not_trv) = _trv;
endif
- uncommon_com = not (iscommoninterval (bare)) & dec == _com ();
- if (any (any (uncommon_com)))
- if (not (fix_illegal_decorations))
- error ("interval:InvalidOperand", ...
- "illegal decorated interval literal")
- endif
- isexact = false ();
- dec (uncommon_com) = _dac ();
+ isexact = false ();
+endif
+uncommon_com = not (iscommoninterval (bare)) & (dec == _com);
+if (any (uncommon_com(:)))
+ if (not (fix_illegal_decorations))
+ warning ("interval:UndefinedOperation", ...
+ "illegal decorated uncommon interval literal")
+ dec(uncommon_com) = _ill;
+ else
+ dec(uncommon_com) = _dac;
endif
-catch
- switch lasterror.identifier
- case "Octave:invalid-fun-call"
- print_usage ();
- case "interval:NaI"
- ## The bare inverval:NaI error can only occur, if the interval
- ## literal [NaI] is observed. In that particular case, we must not
- ## issue a warning.
- case {"interval:PossiblyUndefined", ...
- "interval:ImplicitPromote"}
- ## The user has set these warnings to error, which we must respect
- rethrow (lasterror)
- otherwise
- warning ("interval:NaI", lasterror.message);
- endswitch
- ## NaI representation is unique.
- bare = infsup ();
- dec = _ill ();
isexact = false ();
-end_try_catch
+endif
-x.dec = dec;
-
-x = class (x, "infsupdec", bare);
+## Illegal intervals must be empty
+illegal = (dec == _ill);
+if (any (illegal(:)))
+ bare(illegal) = infsup ();
+ isexact = false ();
+endif
-## Enable all mixed mode functions to use decorated variants with implicit
-## conversion from bare to decorated intervals.
-##
-## There is bug #42735 in GNU Octave core, which makes this a little
-## complicated: When [infsup] [operator] [infsupdec] syntax is used, the
-## decoration from the second argument would be lost, because the bare
-## implementation for the operator is evaluated. However, sufficient runtime
-## checks have been placed in the overloaded class operator implementations of
-## the infsup class as a workaround.
-##
-## The workaround is necessary, because otherwise this could lead to wrong
-## results, which is catastrophic for a verified computation package.
-superiorto ("infsup");
+x = class (struct ("dec", dec), "infsupdec", bare);
endfunction
%!# [NaI]s
-%! assert (isnai (infsupdec ("[nai]"))); # quiet [NaI]
-%!warning assert (isnai (infsupdec (3, 2)));
-%!warning assert (isnai (infsupdec ("Flugeldufel")));
-%!warning assert (isnai (infsupdec ("[1, Inf]_com")));
-%!warning assert (isnai (infsupdec ("[Empty]_def")));
-%!test "decoration adjustments, setDec function";
-%! assert (inf (infsupdec (42, inf, "com")), 42);
-%! assert (sup (infsupdec (42, inf, "com")), inf);
-%! assert (strcmp (decorationpart (infsupdec (42, inf, "com")), "dac"));
-%! assert (inf (infsupdec (-inf, inf, "com")), -inf);
-%! assert (sup (infsupdec (-inf, inf, "com")), inf);
-%! assert (strcmp (decorationpart (infsupdec (-inf, inf, "com")), "dac"));
-%! assert (inf (infsupdec (inf, -inf, "def")), inf);
-%! assert (sup (infsupdec (inf, -inf, "def")), -inf);
-%! assert (strcmp (decorationpart (infsupdec (inf, -inf, "def")), "trv"));
-%!test "overflow";
-%! assert (inf (infsupdec ("[1, 1e999]_com")), 1);
-%! assert (sup (infsupdec ("[1, 1e999]_com")), inf);
-%! assert (strcmp (decorationpart (infsupdec ("[1, 1e999]_com")), "dac"));
-%!test "decorated interval literal";
-%! assert (inf (infsupdec ("[2, 3]_def")), 2);
-%! assert (sup (infsupdec ("[2, 3]_def")), 3);
-%! assert (strcmp (decorationpart (infsupdec ("[2, 3]_def")), "def"));
-%! assert (inf (infsupdec ("trv")), inf);
-%! assert (sup (infsupdec ("trv")), -inf);
-%! assert (strcmp (decorationpart (infsupdec ("trv")), "trv"));
-%!test "automatic decoration";
-%! assert (inf (infsupdec ("[2, 3]")), 2);
-%! assert (sup (infsupdec ("[2, 3]")), 3);
-%! assert (strcmp (decorationpart (infsupdec ("[2, 3]")), "com"));
-%! assert (inf (infsupdec ("[Empty]")), inf);
-%! assert (sup (infsupdec ("[Empty]")), -inf);
-%! assert (strcmp (decorationpart (infsupdec ("[Empty]")), "trv"));
-%! assert (inf (infsupdec ("[Entire]")), -inf);
-%! assert (sup (infsupdec ("[Entire]")), inf);
-%! assert (strcmp (decorationpart (infsupdec ("[Entire]")), "dac"));
-%! assert (inf (infsupdec ("")), -inf);
-%! assert (sup (infsupdec ("")), +inf);
-%! assert (strcmp (decorationpart (infsupdec ("")), "dac"));
-%!test "separate decoration information";
-%! assert (inf (infsupdec ("[2, 3]", "def")), 2);
-%! assert (sup (infsupdec ("[2, 3]", "def")), 3);
-%! assert (strcmp (decorationpart (infsupdec ("[2, 3]", "def")), "def"));
-%!test "cell array with decorated intervals";
-%! assert (inf (infsupdec ({"[2, 3]_def", "[4, 5]_dac"})), [2, 4]);
-%! assert (sup (infsupdec ({"[2, 3]_def", "[4, 5]_dac"})), [3, 5]);
-%! assert (all (strcmp (decorationpart (infsupdec ({"[2, 3]_def", "[4, 5]_dac"})), {"def", "dac"})));
-%!test "cell array with separate decoration cell array";
-%! assert (inf (infsupdec ({"[2, 3]", "[4, 5]"}, {"def", "dac"})), [2, 4]);
-%! assert (sup (infsupdec ({"[2, 3]", "[4, 5]"}, {"def", "dac"})), [3, 5]);
-%! assert (all (strcmp (decorationpart (infsupdec ({"[2, 3]", "[4, 5]"}, {"def", "dac"})), {"def", "dac"})));
-%!test "cell array with separate decoration vector";
-%! assert (inf (infsupdec ({"[2, 3]"; "[4, 5]"}, ["def"; "dac"])), [2; 4]);
-%! assert (sup (infsupdec ({"[2, 3]"; "[4, 5]"}, ["def"; "dac"])), [3; 5]);
-%! assert (all (strcmp (decorationpart (infsupdec ({"[2, 3]"; "[4, 5]"}, ["def"; "dac"])), {"def"; "dac"})));
-%!test "cell array with broadcasting decoration";
-%! assert (inf (infsupdec ({"[2, 3]", "[4, 5]"}, "def")), [2, 4]);
-%! assert (sup (infsupdec ({"[2, 3]", "[4, 5]"}, "def")), [3, 5]);
-%! assert (all (strcmp (decorationpart (infsupdec ({"[2, 3]", "[4, 5]"}, "def")), {"def", "def"})));
-%!test "separate boundaries with decoration";
-%! assert (inf (infsupdec (2, 3, "def")), 2);
-%! assert (sup (infsupdec (2, 3, "def")), 3);
-%! assert (strcmp (decorationpart (infsupdec (2, 3, "def")), "def"));
-%!test "matrix boundaries with decoration";
-%! assert (inf (infsupdec ([3, 16], {"def", "trv"})), [3, 16]);
-%! assert (sup (infsupdec ([3, 16], {"def", "trv"})), [3, 16]);
-%! assert (all ( strcmp (decorationpart (infsupdec ([3, 16], {"def", "trv"})), {"def", "trv"})));
-%!test "separate matrix boundaries with broadcasting decoration";
-%! assert (inf (infsupdec (magic (3), magic (3) + 1, "def")), magic (3));
-%! assert (sup (infsupdec (magic (3), magic (3) + 1, "def")), magic (3) + 1);
-%! assert (all ( all (strcmp (decorationpart (infsupdec (magic (3), magic (3) + 1, "def")), {"def", "def", "def"; "def", "def", "def"; "def", "def", "def"}))));
+%!assert (isnai (infsupdec ("[nai]"))); # quiet [NaI]
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (infsupdec (3, 2))); # illegal boundaries
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (infsupdec (inf, -inf))); # illegal boundaries
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (infsupdec ("Flugeldufel"))); # illegal literal
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (infsupdec ("[1, Inf]_com"))); # illegal decorated literal
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (infsupdec ("[Empty]_def"))); # illegal decorated literal
+
+%!# decoration adjustments, setDec function
+%!test
+%! x = infsupdec (42, inf, "com");
+%! assert (inf (x), 42);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+%!test
+%! x = infsupdec (-inf, inf, {"com"});
+%! assert (inf (x), -inf);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+%!test
+%! x = infsupdec ("def");
+%! assert (inf (x), inf);
+%! assert (sup (x), -inf);
+%! assert (decorationpart (x), {"trv"});
+
+%!# overflow
+%!test
+%! x = infsupdec ("[1, 1e999]_com");
+%! assert (inf (x), 1);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+
+%!# decorated interval literal
+%!test
+%! x = infsupdec ("[2, 3]_def");
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%! assert (decorationpart (x), {"def"});
+%!test
+%! x = infsupdec ("[1, 5]_dac");
+%! assert (inf (x), 1);
+%! assert (sup (x), 5);
+%! assert (decorationpart (x), {"dac"});
+%!test
+%! x = infsupdec ("[1, Infinity]_dac");
+%! assert (inf (x), 1);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+%!test
+%! x = infsupdec ("[Empty]_trv");
+%! assert (inf (x), inf);
+%! assert (sup (x), -inf);
+%! assert (decorationpart (x), {"trv"});
+
+%!# automatic decoration / undecorated interval literal / newDec function
+%!test
+%! x = infsupdec ("[2, 3]");
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%! assert (decorationpart (x), {"com"});
+%!test
+%! x = infsupdec ("[Empty]");
+%! assert (inf (x), inf);
+%! assert (sup (x), -inf);
+%! assert (decorationpart (x), {"trv"});
+%!test
+%! x = infsupdec ("[Entire]");
+%! assert (inf (x), -inf);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+%!test
+%! x = infsupdec ("");
+%! assert (inf (x), -inf);
+%! assert (sup (x), inf);
+%! assert (decorationpart (x), {"dac"});
+
+%!# separate decoration information
+%!test
+%! x = infsupdec ("[2, 3]", "def");
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%! assert (decorationpart (x), {"def"});
+
+%!# cell array with decorated interval literals
+%!test
+%! x = infsupdec ({"[2, 3]_def", "[4, 5]_dac"});
+%! assert (inf (x), [2, 4]);
+%! assert (sup (x), [3, 5]);
+%! assert (decorationpart (x), {"def", "dac"});
+
+%!#cell array with separate decoration cell array
+%!test
+%! x = infsupdec ({"[2, 3]", "[4, 5]"}, {"def", "dac"});
+%! assert (inf (x), [2, 4]);
+%! assert (sup (x), [3, 5]);
+%! assert (decorationpart (x), {"def", "dac"});
+
+%!# cell array with separate decoration vector
+%!test
+%! x = infsupdec ({"[2, 3]"; "[4, 5]"}, ["def"; "dac"]);
+%! assert (inf (x), [2; 4]);
+%! assert (sup (x), [3; 5]);
+%! assert (decorationpart (x), {"def"; "dac"});
+
+%!# cell array with broadcasting decoration
+%!test
+%! x = infsupdec ({"[2, 3]", "[4, 5]"}, "def");
+%! assert (inf (x), [2, 4]);
+%! assert (sup (x), [3, 5]);
+%! assert (decorationpart (x), {"def", "def"});
+%!test
+%! x = infsupdec ({"[2, 3]", "[4, 5]"}, "def; dac");
+%! assert (inf (x), [2, 4; 2, 4]);
+%! assert (sup (x), [3, 5; 3, 5]);
+%! assert (decorationpart (x), {"def", "def"; "dac", "dac"});
+
+%!# separate boundaries with decoration
+%!test
+%! x = infsupdec (2, 3, "def");
+%! assert (inf (x), 2);
+%! assert (sup (x), 3);
+%! assert (decorationpart (x), {"def"});
+
+%!# matrix boundaries with decoration
+%!test
+%! x = infsupdec ([3, 16], {"def", "trv"});
+%! assert (inf (x), [3, 16]);
+%! assert (sup (x), [3, 16]);
+%! assert (decorationpart (x), {"def", "trv"});
+
+%!# separate matrix boundaries with broadcasting decoration
+%!test
+%! x = infsupdec (magic (3), magic (3) + 1, "def");
+%! assert (inf (x), magic (3));
+%! assert (sup (x), magic (3) + 1);
+%! assert (decorationpart (x), {"def", "def", "def"; "def", "def", "def"; "def", "def", "def"});
diff --git a/inst/@infsupdec/interior.m b/inst/@infsupdec/interior.m
index e55074f..3368c87 100644
--- a/inst/@infsupdec/interior.m
+++ b/inst/@infsupdec/interior.m
@@ -46,11 +46,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = interior (intervalpart (a), intervalpart (b));
-endif
+result = interior (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/intersect.m b/inst/@infsupdec/intersect.m
index b8a931d..0d03552 100644
--- a/inst/@infsupdec/intersect.m
+++ b/inst/@infsupdec/intersect.m
@@ -52,37 +52,30 @@ if (not (isa (a, "infsupdec")))
a = infsupdec (a);
endif
-if (isnai (a))
- result = a;
- return
-endif
-
switch (nargin)
case 1
- bare = intersect (intervalpart (a));
+ result = infsupdec (intersect (a.infsup), "trv");
+ result.dec = min (result.dec, min (a.dec));
+
case 2
if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
- if (isnai (b))
- result = b;
- return
- endif
- bare = intersect (intervalpart (a), intervalpart (b));
+ result = infsupdec (intersect (a.infsup, b.infsup), "trv");
+ warning ("off", "Octave:broadcast", "local");
+ result.dec = min (result.dec, min (a.dec, b.dec));
case 3
if (not (builtin ("isempty", b)))
warning ("intersect: second argument is ignored");
endif
- bare = intersect (intervalpart (a), [], dim);
+ result = infsupdec (intersect (a.infsup, [], dim), "trv");
+ result.dec = min (result.dec, min (a.dec, [], dim));
otherwise
print_usage ();
return
endswitch
-## intersection must not retain any useful decoration
-result = infsupdec (bare, "trv");
-
endfunction
-%!test "from the documentation string";
-%! assert (isequal (intersect (infsupdec (1, 3), infsupdec (2, 4)), infsupdec (2, 3, "trv")));
+%!# from the documentation string
+%!assert (isequal (intersect (infsupdec (1, 3), infsupdec (2, 4)), infsupdec (2, 3, "trv")));
diff --git a/inst/@infsupdec/intervalpart.m b/inst/@infsupdec/intervalpart.m
index c058a93..c9a0021 100644
--- a/inst/@infsupdec/intervalpart.m
+++ b/inst/@infsupdec/intervalpart.m
@@ -33,13 +33,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- error ("interval:IntvlPartOfNaI", "intervalpart: NaI has no interval part")
+if (any (isnai (x)(:)))
+ warning ("interval:IntvlPartOfNaI", ...
+ "intervalpart: NaI has no interval part")
endif
-## This also works for the empty interval
-bare = infsup (inf (x), sup (x));
+bare = x.infsup;
endfunction
+%!warning id=interval:IntvlPartOfNaI
+%! assert (intervalpart (nai ()) == infsup ());
%!assert (intervalpart (infsupdec (2, 3)) == infsup (2, 3));
diff --git a/inst/@infsupdec/intervaltotext.m b/inst/@infsupdec/intervaltotext.m
index edc9407..df411ce 100644
--- a/inst/@infsupdec/intervaltotext.m
+++ b/inst/@infsupdec/intervaltotext.m
@@ -51,21 +51,16 @@ if (nargin < 2)
format = "decimal";
endif
-if (isnai (x))
- s = "[NaI]";
- isexact = true ();
- return
-endif
-
-[s, isexact] = intervaltotext (intervalpart (x), format);
+[s, isexact] = intervaltotext (x.infsup, format);
s = strcat (s, {"_"}, decorationpart (x));
+s(isnai (x)) = "[NaI]";
if (isscalar (s))
- s = s {1};
+ s = s{1};
endif
endfunction
%!assert (intervaltotext (infsupdec (1 + eps), "exact decimal"), "[1.0000000000000002220446049250313080847263336181640625]_com");
-%!assert (intervaltotext (infsupdec (1 + eps), "exact hexadecimal"), "[0X1.0000000000001P+0]_com");
+%!assert (intervaltotext (infsupdec (1 + eps), "exact hexadecimal"), "[0x1.0000000000001p+0]_com");
%!assert (intervaltotext (infsupdec (1 + eps)), "[1.0000000000000002, 1.000000000000001]_com");
%!assert (intervaltotext (infsupdec (1)), "[1]_com");
diff --git a/inst/@infsupdec/isempty.m b/inst/@infsupdec/isempty.m
index e9961b4..902b64e 100644
--- a/inst/@infsupdec/isempty.m
+++ b/inst/@infsupdec/isempty.m
@@ -38,13 +38,10 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = false ();
-else
- result = isempty (intervalpart (x));
-endif
+result = isempty (x.infsup);
+result(isnai (x)) = false;
endfunction
-%!assert (isempty (infsupdec (inf, -inf)));
+%!assert (isempty (infsupdec ()));
%!assert (not (isempty (infsupdec (1, 2))));
diff --git a/inst/@infsupdec/isnai.m b/inst/@infsupdec/isnai.m
index 84a701f..9b9d3da 100644
--- a/inst/@infsupdec/isnai.m
+++ b/inst/@infsupdec/isnai.m
@@ -33,10 +33,11 @@ if (nargin ~= 1)
return
endif
-## NaI is internally stored as a scalar empty interval with ill decoration.
-result = isscalar (interval.dec) && interval.dec == _ill ();
+## NaI is internally stored as an empty interval with ill decoration.
+result = (interval.dec == _ill ());
endfunction
%!assert (isnai (infsupdec ("[nai]")));
%!assert (not (isnai (infsupdec (2, 3))));
+%!warning assert (isnai (infsupdec ("happy 42 hacking")), logical ([1 0 1]));
diff --git a/inst/@infsupdec/le.m b/inst/@infsupdec/le.m
index 2cab772..408a08c 100644
--- a/inst/@infsupdec/le.m
+++ b/inst/@infsupdec/le.m
@@ -47,11 +47,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = le (intervalpart (a), intervalpart (b));
-endif
+result = le (a.infsup, b.infsup);
+result (isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/linspace.m b/inst/@infsupdec/linspace.m
index 3fd8bb0..83fcc21 100644
--- a/inst/@infsupdec/linspace.m
+++ b/inst/@infsupdec/linspace.m
@@ -62,19 +62,10 @@ if (nargin < 3)
n = 100;
endif
-if (isnai (base))
- result = base;
- return
-endif
-if (isnai (limit))
- result = limit;
- return
-endif
-
-result = newdec (linspace (intervalpart (base), intervalpart (limit), n));
+result = newdec (linspace (base.infsup, limit.infsup, n));
## linspace is defined and continuous everywhere
result.dec = min (result.dec, min (base.dec, limit.dec));
endfunction
-%!xtest assert (isequal (linspace (infsupdec (0), infsupdec (10), 9), infsupdec (linspace (0, 10, 9))));
+%!assert (isequal (linspace (infsupdec (0), infsupdec (10), 9), infsupdec (linspace (0, 10, 9))));
diff --git a/inst/@infsupdec/log.m b/inst/@infsupdec/log.m
index a6388de..bae6573 100644
--- a/inst/@infsupdec/log.m
+++ b/inst/@infsupdec/log.m
@@ -43,18 +43,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (log (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (log (x.infsup));
## log is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (log (infsupdec (2)), infsupdec ("[0x1.62E42FEFA39EFp-1, 0x1.62E42FEFA39Fp-1]")));
+%!# from the documentation string
+%!assert (isequal (log (infsupdec (2)), infsupdec ("[0x1.62E42FEFA39EFp-1, 0x1.62E42FEFA39Fp-1]")));
diff --git a/inst/@infsupdec/log10.m b/inst/@infsupdec/log10.m
index 4edb654..b204106 100644
--- a/inst/@infsupdec/log10.m
+++ b/inst/@infsupdec/log10.m
@@ -43,18 +43,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (log10 (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (log10 (x.infsup));
## log10 is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (log10 (infsupdec (2)), infsupdec ("[0x1.34413509F79FEp-2, 0x1.34413509F79FFp-2]")));
+%!# from the documentation string
+%!assert (isequal (log10 (infsupdec (2)), infsupdec ("[0x1.34413509F79FEp-2, 0x1.34413509F79FFp-2]")));
diff --git a/inst/@infsupdec/log1p.m b/inst/@infsupdec/log1p.m
index b3a3eab..df4f297 100644
--- a/inst/@infsupdec/log1p.m
+++ b/inst/@infsupdec/log1p.m
@@ -43,18 +43,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (log1p (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (log1p (x.infsup));
## log1p is continuous everywhere, but defined for x > -1 only
-result.dec (not (interior (x, infsupdec (-1, inf)))) = _trv ();
+persistent domain_hull = infsup (-1, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (log1p (infsupdec (eps)), infsupdec ("[0x1.FFFFFFFFFFFFFp-53, 0x1p-52]")));
+%!# from the documentation string
+%!assert (isequal (log1p (infsupdec (eps)), infsupdec ("[0x1.FFFFFFFFFFFFFp-53, 0x1p-52]")));
diff --git a/inst/@infsupdec/log2.m b/inst/@infsupdec/log2.m
index 7055aad..f783bf0 100644
--- a/inst/@infsupdec/log2.m
+++ b/inst/@infsupdec/log2.m
@@ -43,18 +43,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (log2 (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (log2 (x.infsup));
## log2 is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (log2 (infsupdec (2)), infsupdec (1)));
+%!# from the documentation string
+%!assert (isequal (log2 (infsupdec (2)), infsupdec (1)));
diff --git a/inst/@infsupdec/lt.m b/inst/@infsupdec/lt.m
index 9f3d724..daf358f 100644
--- a/inst/@infsupdec/lt.m
+++ b/inst/@infsupdec/lt.m
@@ -47,11 +47,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = lt (intervalpart (a), intervalpart (b));
-endif
+result = lt (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/lu.m b/inst/@infsupdec/lu.m
index c26ac4b..6524a24 100644
--- a/inst/@infsupdec/lu.m
+++ b/inst/@infsupdec/lu.m
@@ -20,12 +20,14 @@
##
## Compute the LU decomposition of @var{A}.
##
-## @var{A} will be a subset of @var{L} * @var{U}.
+## @var{A} will be a subset of @var{L} * @var{U} with lower triangular matrix
+## @var{L} and upper triangular matrix @var{U}.
##
## The result is returned in a permuted form, according to the optional return
## value @var{P}.
##
## Accuracy: The result is a valid enclosure.
+## @seealso{@infsup/qr}
## @end deftypemethod
## Author: Oliver Heimlich
@@ -41,14 +43,14 @@ endif
P = eye (size (x.dec));
if (isnai (x))
- L = U = x;
+ L = U = nai ();
return
endif
if (nargout >= 3)
- [L, U, P] = lu (intervalpart (x));
+ [L, U, P] = lu (x.infsup);
else
- [L, U] = lu (intervalpart (x));
+ [L, U] = lu (x.infsup);
endif
## Reverse operations should not carry decoration
@@ -57,7 +59,7 @@ U = infsupdec (U, "trv");
endfunction
-%!xtest
+%!test
%! [l, u] = lu (infsupdec (magic (3)));
%! assert (isequal (l, infsupdec ({1, 0, 0; .375, 1, 0; .5, "68/37", 1}, "trv")));, ...
%! assert (subset (u, infsupdec ({8, 1, 6; 0, 4.625, 4.75; 0, 0, "-0x1.3759F2298375Bp3"}, ...
diff --git a/inst/@infsupdec/max.m b/inst/@infsupdec/max.m
index 1c29c50..49a6527 100644
--- a/inst/@infsupdec/max.m
+++ b/inst/@infsupdec/max.m
@@ -54,28 +54,19 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
-
switch (nargin)
case 1
- bare = max (intervalpart (x));
+ bare = max (x.infsup);
case 2
if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
- if (isnai (y))
- result = y;
- return
- endif
- bare = max (intervalpart (x), intervalpart (y));
+ bare = max (x.infsup, y.infsup);
case 3
if (not (builtin ("isempty", y)))
warning ("max: second argument is ignored");
endif
- bare = max (intervalpart (x), [], dim);
+ bare = max (x.infsup, [], dim);
otherwise
print_usage ();
return
@@ -87,6 +78,7 @@ switch (nargin)
case 1
result.dec = min (result.dec, min (x.dec));
case 2
+ warning ("off", "Octave:broadcast", "local");
result.dec = min (result.dec, min (x.dec, y.dec));
case 3
result.dec = min (result.dec, min (x.dec, [], dim));
@@ -94,5 +86,5 @@ endswitch
endfunction
-%!test "from the documentation string";
-%! assert (isequal (max (infsupdec (2, 3), infsupdec (1, 2)), infsupdec (2, 3)));
+%!# from the documentation string
+%!assert (isequal (max (infsupdec (2, 3), infsupdec (1, 2)), infsupdec (2, 3)));
diff --git a/inst/@infsupdec/meshgrid.m b/inst/@infsupdec/meshgrid.m
index 0368e60..91e5394 100644
--- a/inst/@infsupdec/meshgrid.m
+++ b/inst/@infsupdec/meshgrid.m
@@ -53,46 +53,34 @@ if (nargin >= 3 && not (isa (z, "infsupdec")))
z = infsupdec (z);
endif
-if (isnai (x))
- xx = yy = zz = x;
- return
-endif
-if (nargin >= 2 && isnai (y))
- xx = yy = zz = y;
- return
-endif
-if (nargin >= 3 && isnai (z))
- xx = yy = zz = z;
- return
-endif
-
switch (nargin)
case 1
if (nargout >= 3)
- [xx, yy, zz] = meshgrid (intervalpart (x));
+ [xx, yy, zz] = meshgrid (x.infsup);
[dxx, dyy, dzz] = meshgrid (x.dec);
else
- [xx, yy] = meshgrid (intervalpart (x));
+ [xx, yy] = meshgrid (x.infsup);
[dxx, dyy] = meshgrid (x.dec);
endif
case 2
if (nargout >= 3)
- [xx, yy, zz] = meshgrid (intervalpart (x), intervalpart (y));
+ [xx, yy, zz] = meshgrid (x.infsup, y.infsup);
[dxx, dyy, dzz] = meshgrid (x.dec, y.dec);
else
- [xx, yy] = meshgrid (intervalpart (x), intervalpart (y));
+ [xx, yy] = meshgrid (x.infsup, y.infsup);
[dxx, dyy] = meshgrid (x.dec, y.dec);
endif
case 3
- [xx, yy, zz] = meshgrid (intervalpart (x), ...
- intervalpart (y), ...
- intervalpart (z));
+ [xx, yy, zz] = meshgrid (x.infsup, ...
+ y.infsup, ...
+ z.infsup);
[dxx, dyy, dzz] = meshgrid (x.dec, y.dec, z.dec);
endswitch
if (nargout >= 3 || nargin >= 3)
## Reshape 3 dimensions into 2 dimensions
f = @(A) reshape (A, [size(A,1), prod(size (A)(2 : end))]);
+ ## No need to reshape xx, yy, and zz (already happens in @infsup/meshgrid)
dxx = f (dxx);
dyy = f (dyy);
dzz = f (dzz);
@@ -108,4 +96,4 @@ endif
endfunction
-%!xtest assert (isequal (meshgrid (infsupdec (0 : 3)), infsupdec (meshgrid (0 : 3))));
+%!assert (isequal (meshgrid (infsupdec (0 : 3)), infsupdec (meshgrid (0 : 3))));
diff --git a/inst/@infsupdec/min.m b/inst/@infsupdec/min.m
index 37fd123..20587e5 100644
--- a/inst/@infsupdec/min.m
+++ b/inst/@infsupdec/min.m
@@ -54,28 +54,19 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
-
switch (nargin)
case 1
- bare = min (intervalpart (x));
+ bare = min (x.infsup);
case 2
if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
- if (isnai (y))
- result = y;
- return
- endif
- bare = min (intervalpart (x), intervalpart (y));
+ bare = min (x.infsup, y.infsup);
case 3
if (not (builtin ("isempty", y)))
warning ("min: second argument is ignored");
endif
- bare = min (intervalpart (x), [], dim);
+ bare = min (x.infsup, [], dim);
otherwise
print_usage ();
return
@@ -87,6 +78,7 @@ switch (nargin)
case 1
result.dec = min (result.dec, min (x.dec));
case 2
+ warning ("off", "Octave:broadcast", "local");
result.dec = min (result.dec, min (x.dec, y.dec));
case 3
result.dec = min (result.dec, min (x.dec, [], dim));
@@ -94,5 +86,5 @@ endswitch
endfunction
-%!test "from the documentation string";
-%! assert (isequal (min (infsupdec (2, 3), infsupdec (1, 2)), infsupdec (1, 2)));
+%!# from the documentation string
+%!assert (isequal (min (infsupdec (2, 3), infsupdec (1, 2)), infsupdec (1, 2)));
diff --git a/inst/@infsupdec/mince.m b/inst/@infsupdec/mince.m
index a40f3f7..1d86fd2 100644
--- a/inst/@infsupdec/mince.m
+++ b/inst/@infsupdec/mince.m
@@ -56,13 +56,10 @@ endif
if (nargin < 2)
n = 100;
endif
-if (isnai (x))
- result = x;
- return
-endif
-result = infsupdec (mince (intervalpart (x), n), "trv");
+result = infsupdec (mince (x.infsup, n), "trv");
+result.dec = min (result.dec, x.dec);
endfunction
-%!xtest assert (isequal (mince (infsupdec (0, 10), 10), infsupdec (0 : 9, 1 : 10, "trv")));
+%!assert (isequal (mince (infsupdec (0, 10), 10), infsupdec (0 : 9, 1 : 10, "trv")));
diff --git a/inst/@infsupdec/minus.m b/inst/@infsupdec/minus.m
index 6c9d75d..ad22019 100644
--- a/inst/@infsupdec/minus.m
+++ b/inst/@infsupdec/minus.m
@@ -51,20 +51,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (minus (intervalpart (x), intervalpart (y)));
+result = newdec (minus (x.infsup, y.infsup));
## minus is defined and continuous everywhere
result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (infsupdec (2, 3) - infsupdec (1, 2), infsupdec (0, 2)));
+%!# from the documentation string
+%!assert (isequal (infsupdec (2, 3) - infsupdec (1, 2), infsupdec (0, 2)));
diff --git a/inst/@infsupdec/mldivide.m b/inst/@infsupdec/mldivide.m
index 6f51657..5b8efdb 100644
--- a/inst/@infsupdec/mldivide.m
+++ b/inst/@infsupdec/mldivide.m
@@ -50,23 +50,18 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
## Reverse operations should not carry decoration
-result = infsupdec (mldivide (intervalpart (x), intervalpart (y)), "trv");
+result = infsupdec (mldivide (x.infsup, y.infsup), "trv");
+warning ("off", "Octave:broadcast", "local");
+result.dec = min (result.dec, min (vec (min (x.dec, y.dec))));
endfunction
-%!xtest "unique solution";
-%! assert (isequal (infsupdec ([1, 0; 0, 2]) \ [2, 0; 0, 4], infsupdec ([2, 0; 0 2], "trv")));
-%!test "no solution";
-%! assert (all (isempty (infsupdec ([1, 0; 2, 0]) \ [3; 0])));
-%!xtest "many solutions";
-%! assert (isequal (infsupdec ([1, 0; 2, 0]) \ [4; 8], infsupdec ([4; -inf], [4; inf], "trv")));
+%!# unique solution
+%!assert (isequal (infsupdec ([1, 0; 0, 2]) \ [2, 0; 0, 4], infsupdec ([2, 0; 0 2], "trv")));
+
+%!# no solution
+%!assert (all (isempty (infsupdec ([1, 0; 2, 0]) \ [3; 0])));
+
+%!# many solutions
+%!assert (isequal (infsupdec ([1, 0; 2, 0]) \ [4; 8], infsupdec ([4; -inf], [4; inf], "trv")));
diff --git a/inst/@infsupdec/mpower.m b/inst/@infsupdec/mpower.m
index 763884c..47af2fc 100644
--- a/inst/@infsupdec/mpower.m
+++ b/inst/@infsupdec/mpower.m
@@ -66,7 +66,7 @@ if (not (isreal (y)) || fix (y) ~= y)
"mpower: only integral powers can be computed");
endif
-result = newdec (mpower (intervalpart (x), y));
+result = newdec (mpower (x.infsup, y));
if (y < 0)
result.dec(:) = _trv ();
@@ -77,10 +77,10 @@ elseif (y == 2)
result.dec = min (result.dec, min (min (x.dec, [], 1), ...
min (x.dec, [], 2)));
elseif (y > 2)
- result.dec = min (result.dec, min (min (x.dec)));
+ result.dec = min (result.dec, min (vec (x.dec)));
endif
endfunction
-%!xtest "from the documentation string";
-%! assert (isequal (infsupdec (magic (3)) ^ 2, infsupdec (magic (3) ^ 2)));
+%!# from the documentation string
+%!assert (isequal (infsupdec (magic (3)) ^ 2, infsupdec (magic (3) ^ 2)));
diff --git a/inst/@infsupdec/mtimes.m b/inst/@infsupdec/mtimes.m
index 1b74f6f..27f4804 100644
--- a/inst/@infsupdec/mtimes.m
+++ b/inst/@infsupdec/mtimes.m
@@ -62,7 +62,11 @@ endif
## null matrix input -> null matrix output
if (isempty (x.dec) || isempty (y.dec))
- result = infsupdec (zeros (0));
+ if (size (x.dec, 2) ~= size (y.dec, 1))
+ error ("interval:InvalidOperand", ...
+ "operator *: nonconformant arguments");
+ endif
+ result = infsupdec (zeros (rows (x.dec), columns (y.dec)));
return
endif
@@ -72,9 +76,9 @@ if (isscalar (x) || isscalar (y))
endif
if (nargin == 2)
- result = newdec (mtimes (intervalpart (x), intervalpart (y)));
+ result = newdec (mtimes (x.infsup, y.infsup));
else
- result = newdec (mtimes (intervalpart (x), intervalpart (y), accuracy));
+ result = newdec (mtimes (x.infsup, y.infsup, accuracy));
endif
dec_x = min (x.dec, [], 2);
@@ -84,6 +88,7 @@ result.dec = min (result.dec, min (dec_x, dec_y));
endfunction
-%!xtest assert (isequal (infsupdec ([1, 2; 7, 15], [2, 2; 7.5, 15], {"com", "def"; "dac", "com"}) * infsupdec ([3, 3; 0, 1], [3, 3.25; 0, 2]), infsupdec ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375], {"def", "def"; "dac", "dac"})));
-%!xtest "from the documentation string";
-%! assert (isequal (infsupdec ([1, 2; 7, 15], [2, 2; 7.5, 15]) * infsupdec ([3, 3; 0, 1], [3, 3.25; 0, 2]), infsupdec ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375])));
+%!assert (isequal (infsupdec ([1, 2; 7, 15], [2, 2; 7.5, 15], {"com", "def"; "dac", "com"}) * infsupdec ([3, 3; 0, 1], [3, 3.25; 0, 2]), infsupdec ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375], {"def", "def"; "dac", "dac"})));
+
+%!# from the documentation string
+%!assert (isequal (infsupdec ([1, 2; 7, 15], [2, 2; 7.5, 15]) * infsupdec ([3, 3; 0, 1], [3, 3.25; 0, 2]), infsupdec ([3, 5; 21, 36], [6, 10.5; 22.5, 54.375])));
diff --git a/inst/@infsupdec/mulrev.m b/inst/@infsupdec/mulrev.m
index aaca552..450522f 100644
--- a/inst/@infsupdec/mulrev.m
+++ b/inst/@infsupdec/mulrev.m
@@ -77,43 +77,39 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- u = v = x;
- return
-endif
-if (isnai (b))
- u = v = b;
- return
-endif
-if (isnai (c))
- u = v = c;
- return
-endif
-
if (nargout < 2)
- u = mulrev (intervalpart (b), intervalpart (c), intervalpart (x));
+ u = mulrev (b.infsup, c.infsup, x.infsup);
u = infsupdec (u, "trv");
+ u.dec(isnai (x) | isnai (b) | isnai (c)) = _ill ();
else
- [u, v] = mulrev (intervalpart (b), intervalpart (c), intervalpart (x));
+ [u, v] = mulrev (b.infsup, c.infsup, x.infsup);
u = newdec (u);
+ u.dec(isempty (b) | isempty (c) | ismember (0, b)) = _trv ();
u.dec = min (u.dec, min (b.dec, c.dec));
- u.dec (isempty (b) | isempty (c) | ismember (0, b)) = _trv ();
+ u.dec(isnai (x)) = _ill ();
v = infsupdec (v, "trv");
+ v.dec(isnai (x) | isnai (b) | isnai (c)) = _ill ();
endif
endfunction
-%!test "IEEE Std 1788-2015 mulRevToPair examples";
+%!# IEEE Std 1788-2015 mulRevToPair examples
+%!test
%! [u, v] = mulrev (infsupdec (0), infsupdec (1, 2));
%! assert (isempty (u) & isempty (v));
+%!test
%! [u, v] = mulrev (infsupdec (0), infsupdec (0, 1));
%! assert (isentire (u) & isempty (v));
+%!test
%! [u, v] = mulrev (infsupdec (1), infsupdec (1, 2));
%! assert (isequal (u, infsupdec (1, 2)) & isempty (v));
+%!test
%! [u, v] = mulrev (infsupdec (1, inf), infsupdec (1));
%! assert (isequal (u, infsupdec (0, 1, "dac")) & isempty (v));
+%!test
%! [u, v] = mulrev (infsupdec (-1, 1), infsupdec (1, 2));
%! assert (isequal (u, infsupdec (-inf, -1, "trv")) & isequal (v, infsupdec (1, inf, "trv")));
+%!test
%! [u, v] = mulrev (infsupdec (-inf, inf), infsupdec (1));
%! assert (isequal (u, infsupdec (-inf, 0, "trv")) & isequal (v, infsupdec (0, inf, "trv")));
diff --git a/inst/@infsupdec/nextout.m b/inst/@infsupdec/nextout.m
index 911e1f3..9180f16 100644
--- a/inst/@infsupdec/nextout.m
+++ b/inst/@infsupdec/nextout.m
@@ -45,16 +45,13 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (nextout (intervalpart (x)), "trv");
+result = infsupdec (nextout (x.infsup), "trv");
+result.dec(isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
+%!# from the documentation string
+%!test
%! x = nextout (infsupdec (1));
%! assert (inf (x), 1 - eps / 2);
%! assert (sup (x), 1 + eps);
diff --git a/inst/@infsupdec/nthroot.m b/inst/@infsupdec/nthroot.m
index 8827331..791ab90 100644
--- a/inst/@infsupdec/nthroot.m
+++ b/inst/@infsupdec/nthroot.m
@@ -38,20 +38,17 @@ endif
if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
result = newdec (nthroot (intervalpart (x), n));
-result.dec = min (result.dec, x.dec);
## nthroot is continuous everywhere, but not defined everywhere
even = mod (n, 2) == 0;
defined = (not (even) & (n > 0 | inf (x) > 0 | sup (x) < 0)) ...
| (even & ((n > 0 & inf (x) >= 0) ...
| (n < 0 & inf (x) > 0)));
-result.dec (not (defined)) = _trv ();
+result.dec(not (defined)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
diff --git a/inst/@infsupdec/overlap.m b/inst/@infsupdec/overlap.m
index 39119b3..50438d6 100644
--- a/inst/@infsupdec/overlap.m
+++ b/inst/@infsupdec/overlap.m
@@ -90,7 +90,7 @@ if (isnai (a) || isnai (b))
error ("interval:InvalidOperand", "interval comparison with NaI")
endif
-[state, bitmask] = overlap (intervalpart (a), intervalpart (b));
+[state, bitmask] = overlap (a.infsup, b.infsup);
endfunction
diff --git a/inst/@infsupdec/plus.m b/inst/@infsupdec/plus.m
index a4c1e50..2774ad1 100644
--- a/inst/@infsupdec/plus.m
+++ b/inst/@infsupdec/plus.m
@@ -51,20 +51,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (plus (intervalpart (x), intervalpart (y)));
+result = newdec (plus (x.infsup, y.infsup));
## plus is continuous and defined everywhere
result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (infsupdec (2, 3) + infsupdec (1, 2), infsupdec (3, 5)));
+%!# from the documentation string
+%!assert (isequal (infsupdec (2, 3) + infsupdec (1, 2), infsupdec (3, 5)));
diff --git a/inst/@infsupdec/polyval.m b/inst/@infsupdec/polyval.m
index 54bc01f..82cb20f 100644
--- a/inst/@infsupdec/polyval.m
+++ b/inst/@infsupdec/polyval.m
@@ -57,16 +57,7 @@ if (not (isa (p, "infsupdec")))
p = infsupdec (p);
endif
-if (isnai (p))
- result = p;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (polyval (intervalpart (p), intervalpart (x)));
+result = newdec (polyval (p.infsup, x.infsup));
result.dec = min (result.dec, min (min (p.dec), x.dec));
endfunction
diff --git a/inst/@infsupdec/postpad.m b/inst/@infsupdec/postpad.m
index d55cd3b..9032ee3 100644
--- a/inst/@infsupdec/postpad.m
+++ b/inst/@infsupdec/postpad.m
@@ -45,7 +45,7 @@
## Keywords: interval
## Created: 2015-04-19
-function result = postpad (x, len, c, dim)
+function x = postpad (x, len, c, dim)
if (nargin < 2 || nargin > 4)
print_usage ();
@@ -70,19 +70,10 @@ if (nargin < 4)
endif
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = newdec (postpad (intervalpart (x), len, intervalpart (c), dim));
-result.dec = postpad (x.dec, len, c.dec, dim);
+x.infsup = postpad (x.infsup, len, c.infsup, dim);
+x.dec = postpad (x.dec, len, c.dec, dim);
endfunction
-%!xtest assert (isequal (postpad (infsupdec (1:3), 4, 4), infsupdec (1:4)));
-%!xtest assert (isequal (postpad (infsupdec (1:3), 2, 4), infsupdec (1:2)));
+%!assert (isequal (postpad (infsupdec (1:3), 4, 4), infsupdec (1:4)));
+%!assert (isequal (postpad (infsupdec (1:3), 2, 4), infsupdec (1:2)));
diff --git a/inst/@infsupdec/pow.m b/inst/@infsupdec/pow.m
index c18d497..052344e 100644
--- a/inst/@infsupdec/pow.m
+++ b/inst/@infsupdec/pow.m
@@ -52,27 +52,19 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (pow (intervalpart (x), intervalpart (y)));
-result.dec = min (result.dec, min (x.dec, y.dec));
+result = newdec (pow (x.infsup, y.infsup));
## pow is continuous everywhere (where it is defined),
## but defined for x > 0 or (x = 0 and y > 0) only
-nonnegative = infsupdec (0, inf);
-domain = interior (x, nonnegative) | ...
- (subset (x, nonnegative) & interior (y, nonnegative));
+persistent nonnegative = infsup (0, inf);
+domain = interior (x.infsup, nonnegative) | ...
+ (subset (x.infsup, nonnegative) & interior (y.infsup, nonnegative));
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (pow (infsupdec (5, 6), infsupdec (2, 3)), infsupdec (25, 216)));
+%!# from the documentation string
+%!assert (isequal (pow (infsupdec (5, 6), infsupdec (2, 3)), infsupdec (25, 216)));
diff --git a/inst/@infsupdec/pow10.m b/inst/@infsupdec/pow10.m
index 366694e..4c0cf7f 100644
--- a/inst/@infsupdec/pow10.m
+++ b/inst/@infsupdec/pow10.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (pow10 (intervalpart (x)));
+result = newdec (pow10 (x.infsup));
## pow10 is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (pow10 (infsupdec (5)), infsupdec (100000)));
+%!# from the documentation string
+%!assert (isequal (pow10 (infsupdec (5)), infsupdec (100000)));
diff --git a/inst/@infsupdec/pow2.m b/inst/@infsupdec/pow2.m
index 529766a..241c04c 100644
--- a/inst/@infsupdec/pow2.m
+++ b/inst/@infsupdec/pow2.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (pow2 (intervalpart (x)));
+result = newdec (pow2 (x.infsup));
## pow2 is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (pow2 (infsupdec (5)), infsupdec (32)));
+%!# from the documentation string
+%!assert (isequal (pow2 (infsupdec (5)), infsupdec (32)));
diff --git a/inst/@infsupdec/power.m b/inst/@infsupdec/power.m
index cee0d31..08e7f84 100644
--- a/inst/@infsupdec/power.m
+++ b/inst/@infsupdec/power.m
@@ -63,17 +63,7 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (power (intervalpart (x), intervalpart (y)));
-result.dec = min (result.dec, min (x.dec, y.dec));
+result = newdec (power (x.infsup, y.infsup));
## The general power function is continuous where it is defined
domain = not (isempty (result)) & (...
@@ -82,9 +72,11 @@ domain = not (isempty (result)) & (...
# defined for x < 0 only where y is integral
(issingleton (y) & fix (inf (y)) == inf (y) & ...
(inf (y) > 0 | not (ismember (0, x))))); # not defined for 0^0
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (infsupdec (-5, 6) .^ infsupdec (2, 3), infsupdec (-125, 216, "trv")));
+%!# from the documentation string
+%!assert (isequal (infsupdec (-5, 6) .^ infsupdec (2, 3), infsupdec (-125, 216, "trv")));
diff --git a/inst/@infsupdec/pown.m b/inst/@infsupdec/pown.m
index 854f66c..c4c1ea0 100644
--- a/inst/@infsupdec/pown.m
+++ b/inst/@infsupdec/pown.m
@@ -44,20 +44,17 @@ if (nargin ~= 2)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (pown (intervalpart (x), p));
-result.dec = min (result.dec, x.dec);
+result = newdec (pown (x.infsup, p));
## x^P is undefined for x == 0 and P < 0
domain = p >= 0 | not (ismember (0, x));
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (pown (infsupdec (5, 6), 2), infsupdec (25, 36)));
+%!# from the documentation string
+%!assert (isequal (pown (infsupdec (5, 6), 2), infsupdec (25, 36)));
+
%!assert (pown (infsupdec (-2, 1), 2) == infsupdec (0, 4));
diff --git a/inst/@infsupdec/pownrev.m b/inst/@infsupdec/pownrev.m
index e6fa031..7d4bbba 100644
--- a/inst/@infsupdec/pownrev.m
+++ b/inst/@infsupdec/pownrev.m
@@ -56,16 +56,8 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (pownrev (intervalpart (c), intervalpart (x), p), "trv");
+result = infsupdec (pownrev (c.infsup, x.infsup, p), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
diff --git a/inst/@infsupdec/powrev1.m b/inst/@infsupdec/powrev1.m
index 9f187c1..a00e9a9 100644
--- a/inst/@infsupdec/powrev1.m
+++ b/inst/@infsupdec/powrev1.m
@@ -62,24 +62,11 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (b))
- result = b;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = powrev1 (intervalpart (b), intervalpart (c), intervalpart (x));
## inverse power is not a point function
-result = infsupdec (result, "trv");
+result = infsupdec (powrev1 (b.infsup, c.infsup, x.infsup), "trv");
+result.dec(isnai (x) | isnai (b) | isnai (c)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (powrev1 (infsupdec (2, 5), infsupdec (3, 6)), infsupdec ("[0x1.3EE8390D43955, 0x1.3988E1409212Fp1]_trv")));
+%!# from the documentation string
+%!assert (isequal (powrev1 (infsupdec (2, 5), infsupdec (3, 6)), infsupdec ("[0x1.3EE8390D43955, 0x1.3988E1409212Fp1]_trv")));
diff --git a/inst/@infsupdec/powrev2.m b/inst/@infsupdec/powrev2.m
index 8903587..cdfd52d 100644
--- a/inst/@infsupdec/powrev2.m
+++ b/inst/@infsupdec/powrev2.m
@@ -62,24 +62,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (y))
- result = y;
- return
-endif
-if (isnai (a))
- result = b;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = powrev2 (intervalpart (a), intervalpart (c), intervalpart (y));
## inverse power is not a point function
-result = infsupdec (result, "trv");
+result = infsupdec (powrev2 (a.infsup, c.infsup, y.infsup), "trv");
+result.dec(isnai (y) | isnai (a) | isnai (c)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (powrev2 (infsupdec (2, 5), infsupdec (3, 6)), infsupdec ("[0x1.5D7E8F22BA886p-1, 0x1.4AE00D1CFDEB5p1]_trv")));
+%!# from the documentation string
+%!assert (isequal (powrev2 (infsupdec (2, 5), infsupdec (3, 6)), infsupdec ("[0x1.5D7E8F22BA886p-1, 0x1.4AE00D1CFDEB5p1]_trv")));
diff --git a/inst/@infsupdec/precedes.m b/inst/@infsupdec/precedes.m
index 04f52f9..88dd70a 100644
--- a/inst/@infsupdec/precedes.m
+++ b/inst/@infsupdec/precedes.m
@@ -44,11 +44,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = precedes (intervalpart (a), intervalpart (b));
-endif
+result = precedes (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/prepad.m b/inst/@infsupdec/prepad.m
index 74cefd0..e4458c0 100644
--- a/inst/@infsupdec/prepad.m
+++ b/inst/@infsupdec/prepad.m
@@ -45,7 +45,7 @@
## Keywords: interval
## Created: 2015-04-19
-function result = prepad (x, len, c, dim)
+function x = prepad (x, len, c, dim)
if (nargin < 2 || nargin > 4)
print_usage ();
@@ -70,19 +70,10 @@ if (nargin < 4)
endif
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (c))
- result = c;
- return
-endif
-
-result = newdec (prepad (intervalpart (x), len, intervalpart (c), dim));
-result.dec = prepad (x.dec, len, c.dec, dim);
+x.infsup = prepad (x.infsup, len, c.infsup, dim);
+x.dec = prepad (x.dec, len, c.dec, dim);
endfunction
-%!xtest assert (isequal (prepad (infsupdec (2:4), 4, 1), infsupdec (1:4)));
-%!xtest assert (isequal (prepad (infsupdec (0:2), 2, 1), infsupdec (1:2)));
+%!assert (isequal (prepad (infsupdec (2:4), 4, 1), infsupdec (1:4)));
+%!assert (isequal (prepad (infsupdec (0:2), 2, 1), infsupdec (1:2)));
diff --git a/inst/@infsupdec/prod.m b/inst/@infsupdec/prod.m
index 19f6fc5..5b9835d 100644
--- a/inst/@infsupdec/prod.m
+++ b/inst/@infsupdec/prod.m
@@ -51,12 +51,13 @@ if (nargin < 2)
endif
endif
-result = newdec (prod (intervalpart (x), dim));
+result = newdec (prod (x.infsup, dim));
if (not (isempty (x.dec)))
+ warning ("off", "Octave:broadcast", "local");
result.dec = min (result.dec, min (x.dec, [], dim));
endif
endfunction
-%!test "from the documentation string";
-%! assert (prod (infsupdec (1 : 4)) == 24);
+%!# from the documentation string
+%!assert (prod (infsupdec (1 : 4)) == 24);
diff --git a/inst/@infsupdec/psi.m b/inst/@infsupdec/psi.m
index 83bf753..1229aab 100644
--- a/inst/@infsupdec/psi.m
+++ b/inst/@infsupdec/psi.m
@@ -62,14 +62,14 @@ if (isnai (x))
return
endif
-result = newdec (psi (intervalpart (x)));
+result = newdec (psi (x.infsup));
## psi is continuous where it is defined
-result.dec = min (result.dec, x.dec);
-
undefined = (inf (x) <= 0 & fix (inf (x)) == inf (x)) | ...
(sup (x) <= 0 & fix (sup (x)) == sup (x)) | ...
(inf (x) < 0 & ceil (inf (x)) <= floor (sup (x)));
-result.dec (undefined) = _trv ();
+result.dec(undefined) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
@@ -86,5 +86,5 @@ endfunction
%!assert (isequal (psi (infsupdec (-1-eps, -1+eps)), infsupdec ("[Entire]_trv")));
%!assert (isequal (psi (infsupdec (-4.1, -3.9)), infsupdec ("[Entire]_trv")));
-%!test "from the documentation string";
-%! assert (isequal (psi (infsupdec (1)), infsupdec ("[-0x1.2788CFC6FB619p-1, -0x1.2788CFC6FB618p-1]_com")));
+%!# from the documentation string
+%!assert (isequal (psi (infsupdec (1)), infsupdec ("[-0x1.2788CFC6FB619p-1, -0x1.2788CFC6FB618p-1]_com")));
diff --git a/inst/@infsupdec/rdivide.m b/inst/@infsupdec/rdivide.m
index e31a5ff..c7d8657 100644
--- a/inst/@infsupdec/rdivide.m
+++ b/inst/@infsupdec/rdivide.m
@@ -54,26 +54,19 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (rdivide (intervalpart (x), intervalpart (y)));
-result.dec = min (result.dec, min (x.dec, y.dec));
+result = newdec (rdivide (x.infsup, y.infsup));
divisionbyzero = ismember (0, y);
-if (isscalar (y) && not (isscalar (x)))
- divisionbyzero = divisionbyzero (ones (size (x)));
+if (not (size_equal (x.dec, y.dec)))
+ divisionbyzero = divisionbyzero & true (size (x.dec));
endif
-result.dec (divisionbyzero) = _trv ();
+result.dec(divisionbyzero) = _trv ();
+
+result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (infsupdec (2, 3) ./ infsupdec (1, 2), infsupdec (1, 3)));
+%!# from the documentation string
+%!assert (isequal (infsupdec (2, 3) ./ infsupdec (1, 2), infsupdec (1, 3)));
+
%!assert (1 ./ infsupdec (1, 4) == infsupdec (0.25, 1));
\ No newline at end of file
diff --git a/inst/@infsupdec/realsqrt.m b/inst/@infsupdec/realsqrt.m
index 320dde2..dd7ac25 100644
--- a/inst/@infsupdec/realsqrt.m
+++ b/inst/@infsupdec/realsqrt.m
@@ -41,19 +41,16 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (realsqrt (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (realsqrt (x.infsup));
## realsqrt is continuous everywhere, but defined for x >= 0 only
-defined = subset (x, infsupdec (0, inf));
-result.dec (not (defined)) = _trv ();
+persistent domain = infsup (0, inf);
+defined = subset (x.infsup, domain);
+result.dec(not (defined)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (realsqrt (infsupdec (-6, 4)), infsupdec (0, 2, "trv")));
+%!# from the documentation string
+%!assert (isequal (realsqrt (infsupdec (-6, 4)), infsupdec (0, 2, "trv")));
diff --git a/inst/@infsupdec/reshape.m b/inst/@infsupdec/reshape.m
index db0478e..50592ee 100644
--- a/inst/@infsupdec/reshape.m
+++ b/inst/@infsupdec/reshape.m
@@ -41,33 +41,25 @@
## Keywords: interval
## Created: 2015-04-19
-function result = reshape (x, m, n)
+function x = reshape (x, m, n)
if (not (isa (x, "infsupdec")))
print_usage ();
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
switch nargin
case 2
- bare = reshape (intervalpart (x), m);
- dec = reshape (x.dec, m);
+ x.infsup = reshape (x.infsup, m);
+ x.dec = reshape (x.dec, m);
case 3
- bare = reshape (intervalpart (x), m, n);
- dec = reshape (x.dec, m, n);
+ x.infsup = reshape (x.infsup, m, n);
+ x.dec = reshape (x.dec, m, n);
otherwise
print_usage ();
return
endswitch
-result = newdec (bare);
-result.dec = dec;
-
endfunction
-%!xtest assert (isequal (reshape (infsupdec (1 : 6), 2, 3), infsupdec (reshape (1 : 6, 2, 3))));
+%!assert (isequal (reshape (infsupdec (1 : 6), 2, 3), infsupdec (reshape (1 : 6, 2, 3))));
diff --git a/inst/@infsupdec/resize.m b/inst/@infsupdec/resize.m
index cb76302..cf7a1b1 100644
--- a/inst/@infsupdec/resize.m
+++ b/inst/@infsupdec/resize.m
@@ -23,7 +23,7 @@
##
## In the result, element with certain indices is equal to the corresponding
## element of @var{X} if the indices are within the bounds of @var{X};
-## otherwise, the element is set to the empty interval.
+## otherwise, the element is set to zero.
##
## If only @var{M} is supplied, and it is a scalar, the dimension of the result
## is @var{M}-by- at var{M}. If @var{M} and @var{N} are all scalars, then the
@@ -35,10 +35,10 @@
## @group
## resize (infsupdec (magic (3)), 4, 2)
## @result{} ans = 4×2 interval matrix
-## [8]_com [1]_com
-## [3]_com [5]_com
-## [4]_com [9]_com
-## [Empty]_trv [Empty]_trv
+## [8]_com [1]_com
+## [3]_com [5]_com
+## [4]_com [9]_com
+## [0]_com [0]_com
## @end group
## @end example
## @seealso{@@infsupdec/reshape, @@infsup/cat, @@infsupdec/postpad, @@infsupdec/prepad}
@@ -48,34 +48,30 @@
## Keywords: interval
## Created: 2015-04-19
-function result = resize (x, m, n)
+function x = resize (x, m, n)
if (not (isa (x, "infsupdec")))
print_usage ();
return
endif
-if (isnai (x))
- result = x;
- return
-endif
+x.dec(x.dec == 0) = uint8 (255);
switch nargin
case 2
- bare = resize (intervalpart (x), m);
- dec = resize (x.dec, m);
+ x.infsup = resize (x.infsup, m);
+ x.dec = resize (x.dec, m);
case 3
- bare = resize (intervalpart (x), m, n);
- dec = resize (x.dec, m, n);
+ x.infsup = resize (x.infsup, m, n);
+ x.dec = resize (x.dec, m, n);
otherwise
print_usage ();
return
endswitch
-result = newdec (bare);
-dec (dec == 0) = _trv (); # any new elements are [Empty]_trv
-result.dec = dec;
+x.dec(x.dec == 0) = _com (); # any new elements are [0]_com
+x.dec(x.dec == uint8 (255)) = uint8 (0);
endfunction
-%!xtest assert (isequal (resize (infsupdec (magic (3)), 4, 2), [infsupdec([8, 1; 3, 5; 4, 9]); infsupdec([inf, inf], [-inf, -inf])]));
+%!assert (isequal (resize (infsupdec (magic (3)), 4, 2), infsupdec([8, 1; 3, 5; 4, 9; 0, 0])));
diff --git a/inst/@infsupdec/round.m b/inst/@infsupdec/round.m
index 06af3a4..4969a3d 100644
--- a/inst/@infsupdec/round.m
+++ b/inst/@infsupdec/round.m
@@ -44,47 +44,46 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (round (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (round (x.infsup));
## Round is like a scaled fix function
discontinuous = not (issingleton (result));
-result.dec (discontinuous) = min (result.dec (discontinuous), _def ());
+result.dec(discontinuous) = min (result.dec(discontinuous), _def ());
onlyrestrictioncontinuous = issingleton (result) & not (...
(sup (x) >= 0 | ...
fix (sup (x)) == sup (x) | fix (sup (x) * 2) / 2 ~= sup (x)) & ...
(inf (x) <= 0 | ...
fix (inf (x)) == inf (x) | fix (inf (x) * 2) / 2 ~= inf (x)));
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "Empty interval";
-%! assert (isequal (round (infsupdec ()), infsupdec ()));
-%!test "Singleton intervals";
-%! assert (isequal (round (infsupdec (0)), infsupdec (0)));
-%! assert (isequal (round (infsupdec (0.5)), infsupdec (1, "dac")));
-%! assert (isequal (round (infsupdec (0.25)), infsupdec (0)));
-%! assert (isequal (round (infsupdec (0.75)), infsupdec (1)));
-%! assert (isequal (round (infsupdec (-0.5)), infsupdec (-1, "dac")));
-%!test "Bounded intervals";
-%! assert (isequal (round (infsupdec (-0.5, 0)), infsupdec (-1, 0, "def")));
-%! assert (isequal (round (infsupdec (0, 0.5)), infsupdec (0, 1, "def")));
-%! assert (isequal (round (infsupdec (0.25, 0.5)), infsupdec (0, 1, "def")));
-%! assert (isequal (round (infsupdec (-1, 0)), infsupdec (-1, 0, "def")));
-%! assert (isequal (round (infsupdec (-1, 1)), infsupdec (-1, 1, "def")));
-%! assert (isequal (round (infsupdec (-realmin, realmin)), infsupdec (0)));
-%! assert (isequal (round (infsupdec (-realmax, realmax)), infsupdec (-realmax, realmax, "def")));
-%!test "Unbounded intervals";
-%! assert (isequal (round (infsupdec (-realmin, inf)), infsupdec (0, inf, "def")));
-%! assert (isequal (round (infsupdec (-realmax, inf)), infsupdec (-realmax, inf, "def")));
-%! assert (isequal (round (infsupdec (-inf, realmin)), infsupdec (-inf, 0, "def")));
-%! assert (isequal (round (infsupdec (-inf, realmax)), infsupdec (-inf, realmax, "def")));
-%! assert (isequal (round (infsupdec (-inf, inf)), infsupdec (-inf, inf, "def")));
+%!# Empty interval
+%!assert (isequal (round (infsupdec ()), infsupdec ()));
+
+%!# Singleton intervals
+%!assert (isequal (round (infsupdec (0)), infsupdec (0)));
+%!assert (isequal (round (infsupdec (0.5)), infsupdec (1, "dac")));
+%!assert (isequal (round (infsupdec (0.25)), infsupdec (0)));
+%!assert (isequal (round (infsupdec (0.75)), infsupdec (1)));
+%!assert (isequal (round (infsupdec (-0.5)), infsupdec (-1, "dac")));
+
+%!# Bounded intervals
+%!assert (isequal (round (infsupdec (-0.5, 0)), infsupdec (-1, 0, "def")));
+%!assert (isequal (round (infsupdec (0, 0.5)), infsupdec (0, 1, "def")));
+%!assert (isequal (round (infsupdec (0.25, 0.5)), infsupdec (0, 1, "def")));
+%!assert (isequal (round (infsupdec (-1, 0)), infsupdec (-1, 0, "def")));
+%!assert (isequal (round (infsupdec (-1, 1)), infsupdec (-1, 1, "def")));
+%!assert (isequal (round (infsupdec (-realmin, realmin)), infsupdec (0)));
+%!assert (isequal (round (infsupdec (-realmax, realmax)), infsupdec (-realmax, realmax, "def")));
+
+%!# Unbounded intervals
+%!assert (isequal (round (infsupdec (-realmin, inf)), infsupdec (0, inf, "def")));
+%!assert (isequal (round (infsupdec (-realmax, inf)), infsupdec (-realmax, inf, "def")));
+%!assert (isequal (round (infsupdec (-inf, realmin)), infsupdec (-inf, 0, "def")));
+%!assert (isequal (round (infsupdec (-inf, realmax)), infsupdec (-inf, realmax, "def")));
+%!assert (isequal (round (infsupdec (-inf, inf)), infsupdec (-inf, inf, "def")));
diff --git a/inst/@infsupdec/roundb.m b/inst/@infsupdec/roundb.m
index a19c6e8..c18e06f 100644
--- a/inst/@infsupdec/roundb.m
+++ b/inst/@infsupdec/roundb.m
@@ -44,47 +44,46 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (roundb (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (roundb (x.infsup));
discontinuous = not (issingleton (result));
-result.dec (discontinuous) = min (result.dec (discontinuous), _def ());
+result.dec(discontinuous) = min (result.dec(discontinuous), _def ());
onlyrestrictioncontinuous = issingleton (result) & not (...
(rem (inf (result), 2) ~= 0 | ...
((fix (sup (x)) == sup (x) | fix (sup (x) * 2) / 2 ~= sup (x)) & ...
(fix (inf (x)) == inf (x) | fix (inf (x) * 2) / 2 ~= inf (x)))));
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "Empty interval";
-%! assert (isequal (roundb (infsupdec ()), infsupdec ()));
-%!test "Singleton intervals";
-%! assert (isequal (roundb (infsupdec (0)), infsupdec (0)));
-%! assert (isequal (roundb (infsupdec (0.5)), infsupdec (0, "dac")));
-%! assert (isequal (roundb (infsupdec (0.25)), infsupdec (0)));
-%! assert (isequal (roundb (infsupdec (0.75)), infsupdec (1)));
-%! assert (isequal (roundb (infsupdec (1.5)), infsupdec (2, "dac")));
-%! assert (isequal (roundb (infsupdec (-0.5)), infsupdec (0, "dac")));
-%! assert (isequal (roundb (infsupdec (-1.5)), infsupdec (-2, "dac")));
-%!test "Bounded intervals";
-%! assert (isequal (roundb (infsupdec (-0.5, 0)), infsupdec (0, "dac")));
-%! assert (isequal (roundb (infsupdec (0, 0.5)), infsupdec (0, "dac")));
-%! assert (isequal (roundb (infsupdec (0.25, 0.5)), infsupdec (0, "dac")));
-%! assert (isequal (roundb (infsupdec (-1, 0)), infsupdec (-1, 0, "def")));
-%! assert (isequal (roundb (infsupdec (-1, 1)), infsupdec (-1, 1, "def")));
-%! assert (isequal (roundb (infsupdec (-realmin, realmin)), infsupdec (0)));
-%! assert (isequal (roundb (infsupdec (-realmax, realmax)), infsupdec (-realmax, realmax, "def")));
-%!test "Unbounded intervals";
-%! assert (isequal (roundb (infsupdec (-realmin, inf)), infsupdec (0, inf, "def")));
-%! assert (isequal (roundb (infsupdec (-realmax, inf)), infsupdec (-realmax, inf, "def")));
-%! assert (isequal (roundb (infsupdec (-inf, realmin)), infsupdec (-inf, 0, "def")));
-%! assert (isequal (roundb (infsupdec (-inf, realmax)), infsupdec (-inf, realmax, "def")));
-%! assert (isequal (roundb (infsupdec (-inf, inf)), infsupdec (-inf, inf, "def")));
+%!# Empty interval
+%!assert (isequal (roundb (infsupdec ()), infsupdec ()));
+
+%!# Singleton intervals
+%!assert (isequal (roundb (infsupdec (0)), infsupdec (0)));
+%!assert (isequal (roundb (infsupdec (0.5)), infsupdec (0, "dac")));
+%!assert (isequal (roundb (infsupdec (0.25)), infsupdec (0)));
+%!assert (isequal (roundb (infsupdec (0.75)), infsupdec (1)));
+%!assert (isequal (roundb (infsupdec (1.5)), infsupdec (2, "dac")));
+%!assert (isequal (roundb (infsupdec (-0.5)), infsupdec (0, "dac")));
+%!assert (isequal (roundb (infsupdec (-1.5)), infsupdec (-2, "dac")));
+
+%!# Bounded intervals
+%!assert (isequal (roundb (infsupdec (-0.5, 0)), infsupdec (0, "dac")));
+%!assert (isequal (roundb (infsupdec (0, 0.5)), infsupdec (0, "dac")));
+%!assert (isequal (roundb (infsupdec (0.25, 0.5)), infsupdec (0, "dac")));
+%!assert (isequal (roundb (infsupdec (-1, 0)), infsupdec (-1, 0, "def")));
+%!assert (isequal (roundb (infsupdec (-1, 1)), infsupdec (-1, 1, "def")));
+%!assert (isequal (roundb (infsupdec (-realmin, realmin)), infsupdec (0)));
+%!assert (isequal (roundb (infsupdec (-realmax, realmax)), infsupdec (-realmax, realmax, "def")));
+
+%!# Unbounded intervals
+%!assert (isequal (roundb (infsupdec (-realmin, inf)), infsupdec (0, inf, "def")));
+%!assert (isequal (roundb (infsupdec (-realmax, inf)), infsupdec (-realmax, inf, "def")));
+%!assert (isequal (roundb (infsupdec (-inf, realmin)), infsupdec (-inf, 0, "def")));
+%!assert (isequal (roundb (infsupdec (-inf, realmax)), infsupdec (-inf, realmax, "def")));
+%!assert (isequal (roundb (infsupdec (-inf, inf)), infsupdec (-inf, inf, "def")));
diff --git a/inst/@infsupdec/rsqrt.m b/inst/@infsupdec/rsqrt.m
index 8835c7b..0202cec 100644
--- a/inst/@infsupdec/rsqrt.m
+++ b/inst/@infsupdec/rsqrt.m
@@ -41,18 +41,15 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (rsqrt (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (rsqrt (x.infsup));
## rsqrt is continuous everywhere, but defined for x > 0 only
-result.dec (not (interior (x, infsupdec (0, inf)))) = _trv ();
+persistent domain_hull = infsup (0, inf);
+result.dec(not (interior (x.infsup, domain_hull))) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (rsqrt (infsupdec (-6, 4)), infsupdec (.5, inf, "trv")));
+%!# from the documentation string
+%!assert (isequal (rsqrt (infsupdec (-6, 4)), infsupdec (.5, inf, "trv")));
diff --git a/inst/@infsupdec/sec.m b/inst/@infsupdec/sec.m
index 4c8a34f..e0c7a72 100644
--- a/inst/@infsupdec/sec.m
+++ b/inst/@infsupdec/sec.m
@@ -41,20 +41,16 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (sec (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (sec (x.infsup));
## Because sec (nextdown (pi/2)) < realmax, we can simple check for
## a singularity by comparing the result with entire.
domain = not (isentire (result));
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sec (infsupdec (1)), infsupdec ("[0x1.D9CF0F125CC29, 0x1.D9CF0F125CC2A]_com")));
+%!# from the documentation string
+%!assert (isequal (sec (infsupdec (1)), infsupdec ("[0x1.D9CF0F125CC29, 0x1.D9CF0F125CC2A]_com")));
diff --git a/inst/@infsupdec/sech.m b/inst/@infsupdec/sech.m
index 0c68559..68f7652 100644
--- a/inst/@infsupdec/sech.m
+++ b/inst/@infsupdec/sech.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (sech (intervalpart (x)));
+result = newdec (sech (x.infsup));
## sech is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sech (infsupdec (1)), infsupdec ("[0x1.4BCDC50ED6BE7p-1, 0x1.4BCDC50ED6BE8p-1]_com")));
+%!# from the documentation string
+%!assert (isequal (sech (infsupdec (1)), infsupdec ("[0x1.4BCDC50ED6BE7p-1, 0x1.4BCDC50ED6BE8p-1]_com")));
diff --git a/inst/@infsupdec/setdiff.m b/inst/@infsupdec/setdiff.m
index ab4d793..3ad941a 100644
--- a/inst/@infsupdec/setdiff.m
+++ b/inst/@infsupdec/setdiff.m
@@ -54,16 +54,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a))
- result = a;
- return
-endif
-if (isnai (b))
- result = b;
- return
-endif
-
-result = infsupdec (setdiff (intervalpart (a), intervalpart (b)), "trv");
+result = infsupdec (setdiff (a.infsup, b.infsup), "trv");
+result.dec(isnai (a) | isnai (b)) = _ill ();
endfunction
@@ -72,5 +64,6 @@ endfunction
%!assert (isempty (setdiff (infsupdec (1, 3), infsupdec (-inf, inf))));
%!assert (isempty (setdiff (infsupdec (1, 3), infsupdec (1, 4))));
%!assert (setdiff (infsupdec (-inf, inf), infsupdec (1, 4)) == infsupdec (-inf, inf));
-%!test "from the documentation string";
-%! assert (setdiff (infsupdec (1, 3), infsupdec (2, 4)) == infsupdec (1, 2));
+
+%!# from the documentation string
+%!assert (setdiff (infsupdec (1, 3), infsupdec (2, 4)) == infsupdec (1, 2));
diff --git a/inst/@infsupdec/setxor.m b/inst/@infsupdec/setxor.m
index 0a39ae3..78f1f68 100644
--- a/inst/@infsupdec/setxor.m
+++ b/inst/@infsupdec/setxor.m
@@ -61,24 +61,17 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a))
- c = c1 = c2 = a;
- return
-endif
-if (isnai (b))
- c = c1 = c2 = b;
- return
-endif
-
if (nargout > 1)
- [c, c1, c2] = setxor (intervalpart (a), intervalpart (b));
+ [c, c1, c2] = setxor (a.infsup, b.infsup);
c1 = infsupdec (c1, "trv");
c2 = infsupdec (c2, "trv");
+ c1.dec(isnai (a) | isnai (b)) = c2.dec(isnai (a) | isnai (b)) = _ill ();
else
- c = setxor (intervalpart (a), intervalpart (b));
+ c = setxor (a.infsup, b.infsup);
endif
c = infsupdec (c, "trv");
+c.dec(isnai (a) | isnai (b)) = _ill ();
endfunction
@@ -107,7 +100,8 @@ endfunction
%! assert (z == infsupdec (2.5, 3));
%! assert (z1 == infsupdec ());
%! assert (z2 == infsupdec (2.5, 3));
-%!test "from the documentation string";
+%!test
+%! # from the documentation string
%! [z, z1, z2] = setxor (infsupdec (1, 3), infsupdec (2, 4));
%! assert (z == infsupdec (1, 4));
%! assert (z1 == infsupdec (1, 2));
diff --git a/inst/@infsupdec/sign.m b/inst/@infsupdec/sign.m
index ff90c47..5b250ba 100644
--- a/inst/@infsupdec/sign.m
+++ b/inst/@infsupdec/sign.m
@@ -44,26 +44,22 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (sign (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (sign (x.infsup));
## sign is defined everywhere and continuous for x ~= 0
discontinuous = not (issingleton (result));
-result.dec (discontinuous) = min (result.dec (discontinuous), _def ());
+result.dec(discontinuous) = min (result.dec(discontinuous), _def ());
onlyrestrictioncontinuous = inf (x) == 0 & sup (x) == 0;
-result.dec (onlyrestrictioncontinuous) = ...
- min (result.dec (onlyrestrictioncontinuous), _dac ());
+result.dec(onlyrestrictioncontinuous) = ...
+ min (result.dec(onlyrestrictioncontinuous), _dac ());
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sign (infsupdec (2, 3)), infsupdec (1)));
-%! assert (isequal (sign (infsupdec (0)), infsupdec (0, "dac")));
-%! assert (isequal (sign (infsupdec (0, 5)), infsupdec (0, 1, "def")));
-%! assert (isequal (sign (infsupdec (-17)), infsupdec (-1)));
+%!# from the documentation string
+%!assert (isequal (sign (infsupdec (2, 3)), infsupdec (1)));
+%!assert (isequal (sign (infsupdec (0)), infsupdec (0, "dac")));
+%!assert (isequal (sign (infsupdec (0, 5)), infsupdec (0, 1, "def")));
+%!assert (isequal (sign (infsupdec (-17)), infsupdec (-1)));
diff --git a/inst/@infsupdec/sin.m b/inst/@infsupdec/sin.m
index 7c544c5..1e0c6dc 100644
--- a/inst/@infsupdec/sin.m
+++ b/inst/@infsupdec/sin.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (sin (intervalpart (x)));
+result = newdec (sin (x.infsup));
## sin is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sin (infsupdec (1)), infsupdec ("[0x1.AED548F090CEEp-1, 0x1.AED548F090CEFp-1]")));
+%!# from the documentation string
+%!assert (isequal (sin (infsupdec (1)), infsupdec ("[0x1.AED548F090CEEp-1, 0x1.AED548F090CEFp-1]")));
diff --git a/inst/@infsupdec/sinh.m b/inst/@infsupdec/sinh.m
index c674c38..846b7e3 100644
--- a/inst/@infsupdec/sinh.m
+++ b/inst/@infsupdec/sinh.m
@@ -41,16 +41,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (sinh (intervalpart (x)));
+result = newdec (sinh (x.infsup));
## sinh is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sinh (infsupdec (1)), infsupdec ("[0x1.2CD9FC44EB982, 0x1.2CD9FC44EB983]")));
+%!# from the documentation string
+%!assert (isequal (sinh (infsupdec (1)), infsupdec ("[0x1.2CD9FC44EB982, 0x1.2CD9FC44EB983]")));
diff --git a/inst/@infsupdec/sinrev.m b/inst/@infsupdec/sinrev.m
index 7b1b6fe..5b9d82b 100644
--- a/inst/@infsupdec/sinrev.m
+++ b/inst/@infsupdec/sinrev.m
@@ -59,18 +59,10 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (sinrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (sinrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sinrev (infsupdec (-1), infsupdec (0, 6)), infsupdec ("[0x1.2D97C7F3321D2p2, 0x1.2D97C7F3321D3p2]_trv")));
+%!# from the documentation string
+%!assert (isequal (sinrev (infsupdec (-1), infsupdec (0, 6)), infsupdec ("[0x1.2D97C7F3321D2p2, 0x1.2D97C7F3321D3p2]_trv")));
diff --git a/inst/@infsupdec/sqrrev.m b/inst/@infsupdec/sqrrev.m
index 843d669..cd0dc12 100644
--- a/inst/@infsupdec/sqrrev.m
+++ b/inst/@infsupdec/sqrrev.m
@@ -59,18 +59,10 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (sqrrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (sqrrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sqrrev (infsupdec (-2, 1)), infsupdec (-1, 1, "trv")));
+%!# from the documentation string
+%!assert (isequal (sqrrev (infsupdec (-2, 1)), infsupdec (-1, 1, "trv")));
diff --git a/inst/@infsupdec/strictprecedes.m b/inst/@infsupdec/strictprecedes.m
index 0f75d29..a7c2854 100644
--- a/inst/@infsupdec/strictprecedes.m
+++ b/inst/@infsupdec/strictprecedes.m
@@ -44,11 +44,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = strictprecedes (intervalpart (a), intervalpart (b));
-endif
+result = strictprecedes (a.infsup, b.infsup);
+result(isnai(a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/strictsubset.m b/inst/@infsupdec/strictsubset.m
index f9803d5..b04541e 100644
--- a/inst/@infsupdec/strictsubset.m
+++ b/inst/@infsupdec/strictsubset.m
@@ -47,11 +47,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = strictsubset (intervalpart (a), intervalpart (b));
-endif
+result = strictsubset (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/subsasgn.m b/inst/@infsupdec/subsasgn.m
index 6243833..e690922 100644
--- a/inst/@infsupdec/subsasgn.m
+++ b/inst/@infsupdec/subsasgn.m
@@ -32,7 +32,7 @@
## Keywords: interval
## Created: 2014-11-02
-function result = subsasgn (A, S, B)
+function A = subsasgn (A, S, B)
if (nargin ~= 3)
print_usage ();
@@ -46,24 +46,19 @@ if (not (isa (B, "infsupdec")))
B = infsupdec (B);
endif
-if (isnai (A))
- result = A;
- return
-endif
-if (isnai (B))
- result = B;
- return
-endif
+A.infsup = subsasgn (A.infsup, S, B.infsup);
-result = newdec (subsasgn (intervalpart (A), S, intervalpart (B)));
-result.dec = subsasgn (A.dec, S, B.dec);
-result.dec (result.dec == 0) = _com (); # any new elements are [0]_com
+A.dec(A.dec == 0) = uint8 (255);
+B.dec(B.dec == 0) = uint8 (255);
+A.dec = subsasgn (A.dec, S, B.dec);
+A.dec(A.dec == 0) = _com (); # any new elements are [0]_com
+A.dec(A.dec == uint8 (255)) = uint8 (0);
endfunction
%!test
%! A = infsupdec (magic (3));
-%! A (4, 4) = 42;
+%! A(4, 4) = 42;
%! assert (inf (A), [magic(3),[0;0;0];0,0,0,42]);
%! assert (sup (A), [magic(3),[0;0;0];0,0,0,42]);
%! assert (decorationpart (A), {"com", "com", "com", "com"; "com", "com", "com", "com"; "com", "com", "com", "com"; "com", "com", "com", "com"});
diff --git a/inst/@infsupdec/subset.m b/inst/@infsupdec/subset.m
index d6da647..fadaad5 100644
--- a/inst/@infsupdec/subset.m
+++ b/inst/@infsupdec/subset.m
@@ -45,11 +45,8 @@ if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
-if (isnai (a) || isnai (b))
- result = false ();
-else
- result = subset (intervalpart (a), intervalpart (b));
-endif
+result = subset (a.infsup, b.infsup);
+result(isnai (a) | isnai (b)) = false;
endfunction
diff --git a/inst/@infsupdec/subsref.m b/inst/@infsupdec/subsref.m
index 42141eb..86fe303 100644
--- a/inst/@infsupdec/subsref.m
+++ b/inst/@infsupdec/subsref.m
@@ -52,7 +52,7 @@
## Keywords: interval
## Created: 2014-11-02
-function result = subsref (A, S)
+function A = subsref (A, S)
if (nargin ~= 2)
print_usage ();
@@ -61,8 +61,8 @@ endif
switch (S (1).type)
case "()"
- result = newdec (subsref (intervalpart (A), S (1)));
- result.dec = subsref (A.dec, S (1));
+ A.infsup = subsref (A.infsup, S(1));
+ A.dec = subsref (A.dec, S(1));
case "{}"
error ("interval cannot be indexed with {}")
case "."
@@ -76,20 +76,22 @@ switch (S (1).type)
if (nargin (functionname) ~= 1)
error (["‘", S(1).subs, "’ is not a valid interval property"])
endif
- result = feval (S (1).subs, A);
+ A = feval (S(1).subs, A);
otherwise
error ("invalid subscript type")
endswitch
if (numel (S) > 1)
- result = subsref (result, S (2:end));
+ A = subsref (A, S(2 : end));
endif
endfunction
-%!xtest assert (isequal (infsupdec (magic (3)) ([1, 2, 3]), infsupdec (magic (3) ([1, 2, 3]))));
-%!test "from the documentation string";
+%!assert (isequal (infsupdec (magic (3))([1, 2, 3]), infsupdec (magic (3)([1, 2, 3]))));
+
+%!# from the documentation string
+%!test
%! x = infsupdec (magic (3), magic (3) + 1);
-%! assert (x (1) == infsupdec (8, 9));
-%! assert (x (:, 2) == infsupdec ([1; 5; 9], [2; 6; 10]));
+%! assert (x(1) == infsupdec (8, 9));
+%! assert (x(:, 2) == infsupdec ([1; 5; 9], [2; 6; 10]));
%! assert (x.inf, magic (3));
diff --git a/inst/@infsupdec/sum.m b/inst/@infsupdec/sum.m
index 9b95320..dc3499a 100644
--- a/inst/@infsupdec/sum.m
+++ b/inst/@infsupdec/sum.m
@@ -53,12 +53,13 @@ if (nargin < 2)
endif
endif
-result = newdec (sum (intervalpart (x), dim));
+result = newdec (sum (x.infsup, dim));
if (not (isempty (x.dec)))
+ warning ("off", "Octave:broadcast", "local");
result.dec = min (result.dec, min (x.dec, [], dim));
endif
endfunction
-%!test "from the documentation string";
-%! assert (isequal (sum ([infsupdec(1), pow2(-1074), -1]), infsupdec (pow2 (-1074))));
+%!# from the documentation string
+%!assert (isequal (sum ([infsupdec(1), pow2(-1074), -1]), infsupdec (pow2 (-1074))));
diff --git a/inst/@infsup/sup.m b/inst/@infsupdec/sup.m
similarity index 67%
copy from inst/@infsup/sup.m
copy to inst/@infsupdec/sup.m
index f97a0db..87167b0 100644
--- a/inst/@infsup/sup.m
+++ b/inst/@infsupdec/sup.m
@@ -1,4 +1,4 @@
-## Copyright 2014-2016 Oliver Heimlich
+## Copyright 2016 Oliver Heimlich
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
@@ -15,26 +15,28 @@
## -*- texinfo -*-
## @documentencoding UTF-8
-## @defmethod {@@infsup} sup (@var{X})
+## @defmethod {@@infsupdec} sup (@var{X})
+## @comment DO NOT SYNCHRONIZE DOCUMENTATION STRING
##
## Get the (least) upper boundary for all numbers of interval @var{X}.
##
-## If @var{X} is empty, @code{sup (@var{X})} is negative infinity.
+## If @var{X} is empty, @code{sup (@var{X})} is negative infinity. If @var{X}
+## is NaI, @code{sup (@var{X})} is NaN.
##
## Accuracy: The result is exact.
##
## @example
## @group
-## sup (infsup (2.5, 3.5))
+## sup (infsupdec (2.5, 3.5))
## @result{} ans = 3.5000
## @end group
## @end example
-## @seealso{@@infsup/inf, @@infsup/mid}
+## @seealso{@@infsupdec/inf, @@infsup/mid}
## @end defmethod
## Author: Oliver Heimlich
## Keywords: interval
-## Created: 2014-09-27
+## Created: 2016-09-18
function result = sup (x)
@@ -43,16 +45,13 @@ if (nargin ~= 1)
return
endif
-if (isa (x, "infsupdec"))
- ## We cannot override this function in infsupdec, because that would create
- ## an infinite loop.
- if (isnai (x))
- error ("interval:NaI", "NaI has no supremum")
- endif
-endif
+result = sup (x.infsup);
+result(isnai (x)) = nan;
-result = x.sup;
endfunction
-%!test "from the documentation string";
-%! assert (sup (infsup (2.5, 3.5)), 3.5);
+%!assert (sup (infsupdec (2.5, 3.5)), 3.5);
+%!assert (sup (infsupdec ()), -inf);
+%!assert (sup (infsupdec ("[nai]")), nan);
+%!warning id=interval:UndefinedOperation
+%! assert (sup (infsupdec (3, 2)), nan);
diff --git a/inst/@infsupdec/tan.m b/inst/@infsupdec/tan.m
index d4da6a8..0263a8e 100644
--- a/inst/@infsupdec/tan.m
+++ b/inst/@infsupdec/tan.m
@@ -41,20 +41,16 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (tan (intervalpart (x)));
-result.dec = min (result.dec, x.dec);
+result = newdec (tan (x.infsup));
## Because tan (nextdown (pi / 2)) < realmax, we can simple check for
## a singularity by comparing the result with entire.
domain = not (isentire (result));
-result.dec (not (domain)) = _trv ();
+result.dec(not (domain)) = _trv ();
+
+result.dec = min (result.dec, x.dec);
endfunction
-%!test "from the documentation string";
-%! assert (isequal (tan (infsupdec (1)), infsupdec ("[0x1.8EB245CBEE3A5, 0x1.8EB245CBEE3A6]")));
+%!# from the documentation string
+%!assert (isequal (tan (infsupdec (1)), infsupdec ("[0x1.8EB245CBEE3A5, 0x1.8EB245CBEE3A6]")));
diff --git a/inst/@infsupdec/tanh.m b/inst/@infsupdec/tanh.m
index 42d7724..ee4eaad 100644
--- a/inst/@infsupdec/tanh.m
+++ b/inst/@infsupdec/tanh.m
@@ -41,12 +41,7 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = newdec (tanh (intervalpart (x)));
+result = newdec (tanh (x.infsup));
## tanh is defined and continuous everywhere
result.dec = min (result.dec, x.dec);
diff --git a/inst/@infsupdec/tanrev.m b/inst/@infsupdec/tanrev.m
index 019d0ec..fd37d57 100644
--- a/inst/@infsupdec/tanrev.m
+++ b/inst/@infsupdec/tanrev.m
@@ -59,18 +59,10 @@ if (not (isa (x, "infsupdec")))
x = infsupdec (x);
endif
-if (isnai (c))
- result = c;
- return
-endif
-if (isnai (x))
- result = x;
- return
-endif
-
-result = infsupdec (tanrev (intervalpart (c), intervalpart (x)), "trv");
+result = infsupdec (tanrev (c.infsup, x.infsup), "trv");
+result.dec(isnai (c) | isnai (x)) = _ill ();
endfunction
-%!test "from the documentation string";
-%! assert (isequal (tanrev (infsupdec (0), infsupdec (2, 4)), infsupdec ("pi", "trv")));
+%!# from the documentation string
+%!assert (isequal (tanrev (infsupdec (0), infsupdec (2, 4)), infsupdec ("pi", "trv")));
diff --git a/inst/@infsupdec/times.m b/inst/@infsupdec/times.m
index b8acef0..b1fcd92 100644
--- a/inst/@infsupdec/times.m
+++ b/inst/@infsupdec/times.m
@@ -50,20 +50,11 @@ if (not (isa (y, "infsupdec")))
y = infsupdec (y);
endif
-if (isnai (x))
- result = x;
- return
-endif
-if (isnai (y))
- result = y;
- return
-endif
-
-result = newdec (times (intervalpart (x), intervalpart (y)));
+result = newdec (times (x.infsup, y.infsup));
## times is defined and continuous everywhere
result.dec = min (result.dec, min (x.dec, y.dec));
endfunction
-%!test "from the documentation string";
-%! assert (isequal (infsupdec (2, 3) .* infsupdec (1, 2), infsupdec (2, 6)));
+%!# from the documentation string
+%!assert (isequal (infsupdec (2, 3) .* infsupdec (1, 2), infsupdec (2, 6)));
diff --git a/inst/@infsupdec/transpose.m b/inst/@infsupdec/transpose.m
index fae7c72..39b848f 100644
--- a/inst/@infsupdec/transpose.m
+++ b/inst/@infsupdec/transpose.m
@@ -36,18 +36,19 @@
## Keywords: interval
## Created: 2014-11-02
-function result = transpose (x)
+function x = transpose (x)
if (nargin ~= 1)
print_usage ();
return
endif
-result = newdec (transpose (intervalpart (x)));
-result.dec = transpose (x.dec);
+x.infsup = transpose (x.infsup);
+x.dec = transpose (x.dec);
endfunction
-%!xtest assert (isequal (transpose (infsupdec (magic (3))), infsupdec (magic (3).')));
-%!xtest "from the documentation string";
-%! assert (isequal (transpose (infsupdec (zeros (1, 3), ones (1, 3))), infsupdec (zeros (3, 1), ones (3, 1))));
+%!assert (isequal (transpose (infsupdec (magic (3))), infsupdec (magic (3).')));
+
+%!# from the documentation string
+%!assert (isequal (transpose (infsupdec (zeros (1, 3), ones (1, 3))), infsupdec (zeros (3, 1), ones (3, 1))));
diff --git a/inst/@infsupdec/tril.m b/inst/@infsupdec/tril.m
new file mode 100644
index 0000000..9995773
--- /dev/null
+++ b/inst/@infsupdec/tril.m
@@ -0,0 +1,67 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @defmethod {@@infsup} tril (@var{A})
+## @defmethodx {@@infsup} tril (@var{A}, @var{k})
+## @defmethodx {@@infsup} tril (@var{A}, @var{k}, "pack")
+## Return a new matrix formed by extracting the lower triangular part of the
+## matrix @var{A}, and setting all other elements to zero.
+##
+## The second argument is optional, and specifies how many diagonals above or
+## below the main diagonal should also be set to zero.
+##
+## If the option @option{pack} is given as third argument, the extracted
+## elements are not inserted into a matrix, but rather stacked column-wise one
+## above other.
+##
+## @seealso{@@infsupdec/triu, @@infsupdec/diag}
+## @end defmethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-08-04
+
+function A = tril (A, varargin)
+
+if (nargin > 3)
+ print_usage ();
+ return
+endif
+
+if (nargin >= 2 && isa (varargin{1}, 'infsup'))
+ error ('tril: invalid second argument; it must not be an interval');
+endif
+if (nargin >= 3 && isa (varargin{2}, 'infsup'))
+ error ('tril: invalid third argument; it must not be an interval');
+endif
+
+A.infsup = tril (A.infsup, varargin{:});
+
+A.dec(A.dec == 0) = uint8 (255);
+A.dec = tril (A.dec, varargin{:});
+A.dec(A.dec == 0) = _com (); # any new elements are [0]_com
+A.dec(A.dec == uint8 (255)) = uint8 (0);
+
+endfunction
+
+%!assert (tril (infsupdec (magic (10))) == tril (magic (10)));
+%!assert (tril (infsupdec (magic (10)), 1) == tril (magic (10), 1));
+%!assert (tril (infsupdec (magic (10)), -1) == tril (magic (10), -1));
+%!assert (tril (infsupdec (magic (10)), 0, "pack") == tril (magic (10), 0, "pack"));
+%!test
+%! A = infsupdec (zeros (3), "trv");
+%! assert (decorationpart (tril (A)), {"trv", "com", "com"; "trv", "trv", "com"; "trv", "trv", "trv"});
diff --git a/inst/@infsupdec/triu.m b/inst/@infsupdec/triu.m
new file mode 100644
index 0000000..1cd5dc0
--- /dev/null
+++ b/inst/@infsupdec/triu.m
@@ -0,0 +1,67 @@
+## Copyright 2016 Oliver Heimlich
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @defmethod {@@infsup} triu (@var{A})
+## @defmethodx {@@infsup} triu (@var{A}, @var{k})
+## @defmethodx {@@infsup} triu (@var{A}, @var{k}, "pack")
+## Return a new matrix formed by extracting the upper triangular part of the
+## matrix @var{A}, and setting all other elements to zero.
+##
+## The second argument is optional, and specifies how many diagonals above or
+## below the main diagonal should also be set to zero.
+##
+## If the option @option{pack} is given as third argument, the extracted
+## elements are not inserted into a matrix, but rather stacked column-wise one
+## above other.
+##
+## @seealso{@@infsupdec/tril, @@infsupdec/diag}
+## @end defmethod
+
+## Author: Oliver Heimlich
+## Keywords: interval
+## Created: 2016-08-04
+
+function A = triu (A, varargin)
+
+if (nargin > 3)
+ print_usage ();
+ return
+endif
+
+if (nargin >= 2 && isa (varargin{1}, 'infsup'))
+ error ('triu: invalid second argument; it must not be an interval');
+endif
+if (nargin >= 3 && isa (varargin{2}, 'infsup'))
+ error ('triu: invalid third argument; it must not be an interval');
+endif
+
+A.infsup = triu (A.infsup, varargin{:});
+
+A.dec(A.dec == 0) = uint8 (255);
+A.dec = triu (A.dec, varargin{:});
+A.dec(A.dec == 0) = _com (); # any new elements are [0]_com
+A.dec(A.dec == uint8 (255)) = uint8 (0);
+
+endfunction
+
+%!assert (triu (infsupdec (magic (10))) == triu (magic (10)));
+%!assert (triu (infsupdec (magic (10)), 1) == triu (magic (10), 1));
+%!assert (triu (infsupdec (magic (10)), -1) == triu (magic (10), -1));
+%!assert (triu (infsupdec (magic (10)), 0, "pack") == triu (magic (10), 0, "pack"));
+%!test
+%! A = infsupdec (zeros (3), "trv");
+%! assert (decorationpart (triu (A)), {"trv", "trv", "trv"; "com", "trv", "trv"; "com", "com", "trv"});
diff --git a/inst/@infsupdec/uminus.m b/inst/@infsupdec/uminus.m
index 9077d72..a919f94 100644
--- a/inst/@infsupdec/uminus.m
+++ b/inst/@infsupdec/uminus.m
@@ -42,16 +42,11 @@ if (nargin ~= 1)
return
endif
-if (isnai (x))
- result = x;
- return
-endif
-
## uminus is defined and continuous everywhere
-result = newdec (uminus (intervalpart (x)));
+result = newdec (uminus (x.infsup));
result.dec = x.dec;
endfunction
-%!test "from the documentation string";
-%! assert (isequal (-infsupdec (2, 3), infsupdec (-3, -2)));
+%!# from the documentation string
+%!assert (isequal (-infsupdec (2, 3), infsupdec (-3, -2)));
diff --git a/inst/@infsupdec/union.m b/inst/@infsupdec/union.m
index 16fa587..0306022 100644
--- a/inst/@infsupdec/union.m
+++ b/inst/@infsupdec/union.m
@@ -52,37 +52,30 @@ if (not (isa (a, "infsupdec")))
a = infsupdec (a);
endif
-if (isnai (a))
- result = a;
- return
-endif
-
switch (nargin)
case 1
- bare = union (intervalpart (a));
+ result = infsupdec (union (a.infsup), "trv");
+ result.dec = min (result.dec, min (a.dec));
+
case 2
if (not (isa (b, "infsupdec")))
b = infsupdec (b);
endif
- if (isnai (b))
- result = b;
- return
- endif
- bare = union (intervalpart (a), intervalpart (b));
+ result = infsupdec (union (a.infsup, b.infsup), "trv");
+ warning ("off", "Octave:broadcast", "local");
+ result.dec = min (result.dec, min (a.dec, b.dec));
case 3
if (not (builtin ("isempty", b)))
warning ("union: second argument is ignored");
endif
- bare = union (intervalpart (a), [], dim);
+ result = infsupdec (union (a.infsup, [], dim), "trv");
+ result.dec = min (result.dec, min (a.dec, [], dim));
otherwise
print_usage ();
return
endswitch
-## convexHull must not retain any useful decoration
-result = infsupdec (bare, "trv");
-
endfunction
-%!test "from the documentation string";
-%! assert (isequal (union (infsupdec (1, 3), infsupdec (2, 4)), infsupdec (1, 4, "trv")));
+%!# from the documentation string
+%!assert (isequal (union (infsupdec (1, 3), infsupdec (2, 4)), infsupdec (1, 4, "trv")));
diff --git a/inst/@infsupdec/vertcat.m b/inst/@infsupdec/vertcat.m
deleted file mode 100644
index 07faeac..0000000
--- a/inst/@infsupdec/vertcat.m
+++ /dev/null
@@ -1,70 +0,0 @@
-## Copyright 2014-2016 Oliver Heimlich
-##
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 3 of the License, or
-## (at your option) any later version.
-##
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-##
-## You should have received a copy of the GNU General Public License
-## along with this program; if not, see <http://www.gnu.org/licenses/>.
-
-## -*- texinfo -*-
-## @documentencoding UTF-8
-## @defop Method {@@infsupdec} vertcat (@var{ARRAY1}, @var{ARRAY2}, @dots{})
-## @defopx Operator {@@infsupdec} {[@var{ARRAY1}; @var{ARRAY2}; @dots{}]}
-##
-## Return the vertical concatenation of interval array objects along
-## dimension 1.
-##
-## @example
-## @group
-## a = infsupdec (2, 5);
-## [a; a; a]
-## @result{} ans = 3×1 interval vector
-## [2, 5]_com
-## [2, 5]_com
-## [2, 5]_com
-## @end group
-## @end example
-## @seealso{@@infsupdec/horzcat}
-## @end defop
-
-## Author: Oliver Heimlich
-## Keywords: interval
-## Created: 2014-11-02
-
-function result = vertcat (varargin)
-
-varargin = transpose (varargin);
-
-## Conversion to interval
-decoratedintervals = cellfun ("isclass", varargin, "infsupdec");
-to_convert = not (decoratedintervals);
-varargin (to_convert) = cellfun (@infsupdec, varargin (to_convert), ...
- "UniformOutput", false ());
-
-nais = cellfun (@isnai, varargin);
-if (any (nais))
- ## Simply return first NaI
- result = varargin {find (nais, 1)};
- return
-endif
-
-l = cell2mat (cellfun (@inf, varargin, "UniformOutput", false ()));
-u = cell2mat (cellfun (@sup, varargin, "UniformOutput", false ()));
-d = cell2mat (cellfun (@(x) x.dec, varargin, "UniformOutput", false ()));
-
-result = newdec (infsup (l, u));
-result.dec = d;
-
-endfunction
-
-%!xtest assert (isequal (vertcat (infsupdec (1), infsupdec (2)), infsupdec (vertcat (1, 2))));
-%!xtest "from the documentation string";
-%! a = infsupdec (2, 5);
-%! assert (isequal (vertcat (a, a, a), infsupdec ([2; 2; 2], [5; 5; 5])));
diff --git a/inst/__split_interval_literals__.m b/inst/__split_interval_literals__.m
index b0534d6..c092c1d 100644
--- a/inst/__split_interval_literals__.m
+++ b/inst/__split_interval_literals__.m
@@ -14,7 +14,7 @@
## along with this program; if not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
-## @documentencoding utf-8
+## @documentencoding UTF-8
## @defun __split_interval_literals__ (@var{S})
##
## Split string @var{S} into a cell array of interval literals.
diff --git a/inst/ctc_intersect.m b/inst/ctc_intersect.m
index 18ddb62..329accf 100644
--- a/inst/ctc_intersect.m
+++ b/inst/ctc_intersect.m
@@ -14,7 +14,7 @@
## along with this program; if not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
-## @documentencoding utf-8
+## @documentencoding UTF-8
## @defun ctc_intersect (@var{C1}, @var{Y1}, @var{C2}, @var{Y2})
## @defunx ctc_intersect (@var{C1}, @var{C2})
##
diff --git a/inst/ctc_union.m b/inst/ctc_union.m
index 9d7dc85..5f08499 100644
--- a/inst/ctc_union.m
+++ b/inst/ctc_union.m
@@ -14,7 +14,7 @@
## along with this program; if not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
-## @documentencoding utf-8
+## @documentencoding UTF-8
## @defun ctc_union (@var{C1}, @var{Y1}, @var{C2}, @var{Y2})
## @defunx ctc_union (@var{C1}, @var{C2})
##
diff --git a/inst/empty.m b/inst/empty.m
index e21ade0..e5c0107 100644
--- a/inst/empty.m
+++ b/inst/empty.m
@@ -53,19 +53,22 @@
function result = empty (varargin)
-switch nargin
- case 0
- result = infsupdec ();
- case 1
- result = infsupdec (inf (varargin {1}), -inf (varargin {1}));
- case 2
- result = infsupdec (+inf (varargin {1}, varargin {2}), ...
- -inf (varargin {1}, varargin {2}));
- otherwise
- print_usage();
-endswitch
+if (nargin > 2)
+ print_usage ();
+ return
+endif
+
+persistent scalar_empty_interval = infsupdec ();
+
+if (nargin == 0)
+ result = scalar_empty_interval;
+else
+ result = subsref (scalar_empty_interval, ...
+ substruct ("()", {ones(varargin{:})}));
+endif
endfunction
+
%!assert (inf (empty ()), inf);
%!assert (sup (empty ()), -inf);
%!assert (decorationpart (empty ()), {"trv"});
diff --git a/inst/entire.m b/inst/entire.m
index fb27f1a..46e9941 100644
--- a/inst/entire.m
+++ b/inst/entire.m
@@ -57,19 +57,22 @@
function result = entire (varargin)
-switch nargin
- case 0
- result = infsupdec (-inf, inf);
- case 1
- result = infsupdec (-inf (varargin {1}), inf (varargin {1}));
- case 2
- result = infsupdec (-inf (varargin {1}, varargin {2}), ...
- +inf (varargin {1}, varargin {2}));
- otherwise
- print_usage();
-endswitch
+if (nargin > 2)
+ print_usage ();
+ return
+endif
+
+persistent scalar_entire_interval = infsupdec (-inf, inf);
+
+if (nargin == 0)
+ result = scalar_entire_interval;
+else
+ result = subsref (scalar_entire_interval, ...
+ substruct ("()", {ones(varargin{:})}));
+endif
endfunction
+
%!assert (inf (entire ()), -inf);
%!assert (sup (entire ()), inf);
%!assert (decorationpart (entire ()), {"dac"});
diff --git a/inst/hull.m b/inst/hull.m
index 8f917c6..3e96b5a 100644
--- a/inst/hull.m
+++ b/inst/hull.m
@@ -70,7 +70,7 @@ l = u = cell (size (varargin));
## Floating point numbers can be used without conversion
floats = cellfun (@isfloat, varargin);
-l (floats) = u (floats) = varargin (floats);
+l(floats) = u(floats) = varargin(floats);
## Convert everything else to interval, if necessary
decoratedintervals = cellfun ("isclass", varargin, "infsupdec");
@@ -78,45 +78,38 @@ to_convert = not (decoratedintervals | floats);
## Use infsupdec constructor for conversion, because it can handle decorated
## interval literals. Also, it will trigger an interval:ImplicitPromote
## warning if necessary.
-varargin (to_convert) = cellfun (@infsupdec, varargin (to_convert), ...
- "UniformOutput", false ());
+varargin(to_convert) = cellfun (@infsupdec, varargin(to_convert), ...
+ "UniformOutput", false ());
decoratedintervals = not (floats);
-nais = cellfun (@isnai, varargin (decoratedintervals));
-if (any (nais))
- ## Simply return first NaI
- result = varargin (decoratedintervals) {find (nais, 1)};
- return
-endif
-
## Extract inf and sup matrices for remaining elements of l and u.
-l (decoratedintervals) = cellfun (@inf, varargin (decoratedintervals), ...
- "UniformOutput", false ());
-u (decoratedintervals) = cellfun (@sup, varargin (decoratedintervals), ...
- "UniformOutput", false ());
+l(decoratedintervals) = cellfun (@inf, varargin(decoratedintervals), ...
+ "UniformOutput", false ());
+u(decoratedintervals) = cellfun (@sup, varargin(decoratedintervals), ...
+ "UniformOutput", false ());
## Broadcast nonsingleton dimensions (otherwise cat would throw an error below)
sizes1 = cellfun ("size", l, 1);
sizes2 = cellfun ("size", l, 2);
targetsize = [max(sizes1) max(sizes2)];
-if ((targetsize (1) ~= 1 && min (sizes1 (sizes1 ~= 1)) ~= targetsize (1))
- || (targetsize (2) ~= 1 && min (sizes2 (sizes2 ~= 1)) ~= targetsize (2)))
+if ((targetsize(1) ~= 1 && min (sizes1 (sizes1 ~= 1)) ~= targetsize(1))
+ || (targetsize(2) ~= 1 && min (sizes2 (sizes2 ~= 1)) ~= targetsize(2)))
error ("hull: dimension mismatch")
endif
if (any (targetsize ~= [1 1]))
- to_broadcast = sizes1 ~= targetsize (1) ...
- | sizes2 ~= targetsize (2);
+ to_broadcast = sizes1 ~= targetsize(1) ...
+ | sizes2 ~= targetsize(2);
if (any (to_broadcast))
for i = find (to_broadcast)
- if (size (l {i}, 1) ~= targetsize (1))
+ if (size (l{i}, 1) ~= targetsize(1))
## Broadcast 1st dimension
- l {i} = l {i} (ones (targetsize (1), 1), :);
- u {i} = u {i} (ones (targetsize (1), 1), :);
+ l{i} = l{i} (ones (targetsize(1), 1), :);
+ u{i} = u{i} (ones (targetsize(1), 1), :);
endif
- if (size (l {i}, 2) ~= targetsize (2))
+ if (size (l{i}, 2) ~= targetsize(2))
## Broadcast 2nd dimension
- l {i} = l {i} (:, ones (targetsize (2), 1));
- u {i} = u {i} (:, ones (targetsize (2), 1));
+ l{i} = l{i} (:, ones (targetsize(2), 1));
+ u{i} = u{i} (:, ones (targetsize(2), 1));
endif
endfor
endif
@@ -125,27 +118,33 @@ endif
## Compute min and max of inf and sup matrices, NaNs would be ignored and must
## be considered
nans = false (targetsize);
-l = cat (3, l {:});
-nans (any (isnan (l), 3)) = true;
+l = cat (3, l{:});
+nans(any (isnan (l), 3)) = true;
l = min (l, [], 3);
-u = cat (3, u {:});
-nans (any (isnan (u), 3)) = true;
+u = cat (3, u{:});
+nans(any (isnan (u), 3)) = true;
u = max (u, [], 3);
## Compute best possible decoration
dec = cell (targetsize);
-dec (:) = "com";
-dec (not (isfinite (l) & isfinite (u))) = "dac";
-dec (nans) = "trv";
+dec(:) = "com";
+dec(not (isfinite (l) & isfinite (u))) = "dac";
+dec(nans) = "trv";
## Consider input decorations
if (any (decoratedintervals))
dec = mindec (dec, cellfun (@decorationpart, ...
- varargin (decoratedintervals), ...
+ varargin(decoratedintervals), ...
"UniformOutput", false ()));
endif
+nairesult = strcmp (dec, "ill");
+emptyresult = isnan (l) | isnan (u) | l > u | nairesult;
+l(emptyresult) = u(emptyresult) = 0;
+dec(nairesult) = "com";
result = infsupdec (l, u, dec);
+result(emptyresult) = empty ();
+result(nairesult) = nai ();
endfunction
@@ -153,16 +152,16 @@ function decoration = mindec (decoration, decorations)
## Determine and apply the minimum decoration
for i = 1 : length (decorations)
- if (iscell (decorations {i}) && not (isempty (decorations {i})))
- otherdecoration = decorations {i} {1};
+ if (iscell (decorations{i}) && not (isempty (decorations{i})))
+ otherdecoration = decorations{i}{1};
else
- otherdecoration = decorations {i};
+ otherdecoration = decorations{i};
endif
## Only check distinct elements
- for n = find (not (strcmp (decoration, decorations {i}))) (:)'
- if (iscell (decorations {i}) && not (isscalar (decorations {i})))
- otherdecoration = decorations {i} {n};
+ for n = find (not (strcmp (decoration, decorations{i})))(:)'
+ if (iscell (decorations{i}) && not (isscalar (decorations{i})))
+ otherdecoration = decorations{i}{n};
else
## Scalars broadcast into the whole cell array. The value is set
## once before the inner for loop.
@@ -170,8 +169,10 @@ for i = 1 : length (decorations)
## Because of the simple propagation order com > dac > def > trv, we
## can use string comparison order.
- if (sign ((decoration {n}) - otherdecoration) * [4; 2; 1] < 0)
- decoration {n} = otherdecoration;
+ if (!strcmp (decoration{n}, "ill") && ...
+ (strcmp (otherdecoration, "ill") || ...
+ sign ((decoration{n}) - otherdecoration) * [4; 2; 1] < 0))
+ decoration{n} = otherdecoration;
endif
endfor
endfor
@@ -181,9 +182,14 @@ endfunction
%!assert (isnai (hull (nai)));
%!assert (isempty (hull (nan)));
%!assert (isequal (hull (2, nan, 3, 5), infsupdec (2, 5, "trv")));
-%!xtest assert (isequal (hull ([1, 2, 3], [5; 0; 2]), infsupdec ([1, 2, 3; 0, 0, 0; 1, 2, 2], [5, 5, 5; 1, 2, 3; 2, 2, 3], "com")));
-%!xtest assert (isequal (hull (magic (3), 10), infsupdec (magic (3), 10 (ones (3)), "com")));
-%!xtest assert (isequal (hull (2, magic (3), [nan, 2, 3; nan, 1, 1; 99, 100, nan]), infsupdec ([2, 1, 2; 2, 1, 1; 2, 2, 2], [8, 2, 6; 3, 5, 7; 99, 100, 2], {"trv", "com", "com"; "trv", "com", "com"; "com", "com", "trv"})));
+%!assert (isequal (hull ([1, 2, 3], [5; 0; 2]), infsupdec ([1, 2, 3; 0, 0, 0; 1, 2, 2], [5, 5, 5; 1, 2, 3; 2, 2, 3], "com")));
+%!assert (isequal (hull (magic (3), 10), infsupdec (magic (3), 10 (ones (3)), "com")));
+%!assert (isequal (hull (2, magic (3), [nan, 2, 3; nan, 1, 1; 99, 100, nan]), infsupdec ([2, 1, 2; 2, 1, 1; 2, 2, 2], [8, 2, 6; 3, 5, 7; 99, 100, 2], {"trv", "com", "com"; "trv", "com", "com"; "com", "com", "trv"})));
+%!assert (isnai (hull ([nai, 2])), logical ([1 0]));
+%!assert (isnai (hull ([nai, 2], [nai, 3])), logical ([1 0]));
+%!assert (isnai (hull ([nai, 2], nai)), logical ([1 1]));
+%!assert (isnai (hull ([nai, 2], [2, nai])), logical ([1 1]));
+
%!test "from the documentation string";
%! assert (isequal (hull (1, 2, 3, 4), infsupdec (1, 4, "com")));
%! assert (isequal (hull (empty, entire), infsupdec (-inf, inf, "trv")));
diff --git a/inst/midrad.m b/inst/midrad.m
index 92f44a8..90b006f 100644
--- a/inst/midrad.m
+++ b/inst/midrad.m
@@ -15,11 +15,15 @@
## -*- texinfo -*-
## @documentencoding UTF-8
-## @defun midrad (@var{M}, @var{R})
-## @defunx midrad (@var{M})
-## @defunx midrad ()
+## @deftypefun {@var{I} =} midrad (@var{M}, @var{R})
+## @deftypefunx {@var{I} =} midrad (@var{M})
+## @deftypefunx {@var{I} =} midrad ()
+## @deftypefunx {[@var{M}, @var{R}] =} midrad (@var{I})
##
-## Create an interval enclosure for [@var{M}- at var{R}, @var{M}+ at var{R}].
+## Create an interval enclosure @var{I} for [@var{M}- at var{R}, @var{M}+ at var{R}].
+##
+## With two output arguments, compute a rigorous midpoint @var{M} and
+## radius @var{R} for interval @var{I}.
##
## Without input parameters, return the empty interval. With only one input
## parameter, the radius @var{R} defaults to zero.
@@ -33,8 +37,15 @@
## with interval literals in uncertain form @code{m?ruE} can instead be used to
## create tight enclosures of decimal numbers with a radius.
##
-## Accuracy: The result is an accurate enclosure. The result is tightest if
-## @var{M} and @var{R} are floating-point numbers or intervals.
+## Accuracy (with one output argument): The result is an accurate enclosure.
+## The result is tightest if @var{M} and @var{R} are floating-point numbers or
+## intervals.
+##
+## Accuracy (with two output arguments): @var{M} is the interval's midpoint
+## in binary64 precision, rounded to nearest and ties to even. The returned
+## radius @var{R} will make a tight enclosure of the interval together with
+## @var{M}. That is, @var{R} is the smallest binary64 number, which will make
+## [@var{M}- at var{R}, @var{M}+ at var{R}] enclose the interval @var{I}.
##
## @example
## @group
@@ -49,88 +60,109 @@
## @end group
## @end example
## @seealso{@@infsupdec/infsupdec, hull, @@infsupdec/mid, @@infsupdec/rad}
-## @end defun
+## @end deftypefun
## Author: Oliver Heimlich
## Keywords: interval
## Created: 2015-03-06
-function result = midrad (m, r)
+function [m, r] = midrad (m, r)
+
+if (nargout > 1)
+ warning ("off", "id=interval:ImplicitPromote", "local");
+endif
switch nargin
case 0
- result = infsupdec ();
+ i = infsupdec ();
+
case 1
- result = infsupdec (m);
+ if (nargout == 2 && isa (m, "infsup"))
+ i = m;
+ else
+ i = infsupdec (m);
+ endif
+
case 2
if (isfloat (m) && isreal (m) && ...
isfloat (r) && isreal (r))
## Simple case: m and r are binary64 numbers
l = mpfr_function_d ('minus', -inf, m, r);
u = mpfr_function_d ('plus', +inf, m, r);
- emptyresult = r < 0 & true (size (m));
- l (emptyresult) = inf;
- u (emptyresult) = -inf;
- result = infsupdec (l, u);
+ i = infsupdec (l, u);
else
## Complicated case: m and r are strings or other types
m = infsupdec (m);
- if (isnai (m))
- result = m;
- return
- endif
if (not (isa (r, "infsup")))
## [-inf, r] should make a valid interval, unless r == -inf
## Intersection with non-negative numbers ensures that we
## return [Empty] if r < 0.
if (isfloat (r))
- r (r == -inf) = nan;
+ r(r == -inf) = nan;
endif
r = intersect (infsupdec (-inf, r), infsupdec (0, inf));
- if (not (isnai (r)))
- ## Fix decoration
- r = newdec (intervalpart (r));
- endif
+ ## Fix decoration, since intersect would return “trv” at best.
+ legal_radius = not (isempty (r));
+ r(legal_radius) = newdec (intervalpart (r(legal_radius)));
endif
if (isa (r, "infsupdec"))
- if (isnai (r))
- result = r;
- return
- endif
dec_r = decorationpart (r);
else
- dec_r = "com";
+ dec_r = {"com"};
endif
sup_r = sup (r);
- sup_r (sup_r < 0) = -inf;
+ sup_r(sup_r < 0) = -inf;
r = infsupdec (-sup_r, sup_r, dec_r);
- result = m + r;
+ i = m + r;
endif
otherwise
print_usage ();
endswitch
+switch nargout
+ case {0, 1}
+ m = i;
+
+ case 2
+ m = mid (i);
+ ## The midpoint is rounded to nearest and the radius
+ ## must cover both boundaries
+ r1 = mpfr_function_d ('minus', +inf, m, inf (i));
+ r2 = mpfr_function_d ('minus', +inf, sup (i), m);
+ r = max (r1, r2);
+
+ otherwise
+ print_usage ();
+endswitch
+
endfunction
%!assert (isempty (midrad ()));
-%!assert (isempty (midrad (0, -inf)));
-%!assert (isempty (midrad (0, -.1)));
-%!assert (isempty (midrad (0, "-.1")));
-%!assert (isempty (midrad (0, infsup("-.1"))));
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (midrad (0, -inf)));
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (midrad (0, -.1)));
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (midrad (0, "-.1")));
+%!warning id=interval:UndefinedOperation
+%! assert (isnai (midrad (0, infsup("-.1"))));
%!assert (isequal (midrad ("pi"), infsupdec ("pi")));
-%!warning assert (isequal (midrad (infsup (2), 2), infsupdec (0, 4)));
+%!warning id=interval:ImplicitPromote
+%! assert (isequal (midrad (infsup (2), 2), infsupdec (0, 4)));
%!assert (isequal (midrad (2, infsup (2)), infsupdec (0, 4)));
-%!warning assert (isequal (midrad (infsup (2), infsup (2)), infsupdec (0, 4)));
+%!warning id=interval:ImplicitPromote
+%! assert (isequal (midrad (infsup (2), infsup (2)), infsupdec (0, 4)));
%!assert (isequal (midrad (2, infsupdec (2)), infsupdec (0, 4)));
%!assert (isequal (midrad (infsupdec (2), 2), infsupdec (0, 4)));
-%!warning assert (isequal (midrad (infsup (2), infsupdec (2)), infsupdec (0, 4)));
+%!warning id=interval:ImplicitPromote
+%! assert (isequal (midrad (infsup (2), infsupdec (2)), infsupdec (0, 4)));
%!assert (isequal (midrad (infsupdec (2), infsup (2)), infsupdec (0, 4)));
%!assert (isequal (midrad (infsupdec (2), infsupdec (2)), infsupdec (0, 4)));
-%!xtest assert (isequal (midrad (1, magic (3)), infsupdec ([-7, 0, -5; -2, -4, -6; -3, -8, -1], [9, 2, 7; 4, 6, 8; 5, 10, 3])));
-%!xtest assert (isequal (midrad (magic (3), 1), infsupdec ([7, 0, 5; 2, 4, 6; 3, 8, 1], [9, 2, 7; 4, 6, 8; 5, 10, 3])));
-%!test "from the documentation string";
-%! assert (isequal (midrad (42, 3), infsupdec (39, 45)));
-%! assert (isequal (midrad (0, inf), entire ()));
-%! assert (isequal (midrad ("1.1", "0.1"), infsupdec (1 - eps, "1.2")));
+%!assert (isequal (midrad (1, magic (3)), infsupdec ([-7, 0, -5; -2, -4, -6; -3, -8, -1], [9, 2, 7; 4, 6, 8; 5, 10, 3])));
+%!assert (isequal (midrad (magic (3), 1), infsupdec ([7, 0, 5; 2, 4, 6; 3, 8, 1], [9, 2, 7; 4, 6, 8; 5, 10, 3])));
+%!# from the documentation string
+%!assert (isequal (midrad (42, 3), infsupdec (39, 45)));
+%!assert (isequal (midrad (0, inf), entire ()));
+%!assert (isequal (midrad ("1.1", "0.1"), infsupdec (1 - eps, "1.2")));
diff --git a/inst/nai.m b/inst/nai.m
index dec8afd..c2c3d52 100644
--- a/inst/nai.m
+++ b/inst/nai.m
@@ -16,6 +16,8 @@
## -*- texinfo -*-
## @documentencoding UTF-8
## @defun nai ()
+## @defunx nai (@var{N})
+## @defunx nai (@var{N}, @var{M})
##
## Return the ill-formed decorated interval, called NaI (Not an Interval).
##
@@ -26,9 +28,9 @@
## is false.
##
## The interval part of NaI is undefined. The decoration part of NaI is
-## @code{ill}. The size of NaI is one in each dimension.
+## @code{ill}.
##
-## The infsup constructor will not produce NaIs, but an error instead.
+## The infsup constructor will not produce NaIs, but a warning instead.
##
## @example
## @group
@@ -45,18 +47,25 @@
## Keywords: interval
## Created: 2015-02-22
-function result = nai ()
+function result = nai (varargin)
-if (nargin ~= 0)
+if (nargin > 2)
print_usage ();
return
endif
-result = infsupdec ("[nai]");
+persistent scalar_nai_interval = infsupdec ("[nai]");
+
+if (nargin == 0)
+ result = scalar_nai_interval;
+else
+ result = subsref (scalar_nai_interval, ...
+ substruct ("()", {ones(varargin{:})}));
+endif
endfunction
%!assert (isnai (nai ()));
-%!error (nai (1));
-%!error (intervalpart (nai ()));
+%!assert (isnai (nai (2)), true (2));
+%!assert (isnai (nai (3, 4)), true (3, 4));
%!assert (decorationpart (nai ()), {"ill"});
diff --git a/inst/test/abs_rev.tst b/inst/test/abs_rev.tst
index e2b2de7..869dc04 100644
--- a/inst/test/abs_rev.tst
+++ b/inst/test/abs_rev.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/abs_rev.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2015-2016 Oliver Heimlich
##
diff --git a/inst/test/atan2.tst b/inst/test/atan2.tst
index 316245d..a10c8dc 100644
--- a/inst/test/atan2.tst
+++ b/inst/test/atan2.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/atan2.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2015-2016 Oliver Heimlich
##
diff --git a/inst/test/c-xsc.tst b/inst/test/c-xsc.tst
index d8ecd84..6503446 100644
--- a/inst/test/c-xsc.tst
+++ b/inst/test/c-xsc.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/c-xsc.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 1990-2000 Institut fuer Angewandte Mathematik,
## Universitaet Karlsruhe, Germany
diff --git a/inst/test/fi_lib.tst b/inst/test/fi_lib.tst
index 5a4bb29..dc7fde7 100644
--- a/inst/test/fi_lib.tst
+++ b/inst/test/fi_lib.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/fi_lib.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 1997-2000 Institut fuer Wissenschaftliches Rechnen
## und Mathematische Modellbildung (IWRMM)
diff --git a/inst/test/libieeep1788_tests_bool.tst b/inst/test/libieeep1788_tests_bool.tst
index f0ed092..994389e 100644
--- a/inst/test/libieeep1788_tests_bool.tst
+++ b/inst/test/libieeep1788_tests_bool.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_bool.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_cancel.tst b/inst/test/libieeep1788_tests_cancel.tst
index b8703cb..297e730 100644
--- a/inst/test/libieeep1788_tests_cancel.tst
+++ b/inst/test/libieeep1788_tests_cancel.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_cancel.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_elem.tst b/inst/test/libieeep1788_tests_elem.tst
index 345040c..59f1235 100644
--- a/inst/test/libieeep1788_tests_elem.tst
+++ b/inst/test/libieeep1788_tests_elem.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_elem.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_mul_rev.tst b/inst/test/libieeep1788_tests_mul_rev.tst
index b07e3e9..49289b5 100644
--- a/inst/test/libieeep1788_tests_mul_rev.tst
+++ b/inst/test/libieeep1788_tests_mul_rev.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_mul_rev.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_num.tst b/inst/test/libieeep1788_tests_num.tst
index 42f5e66..191ffbb 100644
--- a/inst/test/libieeep1788_tests_num.tst
+++ b/inst/test/libieeep1788_tests_num.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_num.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_overlap.tst b/inst/test/libieeep1788_tests_overlap.tst
index ae3c636..e4eec5d 100644
--- a/inst/test/libieeep1788_tests_overlap.tst
+++ b/inst/test/libieeep1788_tests_overlap.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_overlap.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_rec_bool.tst b/inst/test/libieeep1788_tests_rec_bool.tst
index d526242..230e5ac 100644
--- a/inst/test/libieeep1788_tests_rec_bool.tst
+++ b/inst/test/libieeep1788_tests_rec_bool.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_rec_bool.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_rev.tst b/inst/test/libieeep1788_tests_rev.tst
index 578033d..f1677e1 100644
--- a/inst/test/libieeep1788_tests_rev.tst
+++ b/inst/test/libieeep1788_tests_rev.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_rev.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/libieeep1788_tests_set.tst b/inst/test/libieeep1788_tests_set.tst
index ca4547b..206dbe5 100644
--- a/inst/test/libieeep1788_tests_set.tst
+++ b/inst/test/libieeep1788_tests_set.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/libieeep1788_tests_set.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2013-2015 Marco Nehmeier (nehmeier at informatik.uni-wuerzburg.de)
## Copyright 2015-2016 Oliver Heimlich
diff --git a/inst/test/mpfi.tst b/inst/test/mpfi.tst
index 0c1fd08..1b3d78f 100644
--- a/inst/test/mpfi.tst
+++ b/inst/test/mpfi.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/mpfi.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2009–2012 Spaces project, Inria Lorraine
## and Salsa project, INRIA Rocquencourt,
diff --git a/inst/test/mpfr_matrix_mul_d.cc-tst b/inst/test/mpfr_matrix_mul_d.cc-tst
index ba48720..ab8bd69 100644
--- a/inst/test/mpfr_matrix_mul_d.cc-tst
+++ b/inst/test/mpfr_matrix_mul_d.cc-tst
@@ -3,3 +3,25 @@
%! [l, u] = mpfr_matrix_mul_d (magic (3), magic (3)', magic (3) + 1, magic (3)' + 1);
%! assert (l, [101, 71, 53; 71, 83, 71; 53, 71, 101]);
%! assert (u, [134, 104, 86; 104, 116, 104; 86, 104, 134]);
+%!test;
+%! if (((exist ("__octave_config_info__") && ...
+%! __octave_config_info__.ENABLE_OPENMP) || ...
+%! (not (exist ("__octave_config_info__")) && ...
+%! octave_config_info ("features").OPENMP)) ...
+%! && nproc ("overridable") > 1)
+%! ## OpenMP is enabled and may use more than one thread.
+%! ## We should observe speed-ups by that.
+%! A = vec (magic (2000));
+%! tic;
+%! mpfr_matrix_mul_d (A', A, A', A);
+%! time_per_element = toc;
+%! A = [A A];
+%! tic;
+%! mpfr_matrix_mul_d (A', A, A', A);
+%! time_per_element_parallel = toc / numel (ans);
+%!
+%! ## Ideally, the runtime would be cut in half (at least),
+%! ## however, there is an overhead, so let's be pessimistic and
+%! ## assume that the parallel execution is at least 20% faster.
+%! assert (time_per_element > 1.2 * time_per_element_parallel)
+%! endif
diff --git a/inst/test/mpfr_to_string_d.cc-tst b/inst/test/mpfr_to_string_d.cc-tst
index 2f07fc5..5560a98 100644
--- a/inst/test/mpfr_to_string_d.cc-tst
+++ b/inst/test/mpfr_to_string_d.cc-tst
@@ -3,3 +3,11 @@
%! [s, isexact] = mpfr_to_string_d (-inf, "decimal", .1);
%! assert (s, {"0.1"});
%! assert (isexact, false);
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", inf), {"inf"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", -inf), {"-inf"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", nan), {"nan"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", 0), {"0x0.0000000000000p+0"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", 2), {"0x1.0000000000000p+1"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", -1), {"-0x1.0000000000000p+0"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", pow2 (-1022)), {"0x1.0000000000000p-1022"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", pow2 (-1074)), {"0x0.0000000000001p-1022"});
diff --git a/inst/test/pow_rev.tst b/inst/test/pow_rev.tst
index 802ae40..c21b83a 100644
--- a/inst/test/pow_rev.tst
+++ b/inst/test/pow_rev.tst
@@ -1,6 +1,6 @@
## DO NOT EDIT! Generated automatically from test/pow_rev.itl
## by the Interval Testing Framework for IEEE 1788.
-## https://github.com/nehmeier/ITF1788/tree/635bff73cc64ff8aab0ff2031ee8a53980be0115
+## https://github.com/nehmeier/ITF1788/tree/92558f7e942665a78f2e883dbe7af52320100fba
##
## Copyright 2015-2016 Oliver Heimlich
##
diff --git a/inst/vereigback.m b/inst/vereigback.m
new file mode 100644
index 0000000..94c753e
--- /dev/null
+++ b/inst/vereigback.m
@@ -0,0 +1,108 @@
+## Copyright 2008 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from vereigback in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[@var{lambda}, @var{X}, @var{ep}] =} vereigback (@var{A})
+## Verified backward error analysis of eigenpairs.
+##
+## For a square complex (or real) matrix @var{A}, this function computes a
+## vector of eigenvalues @var{lambda} and a matrix of eigenvectors @var{X}
+## in the usual Octave way
+## @display
+## @code{[X, L] = eig (A); lambda = diag (L);}
+## @end display
+## and additionally a vector @var{ep} with the following property: for each
+## @var{i} there exists a matrix, say @var{A}[@var{i}], verified to satisfy
+## @code{max (max (abs (A - A[i]))) <= ep(i)} such that
+## @code{(lambda(i), X(:, i))} is verified to be an @emph{exact} eigenpair
+## of @var{A}[@var{i}]. If @var{A}, @code{lambda(i)}, and @code{X(:, i)} are
+## real then @var{A}[@var{i}] can be taken real, otherwise it is complex in
+## general. The maximal value of @code{ep(i)} is usually very small (of order
+## 1e-013 to 1e-016), which shows that Octave computes eigenvalues and
+## eigenvectors with great accuracy.
+##
+## Based on the inequality (3.13) in J. Rohn, A Handbook of Results on Interval
+## Linear Problems, posted at @url{http://www.cs.cas.cz/~rohn}, which also
+## holds for complex eigenpairs (unpublished).
+##
+## This work was supported by the Czech Republic National Research
+## Program “Information Society”, project 1ET400300415.
+## @seealso{eig}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2008
+
+function [lambda, X, ep] = vereigback (A)
+
+warning ("on", "vereigback:complex", "local")
+if (nargin ~= 1)
+ print_usage ();
+ return
+endif
+
+[m, n] = size (A);
+[X, L] = eig (A); # A*X=X*L
+lambda = diag (L);
+
+I = eye (n);
+ep = inf (n, 1);
+if (nargout > 2)
+ for i = 1 : n
+ ll = lambda (i);
+ xx = X(:, i);
+ if (~isreal (ll) || ~isreal (xx))
+ warning ("vereigback:complex", ...
+ "vereigback: complex eigenvalues / eigenvectors not supported")
+ ## issue warning only once per function call
+ warning ("off", "vereigback:complex", "local")
+ endif
+ ll = infsup (ll);
+ xx = infsup (xx);
+ epi = norm ((A - ll .* I) * xx, "inf") ./ norm (xx, 1); # main formula
+ ep(i) = epi.sup;
+ end
+endif
+
+endfunction
+
+%!test
+%! [lambda, X, ep] = vereigback (eye (2));
+%! assert (lambda, [1; 1]);
+%! assert (X, eye (2));
+%! assert (ep, zeros (2, 1));
+
+%!test
+%! [lambda, X, ep] = vereigback ([2 1; 1 2]);
+%! assert (lambda, [1; 3]);
+%! assert (X, [-1 1; 1 1] ./ sqrt (2), eps);
+%! assert (ep, zeros (2, 1));
+
+%!test
+%! [lambda, X, ep] = vereigback ([2 0 0; 0 3 4; 0 4 9]);
+%! assert (lambda, [1; 2; 11]);
+%! assert (ep, zeros (3, 1));
+
+%!test
+%! [lambda, X, ep] = vereigback ([1 2 3; 0 1 2; 1 1 1]);
+%! assert (max (ep) < 1e-14);
diff --git a/inst/vereigvec.m b/inst/vereigvec.m
new file mode 100644
index 0000000..1f0061d
--- /dev/null
+++ b/inst/vereigvec.m
@@ -0,0 +1,221 @@
+## Copyright 2007 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from vereigvec in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[@var{evc}, @var{lambda}, @var{As}] =} vereigvec (@var{A}, @var{x})
+## Verified real eigenvector of an interval matrix.
+##
+## For a square interval matrix @var{A} and a @emph{real} vector @var{x}, this
+## function verifies @var{x} to be an eigenvector of some matrix in @var{A}, or
+## not to be an eigenvector of any matrix in @var{A}, or yields no verified
+## result (unfortunately, complex eigenvectors cannot be handled yet):
+##
+## @table @asis
+## @item @var{evc} = 1
+## @var{x} is verified to be an eigenvector of some matrix in @var{A},
+## @var{lambda} is an interval number such that for each
+## @var{lambda0} ∈ @var{lambda}, @var{A} is verified to contain a matrix having
+## (@var{lamda0}, @var{x}) as an eigenpair,
+## @var{As} is a very tight interval matrix verified to contain
+## a matrix having (mid (@var{lambda}), @var{x}) as an eigenpair,
+##
+## @item @var{evc} = 0
+## @var{x} is verified not to be an eigenvector of any matrix in @var{A},
+## @var{lambda} and @var{As} consist of empty intervals,
+##
+## @item @var{evc} = -1
+## no verified result (data may be wrong).
+## @end table
+##
+## Based on the section “Real eigenvectors” in
+## J. Rohn, A handbook of results on interval linear problems,
+## posted at @url{http://www.cs.cas.cz/~rohn}.
+##
+## This work was supported by the Czech Republic National Research
+## Program “Information Society”, project 1ET400300415.
+##
+## @seealso{eig}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2007
+
+function [evc, lambda, As] = vereigvec (A, x)
+
+if (nargin ~= 2)
+ print_usage ();
+ return
+endif
+
+x = x(:);
+p = length(x);
+[m, n] = size (A);
+
+if (m ~= n)
+ error ("vereigvec: matrix is not square");
+elseif (n ~= p)
+ error ("vereigvec: sizes do not match");
+elseif (~isreal (x) || isequal (x, zeros (p, 1)))
+ error ("vereigvec: wrong data");
+endif
+
+if (~isa (A, "infsup"))
+ if (~isreal (A))
+ error ("vereigvec: wrong data");
+ endif
+ A = infsup (A); # allows for real input
+endif
+
+## checking the basic inequality
+[ac, Delta] = rad (A);
+z = sgn (x);
+x1 = infsup (x); # x double, x1 intval
+Tz = infsup (diag (z));
+left = Tz * (ac - Tz * Delta * Tz) * x1 * x1' * Tz; # left-hand side of the inequality
+right = Tz * x1 * x1' * (ac + Tz * Delta * Tz)' * Tz; # right-hand side of the inequality
+
+## inequality verified not to be satisfied
+if (any ((right.sup < left.inf)(:)))
+ ## verified not to be an eigenvector
+ evc = 0;
+ lambda = infsup ();
+ As = repmat (infsup (), n, n);
+ return
+endif
+
+## inequality verified to be satisfied
+if (all (all (left.sup <= right.inf))) # verified to be an eigenvector; Rohn, SIMAX 1993, Thm. 4.1
+ B = find (x ~= 0);
+ denleft = (Tz * ac * Tz - Delta) * abs (x);
+ denright = (Tz * ac * Tz + Delta) * abs (x);
+ num = abs (x);
+ denleft = denleft(B);
+ denright = denright(B);
+ num = num(B);
+ left = denleft ./ num; # left ratio
+ right = denright ./ num; # right ratio
+ lambdal = max (left.sup); # verified lower bound of lambda
+ lambdau = min (right.inf); # verified upper bound of lambda
+ if (lambdal > lambdau)
+ ## bounds contradict: no verified solution
+ evc = -1;
+ lambda = infsup ();
+ As = repmat (infsup (), n, n);
+ return
+ endif
+
+ lambda = infsup (lambdal, lambdau); # lambda
+ lambdam = mid (lambda); # midpoint of lambda
+
+ ## finding a matrix with eigenpair (lambdam, x)
+ A1 = A - lambdam .* eye (n);
+ AAs = versingnull (A1, x); # enclosure of a singular matrix in A1 having x as a null vector
+ if (isempty (AAs(1, 1)))
+ # no enclosure outputted: no verified solution
+ evc = -1;
+ lambda = infsup ();
+ As = repmat (infsup (), n, n);
+ return
+ endif
+
+ AAs = AAs + lambdam .* eye (n); # back to A
+ if (subset (AAs, A)) # AAs part of A
+ ## (lambdam, x) is an eigenpair of a matrix in As; Rohn, SIMAX 1993, proof of Thm. 4.1
+ evc = 1;
+ As=AAs;
+ return
+ endif
+
+ ## AAs not a part of A: no verified result
+ evc = -1;
+ lambda = infsup ();
+ As = repmat (infsup (), n, n);
+ return
+endif
+
+## no verified result
+evc = -1;
+lambda = infsup ();
+As = repmat (infsup (), n, n);
+endfunction
+
+
+function As = versingnull (A, x)
+## VERSINGNULL Verified singular matrix in A having x as a null vector.
+##
+## ~isempty (As(1, 1)): As is a tight interval matrix verified to be a part
+## of A and to contain a singular matrix having x
+## as a null vector
+## isempty (As(1, 1)): no result
+
+[m, n] = size (A);
+assert (m == n);
+z = sgn (x);
+xi = infsup (x);
+[Ac, Delta] = rad (A);
+oeprl = abs (Ac * xi); # Oettli-Prager inequality, left side
+oeprr = Delta * abs (xi); # Oettli-Prager inequality, right side
+if (all (oeprl.sup <= oeprr.inf)) # Oettli-Prager inequality satisfied, singularity of A verified
+ y = (Ac * xi) ./ oeprr;
+ y(isempty (y)) = infsup (1, 1); # case of both numerator and denominator being zero
+ As = Ac - (diag (y) * Delta) * diag (z); # construction of singular As ...
+ As = intersect (As, A); # ... in A
+ if (~any (any (isempty (As)))) # intersection nowhere empty
+ return # with output As
+ endif
+ ## with As of [Empty]'s, but still verified singular (this fact not used here)
+endif
+As = repmat (infsup (), n, n);
+endfunction
+
+
+function z = sgn (x)
+# signum of x for real
+
+n = length (x);
+z = ones (n, 1);
+z(x < 0) = -1;
+endfunction
+
+%!test
+%! A = [1 0 0; 0 1 1; 0 0 1];
+%! assert (vereigvec (A, [1; 0; 0]), 1);
+%! assert (vereigvec (A, [0; 1; 0]), 1);
+%! assert (vereigvec (A, [0; 0; 1]), 0);
+
+%!test
+%! A = magic (3);
+%! [evc, lambda] = vereigvec (A, [1 1 1]);
+%! assert (evc, 1);
+%! assert (lambda == 15);
+%! assert (vereigvec (A, [1; 0; 0]), 0);
+%! assert (vereigvec (A, [0; 1; 0]), 0);
+%! assert (vereigvec (A, [0; 0; 1]), 0);
+
+%!test
+%! A = magic (3) + infsup ("[-5, 5]");
+%! [evc, lambda, As] = vereigvec (A, [1 0 0]);
+%! assert (evc, 1);
+%! assert (lambda == "[3, 13]");
+%! assert (ismember ([8 1 6; 0 2 4; 0 5 -2], As));
+%! assert (max (max (wid (As))) < 1e-14);
diff --git a/inst/verintlinineqs.m b/inst/verintlinineqs.m
new file mode 100644
index 0000000..8de5862
--- /dev/null
+++ b/inst/verintlinineqs.m
@@ -0,0 +1,206 @@
+## Copyright 2007-2008 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from verintlinineqs in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[@var{x}, @var{As}] =} verintlinineqs (@var{A}, @var{b})
+## Verified strong solution of interval linear inequalities.
+##
+## For a rectangular interval matrix @var{A} and a matching interval
+## vector @var{b}, this function either computes a strong solution @var{x} to
+## @display
+## @var{A} * @var{x} @leq{} b
+## @end display
+## (i. e., a real vector @var{x} verified to satisfy
+## @var{Ao} * @var{x} @leq{} @var{bo} for each @var{Ao} in @var{A} and @var{bo}
+## in @var{b}), or verifies nonexistence of such a solution, or yields no
+## verified result:
+##
+## @table @asis
+## @item ~isnan (@var{x})
+## @var{x} is a verified strong solution of @var{A} * @var{x} @leq{} @var{b},
+## and @var{As} is an interval matrix of empty intervals,
+##
+## @item ~isempty (@var{As})
+## @var{As} is a very right (“almost thin”) interval matrix verified to contain
+## a real matrix @var{Ao} such that the system
+## @var{Ao} * @var{x} @leq{} @var{b}.inf has no solution (which proves that no
+## strong solution exists), and @var{x} is a vector of NaNs,
+##
+## @item otherwise
+## no verified output.
+## @end table
+##
+## A theoretical result [1] asserts that if each system
+## @var{Ao} * @var{x} @leq{} @var{bo}, where @var{Ao} in @var{A} and @var{bo}
+## in @var{b}, has a solution (depending generally on @var{Ao} and @var{bo}),
+## then there exists a vector @var{x} satisfying
+## @var{Ao} * @var{x} @leq{} @var{bo} for @emph{each} @var{Ao} in @var{A} and
+## @var{bo} in @var{b}. Such a vector @var{x} is called a strong solution of
+## the system @var{A} * @var{x} @leq{} @var{b}.
+##
+## [1] J. Rohn and J. Kreslova, Linear Interval Inequalities, LAMA 38 (1994),
+## 79–82.
+##
+## Based on Section 2.13 in M. Fiedler, J. Nedoma, J. Ramik, J. Rohn and
+## K. Zimmermann, Linear Optimization Problems with Inexact Data,
+## Springer-Verlag, New York 2006.
+##
+## This work was supported by the Czech Republic National Research Program
+## “Information Society”, project 1ET400300415.
+##
+## @seealso{}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2007-02-22
+
+function [x, As] = verintlinineqs (A, b)
+
+if (nargin ~= 2)
+ print_usage ();
+ return
+endif
+
+b = vec (b);
+[m, n] = size (A);
+x = nan (n, 1);
+As = repmat (infsup (), m, n);
+
+if (m ~= length (b))
+ error ("verintlinineqs: nonconformant arguments")
+endif
+
+if (not (isa (A, "infsup"))) # allows for real input
+ A = infsup (A);
+endif
+
+if (not (isa (b, "infsup")))
+ b = infsup (b);
+endif
+
+## the bounds
+Al = inf (A);
+Au = sup (A);
+bl = inf (b);
+
+## matrix of the system; see Fiedler et al., (2.89)
+Ao = [Au -Al];
+
+## finds verified nonnegative solution of Ao*x<=bl
+[xx, y] = verlinineqnn (Ao, bl);
+
+if (not (isnan (xx(1)))) # solution found
+ xxi = infsup (xx);
+ xxi = xxi(1:n) - xxi(n+1:2*n); # interval vector of the original size
+
+ ## noninterval vectors; candidates for strong solution
+ X = [xx(1:n)-xx(n+1:2*n) xxi.inf xxi.mid xxi.sup];
+
+ [Ac, Delta] = rad (A);
+ [bc, delta] = rad (b);
+
+ for x1 = X
+ left = Ac * infsup (x1) - bc;
+ right = -Delta * infsup (abs(x1)) - delta;
+
+ if (all (left.sup <= right.inf))
+ ## Fiedler et al., (2.94); strong solution found
+ x = x1; # verified strong solution
+ return
+ endif
+ endfor
+
+ ## no result
+ return
+end
+
+if (not (isnan (y(1)))) # Ao*x<=bl verified not to have a nonnegative solution
+ As = vernull(A', y); # Fiedler et al., proof of Thm. 2.23
+ if (not (isempty (As(1,1))))
+ As = As'; # Ao*x<=bl unsolvable for some Ao in As which is a part of A
+ return
+ endif
+
+ ## no result
+ return
+end
+
+## no result
+endfunction
+
+function As = vernull (A, x)
+# VERNULL Verified matrix in A having x as a null vector.
+#
+# ~isempty(As(1,1)): As is a tight interval matrix verified to be a part of A
+# and to contain a thin matrix Ao having x as a null vector
+# (i.e., Ao*x=0),
+#
+# isempty(As(1,1)): no result.
+#
+
+[m, n] = size (A);
+p = length (x);
+
+As = repmat (infsup (), m, n);
+assert (n == p);
+assert (nargin == 2);
+assert (isa (A, "infsup"));
+assert (not (isa (x, "infsup")));
+assert (all (not (isnan (x))));
+
+z = sgn (x);
+xi = infsup (x);
+
+[Ac, Delta] = rad (A);
+oeprl = abs (Ac * xi); % Oettli-Prager inequality, left side
+oeprr = Delta * abs (xi); % Oettli-Prager inequality, right side
+if (all (oeprl.sup <= oeprr.inf)) % Oettli-Prager inequality satisfied, x verified null vector of A
+ y = (Ac * xi) ./ oeprr;
+ y(isempty (y)) = 1; % case of both numerator and denominator being zero
+ As = Ac - (diag (y) * Delta) * diag(z); % construction of As ...
+ As = intersect (As, A); % ... in A
+ if (not (any (any (isempty(As))))) % intersection nowhere empty
+ return % with output As
+ else
+ As = repmat (infsup (), m, n);
+ return % with As of [Empty]'s, but x still verified null vector of A
+ endif
+endif
+
+endfunction
+
+function z = sgn (x)
+# signum of x for real
+
+n = length (x);
+z = ones (n, 1);
+z(x < 0) = -1;
+endfunction
+
+%!test
+%! A = [-2, -3; -2, -1];
+%! b = [-1500; -1000];
+%! [x, As] = verintlinineqs (A, b);
+%! assert (x, [375; 250], 1e-9);
+%! assert (all (x >= [375; 250]));
+%! assert (all (all (isempty (As))));
diff --git a/inst/verinvnonneg.m b/inst/verinvnonneg.m
new file mode 100644
index 0000000..2df1553
--- /dev/null
+++ b/inst/verinvnonneg.m
@@ -0,0 +1,132 @@
+## Copyright 2008 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from verinvnonneg in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[nonneg, As] =} verinvnonneg (@var{A})
+## Verified nonnegative invertibility of an interval matrix.
+##
+## For a square interval (or real) matrix @var{A}, this function verifies
+## inverse nonnegativity of @var{A}, or not-inverse-nonnegativity of @var{A},
+## or yields no verified result:
+##
+## @table @asis
+## @item @var{nonneg} = 1
+## @var{A} verified inverse nonnegative,
+##
+## @item @var{nonneg} = 0
+## @var{A} verified not to be inverse nonnegative; @var{As} is a matrix in
+## @var{A} (always one of the two bounds) which is verified not to be inverse
+## nonnegative,
+##
+## @item @var{nonneg = -1}
+## no verified result.
+## @end table
+##
+## Based on the result by Kuttler, Math. of Computation 1971; see also J. Rohn,
+## A Handbook of Results on Interval Linear Problems, posted at
+## @url{http://www.cs.cas.cz/~rohn}, Section 3.9.
+##
+## This work was supported by the Czech Republic National Research
+## Program “Information Society”, project 1ET400300415.
+##
+## @seealso{inv}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2008
+
+function [nonneg, As] = verinvnonneg (A)
+
+if (nargin ~= 1)
+ print_usage ();
+ return
+endif
+
+[m, n] = size (A);
+nonneg = -1;
+As = repmat (infsup, m, n);
+
+if (m ~= n)
+ error ("verinvnonneg: matrix not square");
+endif
+
+if (~isa (A, "infsup"))
+ A = infsup (A); # allows for real input
+endif
+
+if (any (isempty (A)(:)))
+ # matrix is empty interval: no inverse
+ nonneg = 0;
+ return
+endif
+
+Al = infsup (inf (A), max (-realmax, inf (A)));
+Bl = inv (Al);
+if (all (all (issingleton (A))))
+ Au = Al;
+ Bu = Bl;
+else
+ Au = infsup (min (realmax, sup (A)), sup (A));
+ Bu = inv (Au);
+endif
+
+if (any ((isempty (Bl) | isempty (Bu))(:)))
+ # empty inverse: no inverse exists
+ nonneg = 0;
+ return
+endif
+if (all (all (Bl.inf >= 0)) && all (all (Bu.inf >= 0)))
+ # verified inverse nonnegative; Kuttler, Math. of Comp. 1971
+ nonneg = 1;
+ return
+endif
+if (any ((Bl.sup < 0)(:)))
+ nonneg = 0;
+ As=Al; # A.inf verified not inverse nonnegative
+ return
+endif
+if (any ((Bu.sup < 0)(:)))
+ nonneg = 0;
+ As = Au; # A.sup verified not inverse nonnegative
+ return
+end
+endfunction
+
+%!assert (verinvnonneg (eye (1)), 1)
+%!assert (verinvnonneg (eye (2)), 1)
+%!assert (verinvnonneg (eye (3)), 1)
+%!assert (verinvnonneg (eye (4)), 1)
+%!assert (verinvnonneg (eye (5)), 1)
+%!assert (verinvnonneg (eye (6)), 1)
+%!assert (verinvnonneg (eye (7)), 1)
+%!assert (verinvnonneg (eye (8)), 1)
+%!assert (verinvnonneg (zeros (1)), 0)
+%!assert (verinvnonneg (zeros (2)), 0)
+%!assert (verinvnonneg (zeros (3)), 0)
+%!assert (verinvnonneg (zeros (4)), 0)
+%!assert (verinvnonneg (zeros (5)), 0)
+%!assert (verinvnonneg (zeros (6)), 0)
+%!assert (verinvnonneg (zeros (7)), 0)
+%!assert (verinvnonneg (zeros (8)), 0)
+%!assert (verinvnonneg (magic (7)), 0)
+%!assert (verinvnonneg (infsup (-inf, inf)), -1)
diff --git a/inst/verlinineqnn.m b/inst/verlinineqnn.m
new file mode 100644
index 0000000..1ee802a
--- /dev/null
+++ b/inst/verlinineqnn.m
@@ -0,0 +1,172 @@
+## Copyright 2008 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from verlinineqnn in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[@var{x}, @var{y}] =} verlinineqnn (@var{A}, @var{b})
+## Verified nonnegative solution of a system of linear inequalities.
+##
+## For a rectangular real matrix @var{A} and a matching real vector @var{b},
+## this function either computes a verified solution of the system of linear
+## inequalities
+## @display
+## @var{A} * @var{x} @leq{} b, @*
+## @var{x} @geq{} 0,
+## @end display
+## or verifies nonexistence of a solution, or yields no verified result.
+##
+## Possible outputs:
+## @itemize @bullet
+## @item
+## Either @var{x} is a real vector verified to satisfy both inequalities and
+## @var{y} is a vector of NaN's,
+##
+## @item
+## or @var{y} is a real vector verified to satisfy
+## @display
+## @var{A}' * @var{y} @geq{} 0, @*
+## @var{y} @geq{} 0, @*
+## @var{b}' * @var{y} @leq{} -1
+## @end display
+## (which by Farka's lemma implies nonexistence of a solution to the original
+## inequalities), and @var{x} is a vector of NaN's,
+##
+## @item
+## or both @var{x} and @var{y} are NaN's. In this case no verified result could
+## be found.
+## @end itemize
+##
+## This work was supported by the Czech Republic National Research Program
+## “Information Society”, project 1ET400300415.
+##
+## @seealso{linprog}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2008-01-05
+
+function [x, y] = verlinineqnn (A, b)
+
+if (nargin ~= 2)
+ print_usage ();
+ return
+endif
+
+b = b(:);
+[m, n] = size (A);
+
+if (m ~= length(b) || ~isreal (A) || ~isreal (b))
+ error ("verlinineqnn: Parameters must be real and of matching size");
+endif
+
+if (~issparse (A))
+ A = sparse (A);
+endif
+x = verlinineqnninner (A, b);
+if (~isnan (x(1)) || nargout < 2)
+ y = nan (m, 1);
+ return
+endif
+
+Ao = [-A'; -speye(m, m); b'];
+bo = [zeros(1, n + m), -1]';
+y = verlinineqnninner (Ao, bo);
+endfunction
+
+
+function x = verlinineqnninner (A, b)
+## inner subroutine of verlinineqnn
+## finds a verified solution to A*x<=b, x>=0, or yields a vector of NaN's
+## additive and multiplicative perturbation used
+
+[m, n] = size (A);
+ep = max (1e-10, max ([m n 100]) * max ([norm(A, inf) norm(b, inf)]) * eps);
+e = ones (n, 1);
+Ao = [A; -speye(n, n)];
+bo = [b' zeros(n, 1)']'; # Ao*x<=bo is equivalent to A*x<=b, x>=0
+
+# additive perturbation
+bo = bo - ep .* ones (m + n, 1);
+x = lpprocedure (e, Ao, bo); # solves min e'*x subject to Ao*x<=bo
+
+left = A * infsup (x); # interval quantity
+if (all (left.sup <= b) && all (x >= 0))
+ # verified solution
+ return
+endif
+
+# multiplicative perturbation
+bo = bo - ep .* abs (bo) - ep .* (bo == 0);
+x = lpprocedure (e, Ao, bo); # solves min e'*x subject to Ao*x<=bo
+
+left = A * infsup (x); # interval quantity
+if (all (left.sup <= b) && all (x >= 0))
+ # verified solution
+ return
+endif
+
+# no verified solution
+x = nan (n, 1);
+endfunction
+
+
+function x = lpprocedure (c, A, b)
+## solves linear programming problem min c'*x subject to A*x<=b
+## x should be always assigned (unverified optimal solution, or something else;
+## the result is checked afterwards)
+## placed separately so that a different linear programming procedure might
+## also be used
+
+persistent GLP_MSG_OFF = 0;
+
+[m, n] = size (A);
+x = glpk (c, A, b, ...
+ [], [], ... # 0 <= x <= inf
+ repmat ("U", 1, m), ... # inequality constraint with an upper bound b
+ repmat ("C", 1, n), ... # continuous variable x
+ 1, ... # minimization
+ struct ("msglev", GLP_MSG_OFF));
+
+endfunction
+
+%!test
+%! A = [-2, -3; -2, -1];
+%! b = [-1500; -1000];
+%! [x, y] = verlinineqnn (A, b);
+%! assert (x, [375; 250], 1e-9);
+%! assert (all (x >= [375; 250]));
+%! assert (isnan (y));
+
+%!test
+%! A = [1, 2; 3, 4];
+%! b = [-1; 0];
+%! [x, y] = verlinineqnn (A, b);
+%! assert (y, [1; 0], 1e-9);
+%! assert (all (y >= [1; 0]));
+%! assert (isnan (x));
+
+%!test
+%! A = [1, 2; 3, 4];
+%! b = [1; 1];
+%! [x, y] = verlinineqnn (A, b);
+%! assert (x, [0; 0]);
+%! assert (isnan (y));
diff --git a/inst/verlinprog.m b/inst/verlinprog.m
new file mode 100644
index 0000000..7d38904
--- /dev/null
+++ b/inst/verlinprog.m
@@ -0,0 +1,281 @@
+## Copyright 2007 Jiří Rohn
+## Copyright 2016 Oliver Heimlich
+##
+## This program is derived from verlinprog in VERSOFT, published on
+## 2016-07-26, which is distributed under the terms of the Expat license,
+## a.k.a. the MIT license. Original Author is Jiří Rohn. Migration to Octave
+## code has been performed by Oliver Heimlich.
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @documentencoding UTF-8
+## @deftypefun {[@var{flag}, @var{x}, @var{y}, @var{h}] =} verlinprog (@var{A}, @var{b}, @var{c})
+## Verified linear programming.
+##
+## For a real matrix @var{A} (full or sparse) and matching real vectors
+## @var{b}, @var{c}, this function either computes verified optimal solution
+## @var{x}, verified dual optimal solution @var{y} and verified optimal value
+## @var{h} of the linear programming problem
+## @display
+## min @var{c}' * @var{x} subject to @var{A} * @var{x} = @var{b}, x @geq{} 0,
+## @end display
+## or verifies (in)feasibility, or verifies unboundedness, or yields no
+## verified result. The respective outcome is always described verbally in the
+## variable @var{flag}.
+##
+## Possible values of @var{flag}:
+## @table @option
+## @item verified optimum
+## @var{x} is verified to enclose a primal optimal solution,
+## @var{y} is verified to enclose a dual optimal solution,
+## @var{h} is verified to enclose the optimal value,
+##
+## @item verified unbounded
+## @var{x} is verified to enclose a primal feasible solution @var{xo}, and
+## @var{y} is verified to enclose a vector @var{yo} such that the objective
+## tends to -Inf along the feasible half-line
+## @{@var{xo} + @var{t} * @var{yo} | @var{t} @geq{} 0@},
+## @var{h} is empty,
+##
+## @item verified feasible
+## @var{x} is verified to enclose a primal feasible solution
+## (neither optimality nor unboundedness could be verified),
+## @var{y}, @var{h} are empty,
+##
+## @item verified infeasible
+## @var{y} is verified to enclose a Farkas vector @var{yo} satisfying
+## @var{A}' * @var{yo} @geq{} 0, @var{b}' * @var{yo} < 0
+## (whose existence proves primal infeasibility),
+## @var{x}, @var{h} are empty,
+##
+## @item no verified result
+## @var{x}, @var{y}, and @var{h} are empty (no verified result could be found).
+## @end table
+##
+## Complexity: The algorithm solves at most four linear programming problems
+## (independently of the size of the original problem) and uses a verification
+## procedure which runs approximately in O(@var{m}³) time, where
+## @var{m} = rows (@var{A}).
+##
+## This work was supported by the Czech Republic National Research
+## Program “Information Society”, project 1ET400300415.
+## @seealso{linprog}
+## @end deftypefun
+
+## Author: Jiří Rohn
+## Keywords: interval
+## Created: 2007
+
+function [flag, x, y, h] = verlinprog (A, b, c)
+
+if (nargin ~= 3)
+ print_usage ();
+ return
+endif
+
+b = b(:); c = c(:);
+[m, n] = size(A);
+p = length (b); q = length (c);
+
+flag = "no verified result";
+x = repmat (infsup, n, 1);
+y = repmat (infsup, m, 1);
+h = infsup;
+
+if (~(m == p && n == q) || (m > n))
+ error ("verlinprog: sizes do not match");
+endif
+if (~isreal (A) || ~isreal (b) || ~isreal (c))
+ error("verlinprog: data not real");
+endif
+if issparse (b)
+ b = full (b);
+end
+if issparse (c)
+ c = full (c);
+end
+
+# verifying infeasibility
+yi = verinfeas (A, b);
+if (~isempty(yi(1))) # verified Farkas vector found
+ y = yi;
+ flag = "verified infeasible";
+ return
+endif
+
+# verifying feasibility
+xf = veropt (A, b, ones (n, 1));
+if (isempty (xf(1))) # verified feasible solution not found
+ flag = "no verified result";
+ return
+endif
+
+# verifying unboundedness
+yu = verunbound (A, c);
+if (~isempty (yu(1))) # verified descent direction found
+ x = xf;
+ y = yu;
+ flag = "verified unbounded";
+ return
+endif
+
+# verifying optimality
+[xo, B, N] = veropt (A, b, c);
+if (isempty (xo(1))) % verified feasible primal solution with basis B not found
+ x = xf; # previous feasible solution outputted
+ flag = "verified feasible";
+ return
+endif
+
+AB = A(:, B);
+if (issparse (AB))
+ AB = full (AB); # only the square submatrix taken full
+endif
+yB = mldivide (infsup (AB'), infsup (c(B)));
+if (isempty (yB(1))) # verified feasible dual solution not found
+ x = xo; # candidate for optimum outputted as feasible solution
+ flag = "verified feasible";
+ return
+endif
+
+c = infsup (c);
+A = infsup (A);
+crit = c' - yB' * A; # criterial row (dual feasibility)
+crit = crit(N); # nonbasic part of it
+if (~all (crit.inf >= 0)) # verified feasible dual solution not found
+ x = xo; % candidate for optimum outputted as feasible solution
+ flag = "verified feasible";
+ return
+endif
+
+# verified quantities # verified primal and dual feasible solutions found
+x = xo; # x is a verified primal optimal solution
+y = yB; # y is a verified dual optimal solution
+if (nargout >= 3)
+ h1 = c' * x;
+ h2 = b' * y;
+ h = intersect (h1, h2); # h is a verified optimal value (duality theorem)
+ if (isempty (h))
+ h = h1;
+ end
+endif
+flag = "verified optimum";
+endfunction
+
+
+function [x, B, N] = veropt (A, b, c)
+## B is the "basis index set" of an optimal solution of the LP problem
+## min c'*x subject to A*x=b, x>=0,
+## x is a verified basic feasible solution with this basis
+## N is the set of nonbasic indices
+
+persistent GLP_MSG_OFF = 0;
+[m, n] = size (A);
+x = repmat(infsup, n, 1);
+B = nan (m, 1);
+N = nan (n, 1);
+
+[xopt, ~, exitflag] = glpk (c, A, b, ...
+ [], [], ... # 0 <= x <= inf
+ repmat ("S", 1, m), ... # equality constraints Ax = b
+ repmat ("C", 1, n), ... # continuous variable x
+ 1, ... # minimization
+ struct ("msglev", GLP_MSG_OFF));
+
+if (exitflag ~= 0)
+ return
+endif
+
+[xx, J] = sort (xopt);
+B = J(n - m + 1 : n); # B is set of "basic" indices,
+N = J(1 : n - m); # N of "nonbasic" ones
+
+AB = A(:, B);
+if (issparse (AB))
+ AB = full (AB); # only the square submatrix taken full (because of mldivide)
+endif
+xB = mldivide (infsup (AB), infsup (b));
+if (isempty (xB(1)) || ~all (xB.inf >= 0))
+ # verified "optimal" solution not found
+ return
+endif
+
+# verified "optimal" solution found
+x = infsup (zeros (n, 1));
+x(B) = xB;
+endfunction
+
+
+function y = verinfeas (A, b)
+# y verified to enclose a Farkas vector yo (i.e., satisfying A'*yo>=0, b'*yo<0)
+# its existence implies infeasibility of A*x=b
+
+[m, n] = size (A);
+y = repmat(infsup, m, 1);
+ep = max (1e-08, max ([m n 100]) * max ([norm(A, inf) norm(b, inf)]) * eps);
+Afv = [A' -A' -eye(n) zeros(n,1); # Afv is (n+1)x(2*m+n+1)
+ b' -b' zeros(1,n) 1];
+bfv = [zeros(n, 1)' -1]'; # bfv is (n+1)x1
+
+# perturbation to compensate roundoff errors (so that A'*y>=0)
+bfv = bfv + ep * [ones(1, n) -1]';
+yf = veropt (Afv, bfv, ones (2 * m + n + 1, 1)); % system: A'*y>=0, b'*y<=-1, y written as y=y1-y2
+if (~isempty (yf(1)))
+ yf = mid (yf);
+ y1 = yf(1 : m);
+ y2 = yf(m + 1 : 2 * m);
+ yf = y1 - y2; # would-be Farkas vector
+ A = infsup (A);
+ b = infsup (b);
+ yf = infsup (yf); # (i.e., should satisfy A'*y>=0, b'*y<0)
+ alpha = A' * yf;
+ beta = b' * yf;
+ if (all (alpha.inf >= 0)) && (beta.sup < 0)
+ # infeasibility verified
+ y=yf; # Farkas vector outputted
+ endif
+endif
+endfunction
+
+
+function y = verunbound (A, c)
+# y verified to enclose a vector yo satisfying A*yo=0, yo>=0, c'*yo<=-1
+# under feasibility its existence implies unboundedness
+
+[m, n] = size (A);
+y = repmat (infsup, n, 1);
+Aunb = [A zeros(m, 1); # Aunb is (m+1)x(n+1)
+ c' 1];
+bunb = [zeros(1, m) -1]'; # bunb is (m+1)x1
+yunb = veropt (Aunb, bunb, ones (n + 1, 1)); # yunb is (n+1)x1
+if (~isempty (yunb(1)))
+ # y satisfies A*y=0, y>=0, c'*y=-1
+ y = yunb(1:n);
+ return
+endif
+endfunction
+
+%!test
+%! A = [-2, -3; -2, -1];
+%! b = [-1500, -1000];
+%! c = [1; 1];
+%! [flag, x, y, h] = verlinprog (A, b, c);
+%! assert (flag, "verified optimum");
+%! assert (ismember ([375; 250], x));
+%! assert (wid (x) < 1e-12);
+%! assert (ismember ([-0.25; -0.25], y));
+%! assert (wid (y) < 1e-16);
+%! assert (ismember (625, h));
+%! assert (wid (h) < 1e-12);
diff --git a/src/mpfr_function_d.cc b/src/mpfr_function_d.cc
index 2e1d485..1409395 100644
--- a/src/mpfr_function_d.cc
+++ b/src/mpfr_function_d.cc
@@ -1,16 +1,16 @@
/*
Copyright 2015-2016 Oliver Heimlich
-
+
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
@@ -40,7 +40,7 @@ void evaluate (
{
mpfr_t mp;
mpfr_init2 (mp, BINARY64_PRECISION);
-
+
const octave_idx_type n = arg1.numel ();
for (octave_idx_type i = 0; i < n; i ++)
{
@@ -48,7 +48,7 @@ void evaluate (
(*f) (mp, mp, rnd);
arg1.elem (i) = mpfr_get_d (mp, rnd);
}
-
+
mpfr_clear (mp);
}
@@ -62,20 +62,20 @@ void evaluate (
mpfr_t mp1, mp2;
mpfr_init2 (mp1, BINARY64_PRECISION);
mpfr_init2 (mp2, BINARY64_PRECISION);
-
+
// arg1 shall contain the result and must be resized
if (arg1.rows () == 1 && arg2.rows () != 1)
- arg1 = arg1.index (idx_vector (ColumnVector (arg2.rows (), 1.0)),
+ arg1 = arg1.index (idx_vector (ColumnVector (arg2.rows (), 1.0)),
idx_vector::colon);
if (arg1.columns () == 1 && arg2.columns () != 1)
arg1 = arg1.index (idx_vector::colon,
idx_vector (RowVector (arg2.columns (), 1.0)));
-
+
const octave_idx_type n = arg1.rows ();
const octave_idx_type m = arg1.columns ();
const bool broadcast_r = n != 1 && arg2.rows () == 1;
const bool broadcast_c = m != 1 && arg2.columns () == 1;
-
+
for (octave_idx_type i = 0; i < n; i ++)
for (octave_idx_type j = 0; j < m; j ++)
{
@@ -90,7 +90,7 @@ void evaluate (
(*f) (mp1, mp1, mp2, rnd);
arg1.elem (i, j) = mpfr_get_d (mp1, rnd);
}
-
+
mpfr_clear (mp1);
mpfr_clear (mp2);
}
@@ -107,11 +107,11 @@ void evaluate (
mpfr_init2 (mp1, BINARY64_PRECISION);
mpfr_init2 (mp2, BINARY64_PRECISION);
mpfr_init2 (mp3, BINARY64_PRECISION);
-
+
bool scalar1 = arg1.numel () == 1;
bool scalar2 = arg2.numel () == 1;
bool scalar3 = arg3.numel () == 1;
-
+
if (scalar1)
{
// arg1 shall contain the result and must possibly be resized
@@ -143,7 +143,7 @@ void evaluate (
(*f) (mp1, mp1, mp2, mp3, rnd);
arg1.elem (i) = mpfr_get_d (mp1, rnd);
}
-
+
mpfr_clear (mp1);
mpfr_clear (mp2);
mpfr_clear (mp3);
@@ -157,7 +157,7 @@ void nthroot (
{
mpfr_t mp;
mpfr_init2 (mp, BINARY64_PRECISION);
-
+
const octave_idx_type n = arg1.numel ();
for (octave_idx_type i = 0; i < n; i ++)
{
@@ -165,33 +165,62 @@ void nthroot (
mpfr_root (mp, mp, arg2, rnd);
arg1.elem (i) = mpfr_get_d (mp, rnd);
}
-
+
mpfr_clear (mp);
}
// Evaluate factorial
void factorial (
- Matrix &result, // Result
- const uint64NDArray arg, // Operand
+ Matrix &arg1, // Operand 1 and result
const mpfr_rnd_t rnd)
{
mpfr_t mp;
mpfr_init2 (mp, BINARY64_PRECISION);
- const octave_idx_type n = arg.numel ();
+ const octave_idx_type n = arg1.numel ();
for (octave_idx_type i = 0; i < n; i ++)
{
- // Compilation on 32-bit systems produces ambiguity errors if the
- // type of arg.elem(i) is not defined explicitly
- const uint64_t current_arg = arg.elem (i);
- mpfr_fac_ui (mp, current_arg, rnd);
- result.elem (i) = mpfr_get_d (mp, rnd);
+ if (std::isnan (arg1.elem (i)))
+ continue;
+
+ if (arg1.elem (i) < 2.0)
+ {
+ arg1.elem (i) = 1.0;
+ continue;
+ }
+
+ if (arg1.elem (i) >= 171.0)
+ {
+ // Computation can become hard for large numbers,
+ // thus we can short-circuit here.
+ switch (rnd)
+ {
+ case MPFR_RNDZ:
+ case MPFR_RNDD:
+ arg1.elem (i) = std::numeric_limits <double>::max ();
+ continue;
+ case MPFR_RNDA:
+ case MPFR_RNDU:
+ case MPFR_RNDN:
+ arg1.elem (i) = +INFINITY;
+ continue;
+ default:
+ break;
+ }
+ }
+
+ // The factorial function is defined as the product of all positive
+ // integers less than or equal to n.
+ const double current_arg = floor (arg1.elem (i));
+
+ mpfr_fac_ui (mp, static_cast <unsigned long int> (current_arg), rnd);
+ arg1.elem (i) = mpfr_get_d (mp, rnd);
}
mpfr_clear (mp);
}
-DEFUN_DLD (mpfr_function_d, args, nargout,
+DEFUN_DLD (mpfr_function_d, args, nargout,
"-*- texinfo -*-\n"
"@documentencoding UTF-8\n"
"@defun mpfr_function_d ('acos', @var{R}, @var{X})\n"
@@ -278,7 +307,7 @@ DEFUN_DLD (mpfr_function_d, args, nargout,
print_usage ();
return octave_value_list ();
}
-
+
// Read parameters
const std::string function = args (0).string_value ();
const mpfr_rnd_t rnd = parse_rounding_mode (args (1).scalar_value ());
@@ -305,7 +334,7 @@ DEFUN_DLD (mpfr_function_d, args, nargout,
}
if (error_state)
return octave_value_list ();
-
+
// Choose the function to evaluate
switch (nargin - 2)
{
@@ -349,12 +378,7 @@ DEFUN_DLD (mpfr_function_d, args, nargout,
else if (function == "expm1")
evaluate (arg1, rnd, &mpfr_expm1);
else if (function == "factorial")
- {
- const uint64NDArray argInt = args (2).uint64_array_value ();
- if (error_state)
- return octave_value_list ();
- factorial (arg1, argInt, rnd);
- }
+ factorial (arg1, rnd);
else if (function == "gamma")
evaluate (arg1, rnd, &mpfr_gamma);
else if (function == "gammaln")
@@ -397,7 +421,7 @@ DEFUN_DLD (mpfr_function_d, args, nargout,
return octave_value_list ();
}
break;
-
+
case 2: // binary function
if (function == "atan2")
evaluate (arg1, arg2, rnd, &mpfr_atan2);
@@ -426,7 +450,7 @@ DEFUN_DLD (mpfr_function_d, args, nargout,
return octave_value_list ();
}
break;
-
+
case 3: // ternary function
if (function == "fma")
evaluate (arg1, arg2, arg3, rnd, &mpfr_fma);
diff --git a/src/mpfr_matrix_mul_d.cc b/src/mpfr_matrix_mul_d.cc
index 59a7f2a..c0a8246 100644
--- a/src/mpfr_matrix_mul_d.cc
+++ b/src/mpfr_matrix_mul_d.cc
@@ -154,4 +154,27 @@ DEFUN_DLD (mpfr_matrix_mul_d, args, nargout,
%! [l, u] = mpfr_matrix_mul_d (magic (3), magic (3)', magic (3) + 1, magic (3)' + 1);
%! assert (l, [101, 71, 53; 71, 83, 71; 53, 71, 101]);
%! assert (u, [134, 104, 86; 104, 116, 104; 86, 104, 134]);
+
+%!test;
+%! if (((exist ("__octave_config_info__") && ...
+%! __octave_config_info__.ENABLE_OPENMP) || ...
+%! (not (exist ("__octave_config_info__")) && ...
+%! octave_config_info ("features").OPENMP)) ...
+%! && nproc ("overridable") > 1)
+%! ## OpenMP is enabled and may use more than one thread.
+%! ## We should observe speed-ups by that.
+%! A = vec (magic (2000));
+%! tic;
+%! mpfr_matrix_mul_d (A', A, A', A);
+%! time_per_element = toc;
+%! A = [A A];
+%! tic;
+%! mpfr_matrix_mul_d (A', A, A', A);
+%! time_per_element_parallel = toc / numel (ans);
+%!
+%! ## Ideally, the runtime would be cut in half (at least),
+%! ## however, there is an overhead, so let's be pessimistic and
+%! ## assume that the parallel execution is at least 20% faster.
+%! assert (time_per_element > 1.2 * time_per_element_parallel)
+%! endif
*/
diff --git a/src/mpfr_to_string_d.cc b/src/mpfr_to_string_d.cc
index 5686108..d5a49c7 100644
--- a/src/mpfr_to_string_d.cc
+++ b/src/mpfr_to_string_d.cc
@@ -56,7 +56,10 @@ DEFUN_DLD (mpfr_to_string_d, args, nargout,
"@item exact decimal\n"
"Varying mantissa length with up to 751 places.\n"
"@item exact hexadecimal\n"
- "Mantissa with exactly 13 hexadecimal places.\n"
+ "Fixed mantissa length with 1+13 hexadecimal places. The digit before the "
+ "point is only zero if the number is denormalized. For normalized numbers "
+ "the digit before the point should be 1, but this is not guaranteed and "
+ "depends on the C compiler used.\n"
"@end table"
"\n\n"
"@example\n"
@@ -64,15 +67,15 @@ DEFUN_DLD (mpfr_to_string_d, args, nargout,
"mpfr_to_string_d (-inf, \"exact hexadecimal\", magic (3) / 10)\n"
" @result{}\n"
" @{\n"
- " [1,1] = 0XC.CCCCCCCCCCCD0P-4\n"
- " [2,1] = 0X4.CCCCCCCCCCCCCP-4\n"
- " [3,1] = 0X6.6666666666668P-4\n"
- " [1,2] = 0X1.999999999999AP-4\n"
- " [2,2] = 0X8.0000000000000P-4\n"
- " [3,2] = 0XE.6666666666668P-4\n"
- " [1,3] = 0X9.9999999999998P-4\n"
- " [2,3] = 0XB.3333333333330P-4\n"
- " [3,3] = 0X3.3333333333334P-4\n"
+ " [1,1] = 0x1.999999999999ap-1\n"
+ " [2,1] = 0x1.3333333333333p-2\n"
+ " [3,1] = 0x1.999999999999ap-2\n"
+ " [1,2] = 0x1.999999999999ap-4\n"
+ " [2,2] = 0x1.0000000000000p-1\n"
+ " [3,2] = 0x1.ccccccccccccdp-1\n"
+ " [1,3] = 0x1.3333333333333p-1\n"
+ " [2,3] = 0x1.6666666666666p-1\n"
+ " [3,3] = 0x1.999999999999ap-3\n"
" @}\n"
"@end group\n"
"@end example\n"
@@ -113,7 +116,8 @@ DEFUN_DLD (mpfr_to_string_d, args, nargout,
// particular number.
str_template = "%.16R*g";
else if (format == "exact hexadecimal")
- str_template = "%.13R*A";
+ // We will not use MPFR below!
+ str_template = "%R*a";
else if (format == "exact decimal")
str_template = "%.751R*g";
else
@@ -145,13 +149,106 @@ DEFUN_DLD (mpfr_to_string_d, args, nargout,
for (octave_idx_type i = 0; i < n; i++)
{
mpfr_set_d (mp, x.elem (i), MPFR_RNDZ);
- mpfr_sprintf (buf, str_template.c_str (), rnd, mp);
+ if (format != "exact hexadecimal")
+ {
+ mpfr_sprintf (buf, str_template.c_str (), rnd, mp);
+ }
+ else
+ {
+ // Do not use MPFR for double to hex conversion.
+ //
+ // MPFR would use any of the 16 hex digits before the point, but
+ // IEEE Std 1788-2015 requires the use of either 0 or 1 before the
+ // point, where 1 is used for normal numbers and 0 is used for
+ // subnormal numbers. MPFR doesn't handle subnormal numbers.
+
+ // C99's floating-point conversion will use 0 before the point for
+ // subnormal numbers and non-zero before the point for normal
+ // numbers.
+ // https://www.gnu.org/software/libc/manual/html_node/Floating_002dPoint-Conversions.html
+ //
+ // However, it is not guaranteed that only 1 is used for normal
+ // numbers before the point (although this is the case for my gcc
+ // version 4.9.2).
+ //
+ // Also sprintf (... "%.13a" ...) is completely broken on Windows,
+ // where it either returns wrong values, or creates an infinite loop.
+
+ long exponent;
+ double mantissa = mpfr_get_d_2exp (&exponent, mp, rnd);
+
+ if (mpfr_number_p (mp) == 0)
+ {
+ // NaN or infinity
+ if (std::isnan (mantissa))
+ {
+ // The NaN returned by MPFR might produce a sign,
+ // so let's use the implementation's default NaN.
+ mantissa = std::numeric_limits <double>::quiet_NaN ();
+ }
+
+ sprintf (buf, "%f", mantissa);
+ }
+ else
+ {
+ // Use normal representation of numbers 1.xxx * 2 ^ e
+ // with hidden mantissa bit before the point
+ if (mantissa != 0.0)
+ {
+ exponent --;
+ mantissa *= 2.0; // 1.0 <= mantissa < 2.0
+ }
+ // Make subnormal numbers use the exponent -1022
+ if (exponent < std::numeric_limits <double>::min_exponent)
+ {
+ mantissa /= std::pow (2.0,
+ std::numeric_limits
+ <double>::min_exponent - 1
+ - exponent);
+ exponent = std::numeric_limits <double>::min_exponent - 1;
+ }
+
+ // Extract sign
+ bool sign = std::signbit (mantissa);
+ mantissa = std::abs (mantissa);
+
+ // Extract hidden bit
+ bool hiddenbit = (mantissa >= 1.0);
+ if (hiddenbit)
+ mantissa -= 1.0;
+
+ // shift mantissa by 32 bits to format the first part
+ // sprintf (... "%x" ...) requires an unsigned 4-byte int
+ mantissa *= std::pow (2.0, sizeof (uint32_t) * 8);
+ uint32_t first_part = static_cast <uint32_t> (mantissa);
+
+ // remove first mantissa part
+ mantissa -= first_part;
+
+ // shift mantissa by remaining 20 bits such that
+ // it is an integer
+ mantissa *= std::pow (2.0,
+ std::numeric_limits
+ <double>::digits - 1 - 32);
+ uint32_t second_part = static_cast <uint32_t> (mantissa);
+
+ // Format hexadecimal number from individual parts
+ sprintf (buf, "%s0x%u.%08x%05xp%+d",
+ sign ? "-" : "",
+ static_cast <uint8_t> (hiddenbit),
+ first_part, second_part,
+ static_cast <int32_t> (exponent));
+ }
+ }
+
str.elem (i) = buf;
if (format == "decimal")
{
if (x.elem (i) != 0.0)
{
// Precision 16 might not be enough
+ // Note: mpfr_sprintf does not set the inexact flag, so we must
+ // check for precision loss ourself.
mpfr_nexttoward (mp, zero);
mpfr_sprintf (buf, str_template.c_str (), rnd, mp);
mpfr_set_d (mp, x.elem (i), MPFR_RNDZ);
@@ -187,4 +284,12 @@ DEFUN_DLD (mpfr_to_string_d, args, nargout,
%! [s, isexact] = mpfr_to_string_d (-inf, "decimal", .1);
%! assert (s, {"0.1"});
%! assert (isexact, false);
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", inf), {"inf"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", -inf), {"-inf"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", nan), {"nan"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", 0), {"0x0.0000000000000p+0"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", 2), {"0x1.0000000000000p+1"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", -1), {"-0x1.0000000000000p+0"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", pow2 (-1022)), {"0x1.0000000000000p-1022"});
+%!assert (mpfr_to_string_d (0, "exact hexadecimal", pow2 (-1074)), {"0x0.0000000000001p-1022"});
*/
--
Alioth's /home/groups/pkg-octave/bin/git-commit-notice on /srv/git.debian.org/git/pkg-octave/octave-interval.git
More information about the Pkg-octave-commit
mailing list