csys: only one starter (zero) neuron, that is both sensor and effector
This commit is contained in:
parent
6ea6811103
commit
bc4aa6f219
3 changed files with 21 additions and 20 deletions
|
|
@ -10,11 +10,12 @@
|
||||||
(:shape :scopes/shape)
|
(:shape :scopes/shape)
|
||||||
(:util :scopes/util)
|
(:util :scopes/util)
|
||||||
(:alx :alexandria))
|
(:alx :alexandria))
|
||||||
(:export #:environment #:*environment* #:detectors
|
(:export #:environment #:*environment* #:effectors
|
||||||
#:init
|
#:init
|
||||||
#:send #:send-message
|
#:send #:send-message
|
||||||
#:neuron #:synapse
|
#:neuron #:synapse
|
||||||
#:create-neuron #:update-neuron))
|
#:make-neuron #:update-neuron
|
||||||
|
#:handle-action))
|
||||||
|
|
||||||
(in-package :scopes/csys)
|
(in-package :scopes/csys)
|
||||||
|
|
||||||
|
|
@ -24,17 +25,15 @@
|
||||||
((actions :reader actions :initarg :actions :initform (make-hash-table))
|
((actions :reader actions :initarg :actions :initform (make-hash-table))
|
||||||
(sensors :reader sensors :initarg :sensors
|
(sensors :reader sensors :initarg :sensors
|
||||||
:initform (make-hash-table :test #'equal))
|
:initform (make-hash-table :test #'equal))
|
||||||
(detectors :reader detectors :initarg :detectors
|
(effectors :reader effectors :initarg :effectors
|
||||||
:initform (make-hash-table :test #'equal))))
|
:initform (make-hash-table :test #'equal))))
|
||||||
|
|
||||||
(defvar *environment* (make-instance 'environment))
|
(defvar *environment* (make-instance 'environment))
|
||||||
|
|
||||||
(defun init (&optional probe)
|
(defun init (zero)
|
||||||
(setf (gethash :sensor (actions *environment*)) #'create-sensor)
|
(setf (gethash :sensor (actions *environment*)) #'create-sensor)
|
||||||
(let* ((default-det (or probe (actor:create (neuron #'do-log))))
|
|
||||||
(zero (make-neuron default-det :state 0)))
|
|
||||||
(setf (gethash '(:init :zero) (sensors *environment*)) (list zero))
|
(setf (gethash '(:init :zero) (sensors *environment*)) (list zero))
|
||||||
(setf (gethash :default (detectors *environment*)) (list default-det))))
|
(setf (gethash :default (effectors *environment*)) (list zero)))
|
||||||
|
|
||||||
;;;; sensors: neurons receiving messages from environment, addressable via message head
|
;;;; sensors: neurons receiving messages from environment, addressable via message head
|
||||||
|
|
||||||
|
|
@ -58,9 +57,9 @@
|
||||||
(defun do-log (msg state syns env)
|
(defun do-log (msg state syns env)
|
||||||
(util:lgi msg))
|
(util:lgi msg))
|
||||||
|
|
||||||
(defun find-detectors (key &optional (default-key :default) (env *environment*))
|
(defun find-effectors (key &optional (default-key :default) (env *environment*))
|
||||||
(let ((dts (detectors env)))
|
(let ((effs (effectors env)))
|
||||||
(gethash key dts (gethash default-key dts))))
|
(gethash key effs (gethash default-key effs))))
|
||||||
|
|
||||||
;;;; neurons (= behavior factories) and synapses (connection factories)
|
;;;; neurons (= behavior factories) and synapses (connection factories)
|
||||||
|
|
||||||
|
|
@ -74,7 +73,8 @@
|
||||||
|
|
||||||
(defun make-neuron (syn-target &key (proc #'std-proc) state
|
(defun make-neuron (syn-target &key (proc #'std-proc) state
|
||||||
(syn-op #'identity) (env *environment*))
|
(syn-op #'identity) (env *environment*))
|
||||||
(actor:create (neuron proc state (list (synapse syn-target syn-op)) env)))
|
(let ((syns (if syn-target (list (synapse syn-target syn-op)) nil)))
|
||||||
|
(actor:create (neuron proc state syns env))))
|
||||||
|
|
||||||
(defun update-neuron (proc state syns &optional (env *environment*))
|
(defun update-neuron (proc state syns &optional (env *environment*))
|
||||||
(actor:become (neuron proc state syns env)))
|
(actor:become (neuron proc state syns env)))
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,11 @@
|
||||||
(let ((t:*test-suite* (test-suite env))
|
(let ((t:*test-suite* (test-suite env))
|
||||||
(val (shape:data msg)))
|
(val (shape:data msg)))
|
||||||
(util:lgi msg state)
|
(util:lgi msg state)
|
||||||
|
(destructuring-bind (msg state syns)
|
||||||
|
(csys:handle-action msg state syns env)
|
||||||
(unless (consp val)
|
(unless (consp val)
|
||||||
(let ((nst (in-seq val state :remove t)))
|
(let ((nst (in-seq val state :remove t)))
|
||||||
(csys:update-neuron #'probe nst syns env)))))
|
(csys:update-neuron #'probe nst syns env))))))
|
||||||
|
|
||||||
(defun add (msg state syns env)
|
(defun add (msg state syns env)
|
||||||
(list msg (+ (shape:data msg) state) syns env))
|
(list msg (+ (shape:data msg) state) syns env))
|
||||||
|
|
@ -40,9 +42,8 @@
|
||||||
(async:init)
|
(async:init)
|
||||||
(let* ((t:*test-suite* (make-instance 't:test-suite :name "csys"))
|
(let* ((t:*test-suite* (make-instance 't:test-suite :name "csys"))
|
||||||
(csys:*environment* (make-instance 'test-env :test-suite t:*test-suite*))
|
(csys:*environment* (make-instance 'test-env :test-suite t:*test-suite*))
|
||||||
(probe (actor:create
|
(probe (csys:make-neuron nil :proc #'probe :state '(1 3 4 5)
|
||||||
(csys:neuron #'probe '(1 3 4 5)
|
:env csys:*environment*)))
|
||||||
nil csys:*environment*))))
|
|
||||||
(load (t:test-path "config-csys" "etc"))
|
(load (t:test-path "config-csys" "etc"))
|
||||||
(core:setup-services)
|
(core:setup-services)
|
||||||
(unwind-protect
|
(unwind-protect
|
||||||
|
|
@ -53,7 +54,7 @@
|
||||||
(t:show-result))))
|
(t:show-result))))
|
||||||
|
|
||||||
(deftest test-init (probe)
|
(deftest test-init (probe)
|
||||||
;(setf (gethash '(:std :d0) (csys:detectors csys:*environment*)) probe)
|
;(setf (gethash '(:std :d0) (csys:effectors csys:*environment*)) probe)
|
||||||
(csys:init probe)
|
(csys:init probe)
|
||||||
(csys:send-message '(:csys :sensor :init :zero) '(:std :s1))
|
(csys:send-message '(:csys :sensor :init :zero) '(:std :s1))
|
||||||
(csys:send-message '(:csys :sensor :init :zero) '(:std :s2))
|
(csys:send-message '(:csys :sensor :init :zero) '(:std :s2))
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
(defun make-vars-format (vars &optional info)
|
(defun make-vars-format (vars &optional info)
|
||||||
(let ((prefix (if info (format nil "~a: " info) "")))
|
(let ((prefix (if info (format nil "~a: " info) "")))
|
||||||
(format nil "~a~{~(~a~): ~~S ~}" prefix vars)))
|
(format nil "~a~{~(~a~): ~~A ~}" prefix vars)))
|
||||||
|
|
||||||
(defmacro lg (level info &rest vars)
|
(defmacro lg (level info &rest vars)
|
||||||
(let ((lm (find-symbol (string level) :log))
|
(let ((lm (find-symbol (string level) :log))
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue