wisp
 
(Arne Babenhauserheide)
2017-03-21: merge stable

merge stable

diff --git a/examples/power-iteration.w b/examples/power-iteration.w
new file mode 100755
--- /dev/null
+++ b/examples/power-iteration.w
@@ -0,0 +1,62 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples power-iteration) main)' -s "$0" "$@"
+; !#
+
+;; Power iteration, following https://en.wikipedia.org/wiki/Power_iteration#The_method
+
+define-module : examples power-iteration
+              . #:export : step
+
+import : srfi srfi-1
+
+define A '((1 2 3) (1 2 3) (1 2 4))
+define b '(1 1 1)
+
+
+define : M*v A b
+    . "Matrix by vector product"
+    if : = 0 : length A
+       . '()
+       let lp : (res '()) (head 0) (i 0) (j 0)
+         cond
+            {i >= (length A)}
+                reverse res
+            {j >= (length (list-ref A 0))}
+                lp (cons head res) 0 (+ 1 i) 0
+            else
+                lp res
+                   + head 
+                     * : list-ref (list-ref A i) j
+                         list-ref b j
+                   . i
+                   + 1 j
+
+
+define : normalize-squared v
+     let lp : (norm 0) (idx 0)
+         if {idx >= (length v)}
+             let loop : (res '()) (i 0)
+                if {i >= (length v)}
+                    . res
+                    loop 
+                        cons : / (list-ref v i) : sqrt norm
+                             . res
+                        + 1 i
+             lp
+                 + norm : * (list-ref v idx) (list-ref v idx)
+                 + idx 1
+            
+
+define : î-step elem prev
+    normalize-squared : M*v A prev
+
+define : main args
+    let lp : (i 0)
+        write : fold î-step b : iota i
+        newline
+        when {i < 10}
+          lp {i + 1}
+            
+    write : normalize-squared : M*v A b
+    newline