diff options
author | screwtape <screwtape@sdf.org> | 2023-05-11 09:37:43 +0000 |
---|---|---|
committer | screwtape <screwtape@sdf.org> | 2023-05-11 09:37:43 +0000 |
commit | 0285f426921326be2f4c5840ed469454c6479789 (patch) | |
tree | a8f3890162e741fc3c48c4509c38bb58b42a8087 /binry-hop.lisp | |
parent | d0c8da6985d1fd8a0d9e9a2a89c4a504b79f73d3 (diff) | |
download | cl-binry-hop-0285f426921326be2f4c5840ed469454c6479789.tar.gz |
Diffstat (limited to 'binry-hop.lisp')
-rw-r--r-- | binry-hop.lisp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/binry-hop.lisp b/binry-hop.lisp new file mode 100644 index 0000000..426f58b --- /dev/null +++ b/binry-hop.lisp @@ -0,0 +1,38 @@ +(in-package "binry-hop") + +(defun closure-hop-net (number-bits) + (let ((potential (make-array number-bits :element-type '(integer 0 1))) + (memories (list)) + (formatting-output "Potential: ~s~%Memories:~%~{~s~%~}")) + (labels ((rect-poly-2 (x) (if (< x 0) 0 (expt x 2))) + (b2s (x) (expt -1 (1+ x))) + (signed-idx (sgn memory idx) + (rect-poly-2 + (+ (* sgn (b2s (aref memory idx))) + (loop for pot across potential + for mem across memory + for count from 0 + summing + (cond + ((= count idx) 0) + (t (* (b2s mem) (b2s pot)))))))) + (local-update (idx) + (setf + (aref potential idx) + (if + (minusp + (loop for memory in memories + summing + (- (signed-idx +1 memory idx) + (signed-idx -1 memory idx)))) + 0 1)))) + (lambda (&key push-memory pop-memory format update set-potential) + (cond + (set-potential (setf potential set-potential)) + (push-memory (push push-memory memories)) + (pop-memory (pop memories)) + (format (when (stringp format) (setf formatting-output format)) + (format nil formatting-output potential memories)) + (update (if (numberp update) (local-update update) + (loop for idx below (length potential) + do (local-update idx))))))))) |