| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | ! Copyright (C) 2010 Jon Harper. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: arrays assocs combinators combinators.short-circuit | 
					
						
							|  |  |  | kernel macros math math.order quotations random sequences | 
					
						
							|  |  |  | summary ;
 | 
					
						
							|  |  |  | IN: combinators.random | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-30 20:56:00 -04:00
										 |  |  | : ifp ( p true false -- ) [ random-unit > ] 2dip if ; inline
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : whenp ( p true -- ) [ ] ifp ; inline
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : unlessp ( p false -- ) [ [ ] ] dip ifp ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : with-drop ( quot -- quot' ) [ drop ] prepend ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : prepare-pair ( pair -- pair' )
 | 
					
						
							|  |  |  |     first2 [ [ [ - ] [ < ] 2bi ] curry ] [ with-drop ] bi* 2array ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: bad-probabilities assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: bad-probabilities summary | 
					
						
							|  |  |  |     drop "The probabilities do not satisfy the rules stated in the docs." ;
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : good-probabilities? ( assoc -- ? )
 | 
					
						
							|  |  |  |     dup last pair? [ | 
					
						
							|  |  |  |         keys { [ sum 1 number= ] [ [ 0 1 between? ] all? ] } 1&& | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         but-last keys { [ sum 0 1 between? ] [ [ 0 1 between? ] all? ] } 1&& | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Useful for unit-tests (no random part) | 
					
						
							|  |  |  | : (casep>quot) ( assoc -- quot )
 | 
					
						
							|  |  |  |     dup good-probabilities? [ | 
					
						
							|  |  |  |         [ dup pair? [ prepare-pair ] [ with-drop ] if ] map
 | 
					
						
							|  |  |  |         cond>quot
 | 
					
						
							| 
									
										
										
										
											2015-08-13 19:13:05 -04:00
										 |  |  |     ] [ bad-probabilities ] if ;
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: (casep) ( assoc -- quot ) (casep>quot) ;
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : casep>quot ( assoc -- quot )
 | 
					
						
							| 
									
										
										
										
											2012-03-30 20:56:00 -04:00
										 |  |  |     (casep>quot) [ random-unit ] prepend ;
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : (conditional-probabilities) ( seq i -- p )
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  |     [ dup 0 > [ head [ 1 swap - ] [ * ] map-reduce ] [ 2drop 1 ] if ] | 
					
						
							|  |  |  |     [ swap nth ] 2bi * ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : conditional-probabilities ( seq -- seq' )
 | 
					
						
							|  |  |  |     dup length iota [ (conditional-probabilities) ] with map ;
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : (direct>conditional) ( assoc -- assoc' )
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  |     [ keys conditional-probabilities ] [ values ] bi zip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | : direct>conditional ( assoc -- assoc' )
 | 
					
						
							|  |  |  |     dup last pair? [ (direct>conditional) ] [ | 
					
						
							|  |  |  |         unclip-last [ (direct>conditional) ] [ suffix ] bi*
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : call-random>casep ( seq -- assoc )
 | 
					
						
							|  |  |  |     [ length recip ] keep [ 2array ] with map ;
 | 
					
						
							| 
									
										
										
										
											2012-08-02 17:06:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: casep ( assoc -- quot ) casep>quot ;
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: casep* ( assoc -- quot ) direct>conditional casep>quot ;
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: call-random ( seq -- quot ) call-random>casep casep>quot ;
 | 
					
						
							| 
									
										
										
										
											2010-09-19 14:29:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: execute-random ( seq -- quot )
 | 
					
						
							| 
									
										
										
										
											2012-03-30 20:56:00 -04:00
										 |  |  |     [ 1quotation ] map call-random>casep casep>quot ;
 |