common-stalingrad.vlad

(define (car (cons x y)) x)

(define (cdr (cons x y)) y)

(define (not x) (if x #f #t))

(define (append x y) (if (null? x) y (cons (first x) (append (rest x) y))))

(define (length l) (if (null? l) 0 (+ (length (cdr l)) 1)))

(define (list-ref l i) (if (zero? i) (car l) (list-ref (cdr l) (- i 1))))

(define ((map f) l) (if (null? l) '() (cons (f (car l)) ((map f) (cdr l)))))

(define ((map2 f) l1 l2)
 (if (null? l1) '() (cons (f (car l1) (car l2)) ((map2 f) (cdr l1) (cdr l2)))))

(define (equal? x y)
 ;; This doesn't compare procedures or transformed values.
 (or
  (and (null? x) (null? y))
  (and (boolean? x) (boolean? y) (or (and x y) (and (not x) (not y))))
  (and (real? x) (real? y) (= x y))
  (and (pair? x) (pair? y) (equal? (car x) (car y)) (equal? (cdr x) (cdr y)))))

(define (max x y) (if (>= x y) x y))

(define (e i n) ((map-n (lambda (j) (if (= j i) (real 1) (real 0)))) n))

(define (j* x) (bundle x (perturb (zero x))))

(define ((derivative-F f) x)
 (unperturb (tangent ((j* f) (bundle x (perturb (real 1)))))))

(define ((gradient-F f) x)
 (let ((n (length x)))
  ((map-n (lambda (i)
	   (unperturb (tangent ((j* f) (bundle x (perturb (e i n))))))))
   n)))

(define ((gradient-R f) x)
 (cdr (unsensitize ((cdr ((*j f) (*j x))) (sensitize (real 1))))))

(define ((derivative-R f) x)
 (cdr (unsensitize ((cdr ((*j f) (*j x))) (sensitize (real 1))))))

(define (first x) (car x))

(define (second x) (car (cdr x)))

(define (third x) (car (cdr (cdr x))))

(define (fourth x) (car (cdr (cdr (cdr x)))))

(define (rest x) (cdr x))

(define (sqr x) (* x x))

(define ((map-n f) n)
 (letrec ((loop (lambda (i) (if (= i n) '() (cons (f i) (loop (+ i 1)))))))
  (loop 0)))

(define ((reduce f i) l) (if (null? l) i (f (car l) ((reduce f i) (cdr l)))))

(define (map-reduce g i f l)
 (if (null? l) i (g (f (first l)) (map-reduce g i f (rest l)))))

(define (remove-if p l)
 (cond ((null? l) '())
       ((p (first l)) (remove-if p (rest l)))
       (else (cons (first l) (remove-if p (rest l))))))

(define (v+ u v) ((map2 +) u v))

(define (v- u v) ((map2 -) u v))

(define (k*v k v) ((map (lambda (x) (* k x))) v))

(define (magnitude-squared x) ((reduce + (real 0)) ((map sqr) x)))

(define (magnitude x) (sqrt (magnitude-squared x)))

(define (distance-squared u v) (magnitude-squared (v- v u)))

(define (distance u v) (sqrt (distance-squared u v)))

(define (gradient-ascent-F f x0 n eta)
 (if (zero? n)
     (list x0 (f x0) ((gradient-F f) x0))
     (gradient-ascent-F
      f
      ((map2 (lambda (xi gi) (+ xi (* eta gi)))) x0 ((gradient-F f) x0))
      (- n 1)
      eta)))

(define (gradient-ascent-R f x0 n eta)
 (if (zero? n)
     (list x0 (f x0) ((gradient-R f) x0))
     (gradient-ascent-R
      f
      ((map2 (lambda (xi gi) (+ xi (* eta gi)))) x0 ((gradient-R f) x0))
      (- n 1)
      eta)))

(define (multivariate-argmin-F f x)
 (let ((g (gradient-F f)))
  (letrec ((loop
	    (lambda (x fx gx eta i)
	     (cond ((<= (magnitude gx) (real 1e-5)) x)
		   ((= i (real 10)) (loop x fx gx (* (real 2) eta) (real 0)))
		   (else
		    (let ((x-prime (v- x (k*v eta gx))))
		     (if (<= (distance x x-prime) (real 1e-5))
			 x
			 (let ((fx-prime (f x-prime)))
			  (if (< fx-prime fx)
			      (loop x-prime fx-prime (g x-prime) eta (+ i 1))
			      (loop x fx gx (/ eta (real 2)) (real 0)))))))))))
   (loop x (f x) (g x) (real 1e-5) (real 0)))))

(define (multivariate-argmax-F f x)
 (multivariate-argmin-F (lambda (x) (- (real 0) (f x))) x))

(define (multivariate-max-F f x) (f (multivariate-argmax-F f x)))

(define (multivariate-argmin-R f x)
 (let ((g (gradient-R f)))
  (letrec ((loop
	    (lambda (x fx gx eta i)
	     (cond ((<= (magnitude gx) (real 1e-5)) x)
		   ((= i (real 10)) (loop x fx gx (* (real 2) eta) (real 0)))
		   (else
		    (let ((x-prime (v- x (k*v eta gx))))
		     (if (<= (distance x x-prime) (real 1e-5))
			 x
			 (let ((fx-prime (f x-prime)))
			  (if (< fx-prime fx)
			      (loop x-prime fx-prime (g x-prime) eta (+ i 1))
			      (loop x fx gx (/ eta (real 2)) (real 0)))))))))))
   (loop x (f x) (g x) (real 1e-5) (real 0)))))

(define (multivariate-argmax-R f x)
 (multivariate-argmin-R (lambda (x) (- (real 0) (f x))) x))

(define (multivariate-max-R f x) (f (multivariate-argmax-R f x)))

Generated by GNU enscript 1.6.4.