| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | ! Copyright (C) 2012 John Benediktsson | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-25 13:33:41 -04:00
										 |  |  | USING: accessors arrays assocs assocs.extras byte-arrays | 
					
						
							|  |  |  | combinators combinators.short-circuit compression.zlib fry | 
					
						
							| 
									
										
										
										
											2013-04-11 13:30:55 -04:00
										 |  |  | grouping kernel locals math math.combinatorics math.constants | 
					
						
							| 
									
										
										
										
											2014-12-23 23:08:23 -05:00
										 |  |  | math.functions math.order math.primes math.primes.factors | 
					
						
							|  |  |  | math.ranges math.ranges.private math.statistics math.vectors | 
					
						
							|  |  |  | memoize parser random sequences sequences.extras | 
					
						
							|  |  |  | sequences.private sets sorting sorting.extras ;
 | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | IN: math.extras | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-25 13:48:09 -04:00
										 |  |  | DEFER: stirling | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-25 13:48:09 -04:00
										 |  |  | : (stirling) ( n k -- x )
 | 
					
						
							|  |  |  |     [ [ 1 - ] bi@ stirling ] | 
					
						
							|  |  |  |     [ [ 1 - ] dip stirling ] | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  |     [ nip * + ] 2tri ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-25 13:48:09 -04:00
										 |  |  | MEMO: stirling ( n k -- x )
 | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  |     2dup { [ = ] [ nip 1 = ] } 2|| | 
					
						
							| 
									
										
										
										
											2012-09-25 13:48:09 -04:00
										 |  |  |     [ 2drop 1 ] [ (stirling) ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :: ramanujan ( x -- y )
 | 
					
						
							|  |  |  |     pi sqrt x e / x ^ * x 8 * 4 + x * 1 + x * 1/30 + 1/6 ^ * ;
 | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEFER: bernoulli | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-10 12:29:21 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | : (bernoulli) ( p -- n )
 | 
					
						
							|  |  |  |     [ iota ] [ 1 + ] bi [ | 
					
						
							|  |  |  |         0 [ [ nCk ] [ bernoulli * ] bi + ] with reduce
 | 
					
						
							|  |  |  |     ] keep recip neg * ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MEMO: bernoulli ( p -- n )
 | 
					
						
							|  |  |  |     [ 1 ] [ (bernoulli) ] if-zero ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : chi2 ( actual expected -- n )
 | 
					
						
							|  |  |  |     0 [ dup 0 > [ [ - sq ] keep / + ] [ 2drop ] if ] 2reduce ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : df-check ( df -- )
 | 
					
						
							|  |  |  |     even? [ "odd degrees of freedom" throw ] unless ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (chi2P) ( chi/2 df/2 -- p )
 | 
					
						
							| 
									
										
										
										
											2012-05-02 12:59:09 -04:00
										 |  |  |     [1,b) dupd n/v cum-product swap neg e^ [ v*n sum ] keep + ;
 | 
					
						
							| 
									
										
										
										
											2012-04-20 23:09:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : chi2P ( chi df -- p )
 | 
					
						
							|  |  |  |     dup df-check [ 2.0 / ] [ 2 /i ] bi* (chi2P) 1.0 min ;
 | 
					
						
							| 
									
										
										
										
											2012-05-04 11:57:09 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-jacobi ( m -- m )
 | 
					
						
							|  |  |  |     dup { [ integer? ] [ 0 > ] [ odd? ] } 1&& | 
					
						
							|  |  |  |     [ "modulus must be odd positive integer" throw ] unless ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : mod' ( x y -- n )
 | 
					
						
							|  |  |  |     [ mod ] keep over zero? [ drop ] [ | 
					
						
							| 
									
										
										
										
											2012-07-21 13:22:44 -04:00
										 |  |  |         2dup [ sgn ] same? [ drop ] [ + ] if
 | 
					
						
							| 
									
										
										
										
											2012-05-04 11:57:09 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jacobi ( a m -- n )
 | 
					
						
							|  |  |  |     check-jacobi [ mod' ] keep 1
 | 
					
						
							|  |  |  |     [ pick zero? ] [ | 
					
						
							|  |  |  |         [ pick even? ] [ | 
					
						
							|  |  |  |             [ 2 / ] 2dip
 | 
					
						
							|  |  |  |             over 8 mod' { 3 5 } member? [ neg ] when
 | 
					
						
							|  |  |  |         ] while swapd
 | 
					
						
							|  |  |  |         2over [ 4 mod' 3 = ] both? [ neg ] when
 | 
					
						
							|  |  |  |         [ [ mod' ] keep ] dip
 | 
					
						
							|  |  |  |     ] until [ nip 1 = ] dip 0 ? ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-legendere ( m -- m )
 | 
					
						
							|  |  |  |     dup prime? [ "modulus must be prime positive integer" throw ] unless ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : legendere ( a m -- n )
 | 
					
						
							|  |  |  |     check-legendere jacobi ;
 | 
					
						
							| 
									
										
										
										
											2012-05-04 12:04:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : moving-average ( seq n -- newseq )
 | 
					
						
							| 
									
										
										
										
											2012-05-04 17:23:15 -04:00
										 |  |  |     <clumps> [ mean ] map ;
 | 
					
						
							| 
									
										
										
										
											2012-05-04 12:04:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : exponential-moving-average ( seq a -- newseq )
 | 
					
						
							| 
									
										
										
										
											2013-04-22 19:34:00 -04:00
										 |  |  |     [ 1 ] 2dip '[ dupd swap - _ * + dup ] map nip ;
 | 
					
						
							| 
									
										
										
										
											2012-05-04 17:23:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : moving-median ( u n -- v )
 | 
					
						
							| 
									
										
										
										
											2013-05-06 13:41:21 -04:00
										 |  |  |     <clumps> [ median ] map ;
 | 
					
						
							| 
									
										
										
										
											2012-06-19 17:23:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-30 19:16:10 -04:00
										 |  |  | : moving-supremum ( u n -- v )
 | 
					
						
							|  |  |  |     <clumps> [ supremum ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : moving-infimum ( u n -- v )
 | 
					
						
							|  |  |  |     <clumps> [ infimum ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : moving-sum ( u n -- v )
 | 
					
						
							|  |  |  |     <clumps> [ sum ] map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-31 14:04:12 -04:00
										 |  |  | : moving-count ( ... u n quot: ( ... elt -- ... ? ) -- ... v )
 | 
					
						
							| 
									
										
										
										
											2013-04-22 19:34:00 -04:00
										 |  |  |     [ <clumps> ] [ '[ _ count ] map ] bi* ; inline
 | 
					
						
							| 
									
										
										
										
											2012-08-31 14:04:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-19 17:23:00 -04:00
										 |  |  | : nonzero ( seq -- seq' )
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:34 -04:00
										 |  |  |     [ zero? ] reject ;
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : bartlett ( n -- seq )
 | 
					
						
							| 
									
										
										
										
											2012-12-04 12:06:30 -05:00
										 |  |  |     dup 1 <= [ 1 = [ 1 1array ] [ { } ] if ] [ | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  |         [ iota ] [ 1 - 2 / ] bi [ | 
					
						
							|  |  |  |             [ recip * ] [ >= ] 2bi [ 2 swap - ] when
 | 
					
						
							|  |  |  |         ] curry map
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-22 14:56:23 -04:00
										 |  |  | : [0,2pi] ( n -- seq )
 | 
					
						
							| 
									
										
										
										
											2013-04-22 14:13:32 -04:00
										 |  |  |     [ iota ] [ 1 - 2pi swap / ] bi v*n ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  | : hanning ( n -- seq )
 | 
					
						
							| 
									
										
										
										
											2012-12-04 12:06:30 -05:00
										 |  |  |     dup 1 <= [ 1 = [ 1 1array ] [ { } ] if ] [ | 
					
						
							| 
									
										
										
										
											2013-04-22 14:56:23 -04:00
										 |  |  |         [0,2pi] [ cos -0.5 * 0.5 + ] map!
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : hamming ( n -- seq )
 | 
					
						
							| 
									
										
										
										
											2012-12-04 12:06:30 -05:00
										 |  |  |     dup 1 <= [ 1 = [ 1 1array ] [ { } ] if ] [ | 
					
						
							| 
									
										
										
										
											2013-04-22 14:56:23 -04:00
										 |  |  |         [0,2pi] [ cos -0.46 * 0.54 + ] map!
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : blackman ( n -- seq )
 | 
					
						
							| 
									
										
										
										
											2012-12-04 12:06:30 -05:00
										 |  |  |     dup 1 <= [ 1 = [ 1 1array ] [ { } ] if ] [ | 
					
						
							| 
									
										
										
										
											2013-04-22 14:56:23 -04:00
										 |  |  |         [0,2pi] [ | 
					
						
							| 
									
										
										
										
											2013-04-22 14:13:32 -04:00
										 |  |  |             [ cos -0.5 * ] [ 2 * cos 0.08 * ] bi + 0.42 +
 | 
					
						
							|  |  |  |         ] map
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : nan-sum ( seq -- n )
 | 
					
						
							|  |  |  |     0 [ dup fp-nan? [ drop ] [ + ] if ] binary-reduce ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : nan-min ( seq -- n )
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:34 -04:00
										 |  |  |     [ fp-nan? ] reject infimum ;
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : nan-max ( seq -- n )
 | 
					
						
							| 
									
										
										
										
											2015-05-12 21:50:34 -04:00
										 |  |  |     [ fp-nan? ] reject supremum ;
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-02 00:22:27 -04:00
										 |  |  | : fill-nans ( seq -- newseq )
 | 
					
						
							|  |  |  |     [ first ] keep [ | 
					
						
							|  |  |  |         dup fp-nan? [ drop dup ] [ nip dup ] if
 | 
					
						
							|  |  |  |     ] map nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-27 15:44:51 -04:00
										 |  |  | : sinc ( x -- y )
 | 
					
						
							|  |  |  |     [ 1 ] [ pi * [ sin ] [ / ] bi ] if-zero ;
 | 
					
						
							| 
									
										
										
										
											2012-08-31 18:00:53 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : until-zero ( n quot -- )
 | 
					
						
							|  |  |  |     [ dup zero? ] swap until drop ; inline
 | 
					
						
							| 
									
										
										
										
											2012-09-25 20:21:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:20:18 -04:00
										 |  |  | : cum-reduce ( seq identity quot: ( prev elt -- next ) -- result cum-result )
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:11:41 -04:00
										 |  |  |     [ dup rot ] dip dup '[ _ curry dip dupd @ ] each ; inline
 | 
					
						
							| 
									
										
										
										
											2012-09-26 12:06:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-25 20:21:02 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :: (gini) ( seq -- x )
 | 
					
						
							|  |  |  |     seq natural-sort :> sorted | 
					
						
							|  |  |  |     seq length :> len | 
					
						
							| 
									
										
										
										
											2012-09-26 18:11:41 -04:00
										 |  |  |     sorted 0 [ + ] cum-reduce :> ( a b )
 | 
					
						
							| 
									
										
										
										
											2012-09-25 20:52:27 -04:00
										 |  |  |     b len a * / :> B | 
					
						
							|  |  |  |     1 len recip + 2 B * - ;
 | 
					
						
							| 
									
										
										
										
											2012-09-25 20:21:02 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : gini ( seq -- x )
 | 
					
						
							|  |  |  |     dup length 1 <= [ drop 0 ] [ (gini) ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : concentration-coefficient ( seq -- x )
 | 
					
						
							| 
									
										
										
										
											2012-09-26 12:06:48 -04:00
										 |  |  |     dup length 1 <= [ | 
					
						
							| 
									
										
										
										
											2012-09-25 20:54:24 -04:00
										 |  |  |         drop 0
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2012-09-26 18:34:08 -04:00
										 |  |  |         [ (gini) ] [ length [ ] [ 1 - ] bi / ] bi *
 | 
					
						
							| 
									
										
										
										
											2012-09-26 12:06:48 -04:00
										 |  |  |     ] if ;
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:25:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : herfindahl ( seq -- x )
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:43:15 -04:00
										 |  |  |     [ sum-of-squares ] [ sum sq ] bi / ;
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:25:45 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : normalized-herfindahl ( seq -- x )
 | 
					
						
							|  |  |  |     [ herfindahl ] [ length recip ] bi
 | 
					
						
							|  |  |  |     [ - ] [ 1 swap - / ] bi ;
 | 
					
						
							| 
									
										
										
										
											2012-09-26 18:29:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : exponential-index ( seq -- x )
 | 
					
						
							|  |  |  |     dup sum '[ _ / dup ^ ] map-product ;
 | 
					
						
							| 
									
										
										
										
											2012-10-05 17:48:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : weighted-random ( histogram -- obj )
 | 
					
						
							| 
									
										
										
										
											2013-09-06 00:09:32 -04:00
										 |  |  |     unzip cum-sum [ last random ] [ bisect-left ] bi swap nth ;
 | 
					
						
							| 
									
										
										
										
											2012-11-07 20:05:06 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : unique-indices ( seq -- unique indices )
 | 
					
						
							|  |  |  |     [ members ] keep over dup length iota H{ } zip-as '[ _ at ] map ;
 | 
					
						
							| 
									
										
										
										
											2013-03-20 16:44:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 22:01:25 -04:00
										 |  |  | : digitize] ( seq bins -- seq' )
 | 
					
						
							| 
									
										
										
										
											2013-09-06 00:09:32 -04:00
										 |  |  |     '[ _ bisect-left ] map ;
 | 
					
						
							| 
									
										
										
										
											2013-09-04 22:01:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : digitize) ( seq bins -- seq' )
 | 
					
						
							| 
									
										
										
										
											2013-09-06 00:09:32 -04:00
										 |  |  |     '[ _ bisect-right ] map ;
 | 
					
						
							| 
									
										
										
										
											2013-09-04 22:01:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:09:36 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 11:54:14 -04:00
										 |  |  | : steps ( a b length -- a b step )
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:09:36 -04:00
										 |  |  |     [ 2dup swap - ] dip / ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 11:54:14 -04:00
										 |  |  | : linspace[a,b) ( a b length -- seq )
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:09:36 -04:00
										 |  |  |     steps ,b) <range> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 11:54:14 -04:00
										 |  |  | : linspace[a,b] ( a b length -- seq )
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:09:36 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         { [ dup 1 < ] [ 3drop { } ] } | 
					
						
							|  |  |  |         { [ dup 1 = ] [ 2drop 1array ] } | 
					
						
							| 
									
										
										
										
											2013-03-20 18:15:50 -04:00
										 |  |  |         [ 1 - steps <range> ] | 
					
						
							| 
									
										
										
										
											2013-03-20 18:09:36 -04:00
										 |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 11:54:14 -04:00
										 |  |  | : logspace[a,b) ( a b length base -- seq )
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:15:50 -04:00
										 |  |  |     [ linspace[a,b) ] dip swap n^v ;
 | 
					
						
							| 
									
										
										
										
											2013-03-20 16:49:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-21 11:54:14 -04:00
										 |  |  | : logspace[a,b] ( a b length base -- seq )
 | 
					
						
							| 
									
										
										
										
											2013-03-20 18:15:50 -04:00
										 |  |  |     [ linspace[a,b] ] dip swap n^v ;
 | 
					
						
							| 
									
										
										
										
											2013-03-24 22:39:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : majority ( seq -- elt/f )
 | 
					
						
							|  |  |  |     [ f 0 ] dip [ | 
					
						
							|  |  |  |         over zero? [ 2nip 1 ] [ | 
					
						
							|  |  |  |             pick = [ 1 + ] [ 1 - ] if
 | 
					
						
							|  |  |  |         ] if
 | 
					
						
							|  |  |  |     ] each zero? [ drop f ] when ;
 | 
					
						
							| 
									
										
										
										
											2013-03-25 13:33:41 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : compression-lengths ( a b -- len(a+b) len(a) len(b) )
 | 
					
						
							|  |  |  |     [ append ] 2keep [ >byte-array compress data>> length ] tri@ ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : compression-distance ( a b -- n )
 | 
					
						
							|  |  |  |     compression-lengths sort-pair [ - ] [ / ] bi* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : compression-dissimilarity ( a b -- n )
 | 
					
						
							|  |  |  |     compression-lengths + / ;
 | 
					
						
							| 
									
										
										
										
											2013-03-26 17:36:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: round-to-even ( x -- y )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: integer round-to-even ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: ratio round-to-even | 
					
						
							|  |  |  |     >fraction [ /mod abs 2 * ] keep > [ dup 0 < -1 1 ? + ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: float round-to-even | 
					
						
							|  |  |  |     dup 0 > [ | 
					
						
							|  |  |  |         dup 0x1p52 <= [ 0x1p52 + 0x1p52 - ] when
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dup -0x1p52 >= [ 0x1p52 - 0x1p52 + ] when
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							| 
									
										
										
										
											2013-04-01 20:03:18 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : round-to-decimal ( x n -- y )
 | 
					
						
							|  |  |  |     10^ [ * 0.5 over 0 > [ + ] [ - ] if truncate ] [ / ] bi ;
 | 
					
						
							| 
									
										
										
										
											2013-04-01 20:04:07 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : round-to-step ( x step -- y )
 | 
					
						
							|  |  |  |     [ [ / round ] [ * ] bi ] unless-zero ;
 | 
					
						
							| 
									
										
										
										
											2013-05-02 00:56:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-17 13:10:40 -04:00
										 |  |  | GENERIC: round-away-from-zero ( x -- y )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: integer round-away-from-zero ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: real round-away-from-zero | 
					
						
							|  |  |  |     dup 0 < [ floor ] [ ceiling ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-02 00:56:34 -04:00
										 |  |  | : monotonic-count ( seq quot: ( elt1 elt2 -- ? ) -- newseq )
 | 
					
						
							|  |  |  |     over empty? [ 2drop { } ] [ | 
					
						
							|  |  |  |         [ 0 swap unclip-slice swap ] dip '[ | 
					
						
							|  |  |  |             [ @ [ 1 + ] [ drop 0 ] if ] keep over
 | 
					
						
							|  |  |  |         ] { } map-as 2nip 0 prefix
 | 
					
						
							|  |  |  |     ] if ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : max-monotonic-count ( seq quot: ( elt1 elt2 -- ? ) -- n )
 | 
					
						
							|  |  |  |     over empty? [ 2drop 0 ] [ | 
					
						
							|  |  |  |         [ 0 swap unclip-slice swap 0 ] dip '[ | 
					
						
							|  |  |  |             [ swapd @ [ 1 + ] [ max 0 ] if ] keep swap
 | 
					
						
							|  |  |  |         ] reduce nip max | 
					
						
							|  |  |  |     ] if ; inline
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:27:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:40:50 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-14 14:15:48 -04:00
										 |  |  | : kahan+ ( c sum elt -- c' sum' )
 | 
					
						
							| 
									
										
										
										
											2013-10-14 17:06:19 -04:00
										 |  |  |     rot - 2dup + [ -rot [ - ] bi@ ] keep ; inline
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:40:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:27:58 -04:00
										 |  |  | : kahan-sum ( seq -- n )
 | 
					
						
							| 
									
										
										
										
											2013-10-13 11:40:50 -04:00
										 |  |  |     [ 0.0 0.0 ] dip [ kahan+ ] each nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : map-kahan-sum ( ... seq quot: ( ... elt -- ... n ) -- ... n )
 | 
					
						
							|  |  |  |     [ 0.0 0.0 ] 2dip [ 2dip rot kahan+ ] curry
 | 
					
						
							|  |  |  |     [ -rot ] prepose each nip ; inline
 | 
					
						
							| 
									
										
										
										
											2014-06-10 21:17:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 18:53:45 -04:00
										 |  |  | ! SYNTAX: .. dup pop scan-object [a,b) suffix! ; | 
					
						
							|  |  |  | ! SYNTAX: ... dup pop scan-object [a,b] suffix! ; | 
					
						
							| 
									
										
										
										
											2014-06-10 21:28:21 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: sum-squares ( seq -- n )
 | 
					
						
							|  |  |  | M: object sum-squares [ sq ] map-sum ;
 | 
					
						
							|  |  |  | M: iota-tuple sum-squares | 
					
						
							|  |  |  |     length 1 - [ ] [ 1 + ] [ 1/2 + ] tri * * 3 / ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: sum-cubes ( seq -- n )
 | 
					
						
							|  |  |  | M: object sum-cubes [ 3 ^ ] map-sum ;
 | 
					
						
							|  |  |  | M: iota-tuple sum-cubes sum sq ;
 | 
					
						
							| 
									
										
										
										
											2014-12-23 23:08:23 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : mobius ( n -- x )
 | 
					
						
							|  |  |  |     group-factors values [ 1 ] [ | 
					
						
							|  |  |  |         dup [ 1 > ] any?
 | 
					
						
							|  |  |  |         [ drop 0 ] [ length even? 1 -1 ? ] if
 | 
					
						
							|  |  |  |     ] if-empty ;
 | 
					
						
							| 
									
										
										
										
											2015-04-02 00:34:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : kelly ( winning-probability odds -- fraction )
 | 
					
						
							|  |  |  |     [ 1 + * 1 - ] [ / ] bi ;
 |