no title added by anonymous on Thu Oct 19 23:08:56 2017

(use traversal)
(use int-limits)
(use srfi-1)
;;;;;;;;;;;;;;;;;;;;;;;;;
;misc
(define (normalize val max)
  (/ val max)
  )

(define (scanl f init ls)
  (cons init
        (if (null? ls)
            '()
            (scanl f (f init (first ls)) (rest ls)))))

(define (vec-sum v1 v2)
  (list (+ (first v1) (first v2)) (+ (second v1) (second v2)))
  )
;;;;;;;;;;;;;;;;;;;;;;;;;
;rng stuff
(define rng_inited #f)
(define rng_seed 1)
(define (init-rng)
  (randomize rng_seed)
  (set! rng_inited #t))

(define (norm-rng) 
  (unless rng_inited (init-rng))
  (normalize (random most-positive-integer32) most-positive-integer32))

(define (genrn cnt)
  (list-tabulate cnt
    (lambda (i) (norm-rng))))

;;;;;;;;;;;;;;;;;;;;;;;;;
;random sampling processing

(define (p-action-idx rand interval-sizes interval-count)
  (define (p-action-index_ interval-sizes idx acc)
    (if (negative? (- acc (first interval-sizes))) 
        idx
        (p-action-index_ (rest interval-sizes) (+ 1 idx) (- acc (first interval-sizes))) ))
  
  (assert (= (length interval-sizes) interval-count) )
  (assert (= (sum interval-sizes) 1) )
  (p-action-index_ interval-sizes 0 rand))

;;;;;;;;;;;;;;;;;;;;;;;;;
;simulation procs

(define (simu-1d rands)
  (define (choose-step-1d choice)
    (assert (<= 0 choice 1) )
    (case choice
      ((0) -1)
      ((1)  1) ))
  
  (let* ((init-pos 0)
         (p-interval-sizes '(0.5 0.5))
         (direction (lambda (rand) (choose-step (p-action-idx rand p-interval-sizes 2))))
         (steps (map direction rands)) )
    (scanl + init-pos steps)))

(define (simu-2d rands)
  (define (choose-step choice)
    (assert (<= 0 choice 3) )
    (case choice
      ((0) '(-1  0));left
      ((1) '( 0  1));up
      ((2) '( 1  0));right
      ((3) '( 0 -1)) ));down

  (let* ((init-pos '(0 0))
         (p-interval-sizes '(1/4 1/4 1/4 1/4))
         (direction (lambda (rand) (choose-step (p-action-idx rand p-interval-sizes 4))))
         (steps (map direction rands)) )
    (scanl vec-sum init-pos steps)))
;;;;;;;;;;;;;;;;;;;;;;;;;
(define N 10)

(define (main)
  (define rands (genrn N))

  ;(simu-1d rands)
  (simu-2d rands)
  )
  
  
(print (main))