1 USING: accessors combinators fry kernel literals math math.intervals
2 math.intervals.private math.order math.statistics random sequences
3 sequences.deep tools.test vocabs ;
4 IN: math.intervals.tests
6 { empty-interval } [ 2 2 (a,b) ] unit-test
8 { empty-interval } [ 2 2.0 (a,b) ] unit-test
10 { empty-interval } [ 2 2 [a,b) ] unit-test
12 { empty-interval } [ 2 2 (a,b] ] unit-test
14 { empty-interval } [ 3 2 [a,b] ] unit-test
16 { T{ interval f { 1 t } { 2 t } } } [ 1 2 [a,b] ] unit-test
18 { T{ interval f { 1 t } { 2 f } } } [ 1 2 [a,b) ] unit-test
20 { T{ interval f { 1 f } { 2 f } } } [ 1 2 (a,b) ] unit-test
22 { T{ interval f { 1 f } { 2 t } } } [ 1 2 (a,b] ] unit-test
24 { T{ interval f { 1 t } { 1 t } } } [ 1 [a,a] ] unit-test
26 { T{ interval f { 0 t } { 42 t } } } [ 42 [0,b] ] unit-test
28 { T{ interval f { 0 t } { 42 f } } } [ 42 [0,b) ] unit-test
30 ! Not sure how to handle NaNs yet...
31 ! [ 1 0/0. [a,b] ] must-fail
32 ! [ 0/0. 1 [a,b] ] must-fail
34 { t } [ { 3 t } { 3 f } endpoint< ] unit-test
35 { t } [ { 2 f } { 3 f } endpoint< ] unit-test
36 { f } [ { 3 f } { 3 t } endpoint< ] unit-test
37 { t } [ { 4 f } { 3 t } endpoint> ] unit-test
38 { f } [ { 3 f } { 3 t } endpoint> ] unit-test
40 { empty-interval } [ 1 2 [a,b] empty-interval interval+ ] unit-test
42 { empty-interval } [ empty-interval 1 2 [a,b] interval+ ] unit-test
45 1 2 [a,b] -3 3 [a,b] interval+ -2 5 [a,b] =
49 1 2 [a,b] -3 3 (a,b) interval+ -2 5 (a,b) =
52 { empty-interval } [ 1 2 [a,b] empty-interval interval- ] unit-test
54 { empty-interval } [ empty-interval 1 2 [a,b] interval- ] unit-test
57 1 2 [a,b] 0 1 [a,b] interval- 0 2 [a,b] =
60 { empty-interval } [ 1 2 [a,b] empty-interval interval* ] unit-test
62 { empty-interval } [ empty-interval 1 2 [a,b] interval* ] unit-test
65 1 2 [a,b] 0 4 [a,b] interval* 0 8 [a,b] =
69 1 2 [a,b] -4 4 [a,b] interval* -8 8 [a,b] =
73 1 2 [a,b] -0.5 0.5 [a,b] interval* -1.0 1.0 [a,b] =
77 1 2 [a,b] -0.5 0.5 (a,b] interval* -1.0 1.0 (a,b] =
81 -1 1 [a,b] -1 1 (a,b] interval* -1 1 [a,b] =
84 { t } [ 1 2 [a,b] dup empty-interval interval-union = ] unit-test
86 { t } [ 1 2 [a,b] empty-interval over interval-union = ] unit-test
89 0 1 (a,b) 0 1 [a,b] interval-union 0 1 [a,b] =
93 0 1 (a,b) 1 2 [a,b] interval-union 0 2 (a,b] =
97 0 1 (a,b) 0 1 [a,b] interval-intersect 0 1 (a,b) =
100 { empty-interval } [ 0 5 [a,b] -1 [a,a] interval-intersect ] unit-test
102 { empty-interval } [ 0 5 (a,b] 0 [a,a] interval-intersect ] unit-test
104 { empty-interval } [ empty-interval -1 [a,a] interval-intersect ] unit-test
106 { empty-interval } [ 0 5 (a,b] empty-interval interval-intersect ] unit-test
109 0 1 (a,b) full-interval interval-intersect 0 1 (a,b) =
113 empty-interval empty-interval interval-subset?
117 empty-interval 0 1 [a,b] interval-subset?
121 0 1 (a,b) 0 1 [a,b] interval-subset?
125 full-interval -1/0. 1/0. [a,b] interval-subset?
129 -1/0. 1/0. [a,b] full-interval interval-subset?
133 full-interval 0 1/0. [a,b] interval-subset?
137 0 1/0. [a,b] full-interval interval-subset?
141 0 0 1 (a,b) interval-contains?
145 0.5 0 1 (a,b) interval-contains?
149 1 0 1 (a,b) interval-contains?
152 { empty-interval } [ -1 1 (a,b) empty-interval interval/ ] unit-test
154 { t } [ 0 0 331 [a,b) -1775 -953 (a,b) interval/ interval-contains? ] unit-test
156 { t } [ -1 1 (a,b) -1 1 (a,b) interval/ [-inf,inf] = ] unit-test
158 { t } [ -1 1 (a,b) 0 1 (a,b) interval/ [-inf,inf] = ] unit-test
160 "math.ratios.private" lookup-vocab [
162 -1 1 (a,b) 0.5 1 (a,b) interval/ -2.0 2.0 (a,b) =
166 { f } [ empty-interval interval-singleton? ] unit-test
168 { t } [ 1 [a,a] interval-singleton? ] unit-test
170 { f } [ 1 1 [a,b) interval-singleton? ] unit-test
172 { f } [ 1 3 [a,b) interval-singleton? ] unit-test
174 { f } [ 1 1 (a,b) interval-singleton? ] unit-test
176 { 2 } [ 1 3 [a,b) interval-length ] unit-test
178 { 0 } [ empty-interval interval-length ] unit-test
180 { t } [ 0 5 [a,b] 5 [a,a] interval<= ] unit-test
182 { incomparable } [ empty-interval 5 [a,a] interval< ] unit-test
184 { incomparable } [ 5 [a,a] empty-interval interval< ] unit-test
186 { incomparable } [ 0 5 [a,b] 5 [a,a] interval< ] unit-test
188 { t } [ 0 5 [a,b) 5 [a,a] interval< ] unit-test
190 { f } [ 0 5 [a,b] -1 [a,a] interval< ] unit-test
192 { incomparable } [ 0 5 [a,b] 1 [a,a] interval< ] unit-test
194 { t } [ -1 1 (a,b) -1 [a,a] interval> ] unit-test
196 { t } [ -1 1 (a,b) -1 [a,a] interval>= ] unit-test
198 { f } [ -1 1 (a,b) -1 [a,a] interval< ] unit-test
200 { f } [ -1 1 (a,b) -1 [a,a] interval<= ] unit-test
202 { t } [ -1 1 (a,b] 1 [a,a] interval<= ] unit-test
204 { t } [ -1 1 (a,b] 1 2 [a,b] interval<= ] unit-test
206 { incomparable } [ -1 1 (a,b] empty-interval interval>= ] unit-test
208 { incomparable } [ empty-interval -1 1 (a,b] interval>= ] unit-test
210 { incomparable } [ -1 1 (a,b] 1 2 [a,b] interval>= ] unit-test
212 { incomparable } [ -1 1 (a,b] 1 2 [a,b] interval> ] unit-test
214 { t } [ -1 1 (a,b] 1 2 (a,b] interval<= ] unit-test
216 { f } [ 0 10 [a,b] 0 [a,a] interval< ] unit-test
218 { f } [ 0 10 [a,b] 0.0 [a,a] interval< ] unit-test
220 { f } [ 0.0 10 [a,b] 0 [a,a] interval< ] unit-test
222 { f } [ 0 10 [a,b] 10 [a,a] interval> ] unit-test
224 { incomparable } [ 0 [a,a] 0 10 [a,b] interval< ] unit-test
226 { incomparable } [ 10 [a,a] 0 10 [a,b] interval> ] unit-test
228 { t } [ 0 [a,a] 0 10 [a,b] interval<= ] unit-test
230 { incomparable } [ 0 [a,a] 0 10 [a,b] interval>= ] unit-test
232 { t } [ 0 10 [a,b] 0 [a,a] interval>= ] unit-test
242 { t } [ full-interval 10 10 [a,b] interval-max 10 1/0. [a,b] = ] unit-test
244 { t } [ full-interval 10 10 [a,b] interval-min -1/0. 10 [a,b] = ] unit-test
246 { t } [ 1 100 [a,b] -1 1 [a,b] interval/i [-inf,inf] = ] unit-test
248 ! Accuracy of interval-mod
249 { t } [ full-interval 40 40 [a,b] interval-mod -40 40 (a,b) interval-subset?
252 ! Interval random tester
253 : random-element ( interval -- n )
254 dup full-interval eq? [
255 drop 32 random-bits 31 2^ -
257 [ ] [ from>> first ] [ to>> first ] tri over - random +
258 2dup swap interval-contains? [
265 : random-interval ( -- interval )
266 10 random 0 = [ full-interval ] [
267 2000 random 1000 - dup 2 1000 random + +
268 1 random zero? [ [ neg ] bi@ swap ] when
277 : unary-ops ( -- alist )
279 { bitnot interval-bitnot }
284 "math.ratios.private" lookup-vocab [
285 { recip interval-recip } suffix
288 : unary-test ( op -- ? )
289 [ random-interval ] dip
290 0 pick interval-contains? over first \ recip eq? and [
293 [ [ random-element ] dip first execute( a -- b ) ] 2keep
294 second execute( a -- b ) interval-contains?
298 [ [ t ] ] dip '[ 8000 [ drop _ unary-test ] all-integers? ] unit-test
301 : binary-ops ( -- alist )
309 { bitand interval-bitand }
310 { bitor interval-bitor }
311 { bitxor interval-bitxor }
315 "math.ratios.private" lookup-vocab [
316 { / interval/ } suffix
319 : binary-test ( op -- ? )
320 [ random-interval random-interval ] dip
321 0 pick interval-contains? over first { / /i mod rem } member? and [
324 [ [ [ random-element ] bi@ ] dip first execute( a b -- c ) ] 3keep
325 second execute( a b -- c ) interval-contains?
329 [ [ t ] ] dip '[ 8000 <iota> [ drop _ binary-test ] all? ] unit-test
332 : comparison-ops ( -- alist )
340 : comparison-test ( op -- ? )
341 [ random-interval random-interval ] dip
342 [ [ [ random-element ] bi@ ] dip first execute( a b -- ? ) ] 3keep
343 second execute( a b -- ? ) dup incomparable eq? [ 2drop t ] [ = ] if ;
346 [ [ t ] ] dip '[ 8000 <iota> [ drop _ comparison-test ] all? ] unit-test
349 { t } [ -10 10 [a,b] 0 100 [a,b] assume> 0 10 (a,b] = ] unit-test
351 { t } [ -10 10 [a,b] 0 100 [a,b] assume>= 0 10 [a,b] = ] unit-test
353 { t } [ -10 10 [a,b] 0 100 [a,b] assume< -10 10 [a,b] = ] unit-test
355 { t } [ -10 10 [a,b] -100 0 [a,b] assume< -10 0 [a,b) = ] unit-test
357 { t } [ -10 10 [a,b] -100 0 [a,b] assume<= -10 0 [a,b] = ] unit-test
359 { t } [ -10 10 [a,b] 0 100 [a,b] assume<= -10 10 [a,b] = ] unit-test
361 { t } [ -10 10 [a,b] interval-abs 0 10 [a,b] = ] unit-test
363 { t } [ full-interval interval-abs [0,inf] = ] unit-test
365 { t } [ [0,inf] interval-abs [0,inf] = ] unit-test
367 { t } [ empty-interval interval-abs empty-interval = ] unit-test
369 { t } [ [0,inf] interval-sq [0,inf] = ] unit-test
371 ! Test that commutative interval ops really are
372 : random-interval-or-empty ( -- obj )
373 10 random 0 = [ empty-interval ] [ random-interval ] if ;
375 : commutative-ops ( -- seq )
378 interval-bitor interval-bitand interval-bitxor
379 interval-max interval-min
386 random-interval-or-empty random-interval-or-empty _
387 [ execute ] [ swapd execute ] 3bi =
392 ! Test singleton behavior
393 { f } [ full-interval interval-nonnegative? ] unit-test
395 { t } [ empty-interval interval-nonnegative? ] unit-test
397 { t } [ full-interval interval-zero? ] unit-test
399 { f } [ empty-interval interval-zero? ] unit-test
401 { f f } [ -1/0. 1/0. [ empty-interval interval-contains? ] bi@ ] unit-test
403 { t t } [ -1/0. 1/0. [ full-interval interval-contains? ] bi@ ] unit-test
406 ${ 0 0xaf [a,b] } [ 0 0xff [a,b] 0 0xaf [a,b] interval-bitand ] unit-test
407 ${ -0x100 -10 [a,b] } [ -0xff -1 [a,b] -0xaf -10 [a,b] interval-bitand ] unit-test
408 ${ -0x100 10 [a,b] } [ -0xff 1 [a,b] -0xaf 10 [a,b] interval-bitand ] unit-test
409 ${ 0 0xff [a,b] } [ -0xff -1 [a,b] 0 0xff [a,b] interval-bitand ] unit-test
412 { 1/0. } [ 1/0. bit-weight ] unit-test
413 { 1/0. } [ -1/0. bit-weight ] unit-test
416 16 <iota> dup [ bitor ] cartesian-map flatten
417 [ 0 15 [a,b] interval-contains? ] all?
420 ${ 0 255 [a,b] } [ 0 255 [a,b] dup interval-bitor ] unit-test
421 ${ 0 511 [a,b] } [ 0 256 [a,b] dup interval-bitor ] unit-test
423 ${ -128 127 [a,b] } [ -128 127 [a,b] dup interval-bitor ] unit-test
424 ${ -256 255 [a,b] } [ -128 128 [a,b] dup interval-bitor ] unit-test
426 { full-interval } [ full-interval -128 127 [a,b] interval-bitor ] unit-test
427 ${ 0 [a,inf] } [ 0 [a,inf] dup interval-bitor ] unit-test
428 { full-interval } [ 0 [-inf,a] dup interval-bitor ] unit-test
429 ${ 4 [a,inf] } [ 4 [a,inf] 3 [a,inf] interval-bitor ] unit-test
432 ${ 0 255 [a,b] } [ 0 255 [a,b] dup interval-bitxor ] unit-test
433 ${ 0 511 [a,b] } [ 0 256 [a,b] dup interval-bitxor ] unit-test
435 ${ -128 127 [a,b] } [ -128 127 [a,b] dup interval-bitxor ] unit-test
436 ${ -256 255 [a,b] } [ -128 128 [a,b] dup interval-bitxor ] unit-test
437 ${ 0 127 [a,b] } [ -128 -1 [a,b] dup interval-bitxor ] unit-test
439 { full-interval } [ full-interval -128 127 [a,b] interval-bitxor ] unit-test
440 ${ 0 [a,inf] } [ 0 [a,inf] dup interval-bitxor ] unit-test
441 ${ 0 [a,inf] } [ -1 [-inf,a] dup interval-bitxor ] unit-test
442 ${ 0 [a,inf] } [ 4 [a,inf] 3 [a,inf] interval-bitxor ] unit-test
443 { full-interval } [ 4 [a,inf] -3 [a,inf] interval-bitxor ] unit-test