annotate src/scheme/functions.scm @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
samer@0 1
samer@0 2 (define (matmult A x nm)
samer@0 3 (define y (VVector. nm (.getRowDimension A)))
samer@0 4 (addtask (seq
samer@0 5 (Ops.times y A x)
samer@0 6 (Ops.update y)))
samer@0 7 y
samer@0 8 )
samer@0 9
samer@0 10 ;;; apply function to vector
samer@0 11 (define (fn-vec fn in outname)
samer@0 12 (let ((out (VVector. outname (.size in))))
samer@0 13 (addtasks (Ops.apply out fn in) (Ops.update out))
samer@0 14 out))
samer@0 15
samer@0 16
samer@0 17 ; set up signal containing of sum_i fn(x_i)
samer@0 18 (define (sum-fn fn x nm)
samer@0 19 (define sig (node (.getNode x) (VDouble. nm)))
samer@0 20 (addtask (SumFnVec. fn x sig))
samer@0 21 sig
samer@0 22 )
samer@0 23
samer@0 24 ;;; power spectrum
samer@0 25 (define (ft-vec in)
samer@0 26 (define ftv (FFTVector. in))
samer@0 27 (addtask (.calcTask ftv))
samer@0 28 (put "FFTVector" ftv)
samer@0 29 ftv
samer@0 30 )
samer@0 31
samer@0 32 (define (ft-power ftv)
samer@0 33 (define y (VVector. "ft.power" (+ 1 (/ (.size ftv) 2))))
samer@0 34 (addtask (.getPower ftv y))
samer@0 35 y
samer@0 36 )
samer@0 37
samer@0 38 ;;; magnitude spectrum, ie sqrt(power)
samer@0 39 (define (ft-mag ftv)
samer@0 40 (define y (VVector. "ft.mag" (+ 0 (/ (.size ftv) 2))))
samer@0 41 (addtasks (.getFnPower ftv (Sqrt.) y))
samer@0 42 y
samer@0 43 )
samer@0 44
samer@0 45 ;; log spectrum, ie log(power)
samer@0 46 (define (ft-log ftv)
samer@0 47 (define y (VVector. "ft.log" (+ 1 (/ (.size ftv) 2))))
samer@0 48 (addtasks (.getFnPower ftv (Log.) y))
samer@0 49 y
samer@0 50 )
samer@0 51
samer@0 52 ;;; linear FT, real valued version with sin and cosine parts
samer@0 53 (define (ft-linear ftv)
samer@0 54 (define y (VVector. "ft" (.size ftv)))
samer@0 55 (addtask (.getLinearFT ftv y))
samer@0 56 y
samer@0 57 )
samer@0 58
samer@0 59 ;;; creates parameter viewables for a VFunction
samer@0 60 ;;; vfn: the VFunction (we need the node and the observable parts)
samer@0 61 ;;; models: list of (String,DoubleModel) pairs: we create a
samer@0 62 ;;; VParameter with the given name for each DoubleModel
samer@0 63
samer@0 64 (define (vfn-params vfn models)
samer@0 65 (define obs (observer (.changed vfn)))
samer@0 66 (node (.getNode vfn)
samer@0 67 (for-each
samer@0 68 (lambda (model)
samer@0 69 ;; these VParameters will INITIALISE the DoubleModel with a value
samer@0 70 ;; read from the environment
samer@0 71 (define param (VParameter. (first model) (second model)))
samer@0 72 (.addObserver param obs)
samer@0 73 )
samer@0 74 models)))
samer@0 75
samer@0 76 (define (id x) x)
samer@0 77 (define (vscale k) (define f (Scale. k)) (VParameter. "scale" f) f)
samer@0 78 (define (vpower k) (define f (Power. k)) (VParameter. "power" f) f)
samer@0 79 (define (vgenexp)
samer@0 80 (define genexp (samer.functions.LogGenExp.))
samer@0 81 (define vfn (VFunction. "logprior" genexp))
samer@0 82 (vfn-params vfn `( ( "quad" ,genexp ,(.getEpsModel genexp))))
samer@0 83 vfn
samer@0 84 )
samer@0 85
samer@0 86 (define-method (logcosh)
samer@0 87 (define fn (LogGenCosh.))
samer@0 88 (define vfn (VFunction. "logcosh" fn))
samer@0 89 (vfn-params vfn `(("alpha" ,fn)))
samer@0 90 fn)
samer@0 91
samer@0 92 (define-method (genexp alpha lin quad)
samer@0 93 (define fn (LogGenExp2.))
samer@0 94 (.set (.getAlphaModel fn) alpha)
samer@0 95 (.set (.getLinearScale fn) lin)
samer@0 96 (.set (.getQuadraticScale fn) quad)
samer@0 97 fn
samer@0 98 )
samer@0 99
samer@0 100 (define-method (genexp)
samer@0 101 (define fn (LogGenExp2.))
samer@0 102 (define vfn (VFunction. "genexp" fn))
samer@0 103 (vfn-params vfn `(
samer@0 104 ("alpha" ,fn)
samer@0 105 ("lin" ,(.getLinearScale fn))
samer@0 106 ("quad" ,(.getQuadraticScale fn))
samer@0 107 ))
samer@0 108 fn
samer@0 109 )
samer@0 110
samer@0 111 (define (nonneg logpr str)
samer@0 112 (define sq (ScaledFunction. (Square.) str))
samer@0 113 (define vfn (VFunction. "hybrid" (HybridFunction. sq logpr)))
samer@0 114 ; (vfn-params vfn `(("strictness" ,sq)))
samer@0 115 (.getFunction vfn)
samer@0 116 )
samer@0 117
samer@0 118
samer@0 119 ; returns list of integers from start to end
samer@0 120 (define (range start end)
samer@0 121 (define (rr l j) (if (< j start) l (rr (cons j l) (- j 1))))
samer@0 122 (rr () (- end 1))
samer@0 123 )
samer@0 124