From e0695100b5f863abe0d555635c422b38f4239c54 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 15 Mar 2016 19:00:52 +0200 Subject: [PATCH 1/7] actors refactoring second attempt logging --- .gitignore | 3 +- project.clj | 3 +- src/narjure/actor/active_concept_collator.clj | 28 ++ .../actor/active_concept_collator_actor.clj | 31 --- src/narjure/actor/anticipated_event.clj | 36 +++ src/narjure/actor/anticipated_event_actor.clj | 38 --- src/narjure/actor/concept.clj | 69 +++-- src/narjure/actor/concept_creator.clj | 38 +++ src/narjure/actor/concept_creator_actor.clj | 50 ---- src/narjure/actor/cross_modal_integrator.clj | 29 +++ .../actor/cross_modal_integrator_actor.clj | 33 --- src/narjure/actor/derived_task_creator.clj | 26 ++ .../actor/derived_task_creator_actor.clj | 32 --- .../actor/forgettable_concept_collator.clj | 27 ++ .../forgettable_concept_collator_actor.clj | 31 --- src/narjure/actor/general_inferencer.clj | 24 ++ .../actor/general_inferencer_actor.clj | 25 -- src/narjure/actor/logger.clj | 73 ------ src/narjure/actor/operator_executor.clj | 31 +++ src/narjure/actor/operator_executor_actor.clj | 35 --- src/narjure/actor/persistence_manager.clj | 22 ++ .../actor/persistence_manager_actor.clj | 25 -- src/narjure/actor/sentence_parser.clj | 43 ++++ src/narjure/actor/sentence_parser_actor.clj | 45 ---- src/narjure/actor/system_time.clj | 23 ++ src/narjure/actor/system_time_actor.clj | 26 -- src/narjure/actor/task_dispatcher.clj | 37 +++ src/narjure/actor/task_dispatcher_actor.clj | 54 ---- src/narjure/actor/utils.clj | 19 ++ src/narjure/core.clj | 239 +++++++++--------- src/narjure/defaults.clj | 2 - 31 files changed, 536 insertions(+), 661 deletions(-) create mode 100644 src/narjure/actor/active_concept_collator.clj delete mode 100644 src/narjure/actor/active_concept_collator_actor.clj create mode 100644 src/narjure/actor/anticipated_event.clj delete mode 100644 src/narjure/actor/anticipated_event_actor.clj create mode 100644 src/narjure/actor/concept_creator.clj delete mode 100644 src/narjure/actor/concept_creator_actor.clj create mode 100644 src/narjure/actor/cross_modal_integrator.clj delete mode 100644 src/narjure/actor/cross_modal_integrator_actor.clj create mode 100644 src/narjure/actor/derived_task_creator.clj delete mode 100644 src/narjure/actor/derived_task_creator_actor.clj create mode 100644 src/narjure/actor/forgettable_concept_collator.clj delete mode 100644 src/narjure/actor/forgettable_concept_collator_actor.clj create mode 100644 src/narjure/actor/general_inferencer.clj delete mode 100644 src/narjure/actor/general_inferencer_actor.clj delete mode 100644 src/narjure/actor/logger.clj create mode 100644 src/narjure/actor/operator_executor.clj delete mode 100644 src/narjure/actor/operator_executor_actor.clj create mode 100644 src/narjure/actor/persistence_manager.clj delete mode 100644 src/narjure/actor/persistence_manager_actor.clj create mode 100644 src/narjure/actor/sentence_parser.clj delete mode 100644 src/narjure/actor/sentence_parser_actor.clj create mode 100644 src/narjure/actor/system_time.clj delete mode 100644 src/narjure/actor/system_time_actor.clj create mode 100644 src/narjure/actor/task_dispatcher.clj delete mode 100644 src/narjure/actor/task_dispatcher_actor.clj create mode 100644 src/narjure/actor/utils.clj diff --git a/.gitignore b/.gitignore index 1501004..1b10558 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ pom.xml.asc *.iml *~ \#*\# -.\#* \ No newline at end of file +.\#* +*experiments.clj diff --git a/project.clj b/project.clj index fab8965..8a60a99 100644 --- a/project.clj +++ b/project.clj @@ -11,7 +11,8 @@ [org.clojure/data.priority-map "0.0.7"] [co.paralleluniverse/pulsar "0.7.4"] [org.immutant/immutant "2.1.2"] - [clj-time "0.11.0"]] + [clj-time "0.11.0"] + [com.taoensso/timbre "4.3.1"]] :java-agents [[co.paralleluniverse/quasar-core "0.7.4"]] :main ^:skip-aot narjure.core :plugins [[lein-cloverage "1.0.6"] diff --git a/src/narjure/actor/active_concept_collator.clj b/src/narjure/actor/active_concept_collator.clj new file mode 100644 index 0000000..125905c --- /dev/null +++ b/src/narjure/actor/active_concept_collator.clj @@ -0,0 +1,28 @@ +(ns narjure.actor.active-concept-collator + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare process active-concept-collator) + +(def aname :active-concept-collator) + +(defsfn active-concept-collator + "State is collection of active concepts." + [] + (register! aname @self) + (set-state! []) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :inference-tick-msg [_ _] + ;(debug aname "process-inference-tick") + []) + +(defmethod process :active-concept-msg [_ _] + (debug aname "process-active-concept")) diff --git a/src/narjure/actor/active_concept_collator_actor.clj b/src/narjure/actor/active_concept_collator_actor.clj deleted file mode 100644 index 7f52607..0000000 --- a/src/narjure/actor/active_concept_collator_actor.clj +++ /dev/null @@ -1,31 +0,0 @@ -(ns narjure.actor.active-concept-collator-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-inference-tick) -(declare process-active-concept) -(declare active-concept-collator-actor) - -(defsfn active-concept-collator-actor - "state is collection of active concepts" - [] - (register! :active-concept-collator @self) - (set-state! []) - (loop [] - (receive [msg] - :inference-tick-msg (set-state! (process-inference-tick @state)) - [:active-concept-msg active-concept] (process-active-concept active-concept @state) - :else (! :logger [:log-msg :log-debug :active-concept-collator "unhandled msg"])) - (recur))) - -(defn process-inference-tick [state] - ;(! :logger [:log-msg :log-debug :active-concept-collator "process-inference-tick"]) - []) - -(defn process-active-concept [_ _] - (! :logger [:log-msg :log-debug :active-concept-collator "process-active-concept"])) \ No newline at end of file diff --git a/src/narjure/actor/anticipated_event.clj b/src/narjure/actor/anticipated_event.clj new file mode 100644 index 0000000..e9b4ff4 --- /dev/null +++ b/src/narjure/actor/anticipated_event.clj @@ -0,0 +1,36 @@ +(ns narjure.actor.anticipated-event + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self !]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare anticipated-event process) + +(def aname :anticipated-event) + +(defsfn anticipated-event + "State is system-time and collection of anticipated events." + [] + (register! aname @self) + (set-state! {:time 0 :anticipated-events {}}) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :system-time-msg + [[_ time] state] + (debug aname "process-system-time") + {:time time :anticipated-events (state :percepts)}) + +(defmethod process :anticipated-event-msg + [_ _] + #_(debug aname "process-anticipated-event")) + +(defmethod process :input-task-msg + [[_ input-task] _] + #_(debug aname "process-input-task") + (! :task-dispatcher [:task-msg input-task])) + diff --git a/src/narjure/actor/anticipated_event_actor.clj b/src/narjure/actor/anticipated_event_actor.clj deleted file mode 100644 index 4e78078..0000000 --- a/src/narjure/actor/anticipated_event_actor.clj +++ /dev/null @@ -1,38 +0,0 @@ -(ns narjure.actor.anticipated-event-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time) -(declare process-input-task) -(declare process-anticipated-event) -(declare anticipated-event-actor) - -(defsfn anticipated-event-actor - "state is system-time and collection of anticipated events" - [] - (register! :anticipated-event @self) - (set-state! {:time 0 :anticipated-events {}}) - (loop [] - (receive [msg] - [:system-time-msg time] (set-state! (process-system-time time @state)) - [:input-task-msg input-task] (set-state! (process-input-task input-task @state)) - [:anticipated-event-msg anticipated-event] (set-state! (process-anticipated-event anticipated-event @state)) - :else (! :logger [:log-msg :log-debug :anticipated-event (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time [time state] - (! :logger [:log-msg :log-debug :anticipated-event "process-system-time"]) - {:time time :anticipated-events (state :percepts)}) - -(defn process-anticipated-event [_ _] - ;(! :logger [:log-msg :log-debug :anticipated-event "process-anticipated-event"]) - ) - -(defn process-input-task [input-task _] - ;(! :logger [:log-msg :log-debug :anticipated-event "process-input-task"]) - (! :task-dispatcher [:task-msg input-task])) diff --git a/src/narjure/actor/concept.clj b/src/narjure/actor/concept.clj index 96e4491..d5fc55b 100644 --- a/src/narjure/actor/concept.clj +++ b/src/narjure/actor/concept.clj @@ -1,41 +1,34 @@ (ns narjure.actor.concept (:require [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-task) -(declare process-belief-req) -(declare process-inference-req) -(declare process-persistence-req) -(declare concept-actor) - -(defsfn concept-actor - "state is a map {:name :budget :activation-level :belief-tab :goal-tab :task-bag :term-bag} - (this list may not be complete)" - [] - (set-state! {}) - (loop [] - (receive [msg] - [:task-msg task] (set-state! (process-task task @state)) - [:belief-request-msg belief-req] (set-state! (process-belief-req belief-req @state)) - [:inference-request-msg inference-req] (set-state! (process-inference-req inference-req @state)) - [:persistence-request-msg presistence-req] (set-state! (process-persistence-req presistence-req @state)) - :else (! :logger [:log-msg :log-debug :concept (str "unhandled msg:" msg)])) - (recur))) - -(defn process-task [_ _] - ;(! :logger [:log-msg :log-debug :concept "process-task"]) - ) - -(defn process-belief-req [_ _] - (! :logger [:log-msg :log-debug :concept "process-belief-req"])) - -(defn process-inference-req [_ _] - (! :logger [:log-msg :log-debug :concept "process-inference-req"])) - -(defn process-persistence-req [_ _] - (! :logger [:log-msg :log-debug :concept "process-persistence-req"])) + [core :refer [defsfn]] + [actors :refer [register! set-state!]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :as t]) + (:refer-clojure :exclude [promise await])) + +(declare concept process) + +(defsfn concept + "State is a map + {:name :budget :activation-level :belief-tab :goal-tab :task-bag :term-bag} + (this list may not be complete)." + [] + (set-state! {}) + (actor-loop :concept process)) + +(defhandler process) + +(defn debug [msg] (t/debug :concept msg)) + +(defmethod process :task [_ _] + #_(debug "process-task")) + +(defmethod process :belief-req [_ _] + (debug "process-belief-req")) + +(defmethod process :inference-req [_ _] + (debug "process-inference-req")) + +(defmethod process :persistence-req [_ _] + (debug "process-persistence-req")) diff --git a/src/narjure/actor/concept_creator.clj b/src/narjure/actor/concept_creator.clj new file mode 100644 index 0000000..7c04edc --- /dev/null +++ b/src/narjure/actor/concept_creator.clj @@ -0,0 +1,38 @@ +(ns narjure.actor.concept-creator + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self ! spawn]]] + [narjure.actor.concept :refer [concept]] + [narjure.actor.utils :refer [actor-loop]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare concept-creator process-task) + +(def aname :concept-creator) + +(defsfn concept-creator + [] + (register! aname @self) + (actor-loop aname process-task)) + +(defn create-concept + ;TODO: update state for concept-actor to state initialiser + ;TODO: Create required sub-term concepts and propogate budget + [task c-map] + (let [{term :term} task] + (swap! c-map assoc term (spawn concept)) + #_(debug aname (str "Created concept: " term)))) + +(defn process-task + "When concept-map does not contain :term, create concept actor for term + then post task to task-dispatcher either way." + [[_ from task c-map] _] + (let [term (task :term)] + ; when concept not exist then create - goes here + (when (not (contains? @c-map term)) + (create-concept task c-map))) + + (! from [:task-msg task]) + #_(debug aname "concept-creator - process-task")) diff --git a/src/narjure/actor/concept_creator_actor.clj b/src/narjure/actor/concept_creator_actor.clj deleted file mode 100644 index e86e157..0000000 --- a/src/narjure/actor/concept_creator_actor.clj +++ /dev/null @@ -1,50 +0,0 @@ -(ns narjure.actor.concept-creator-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ] - [narjure.actor.concept :refer [concept-actor]] - ) - (:refer-clojure :exclude [promise await]) - ) - -(declare create-concept) -(declare process-task) -(declare concept-creator-actor) - -(defsfn concept-creator-actor - "" - [] - - (register! :concept-creator @self) - (loop [] - (receive [msg] - [:create-concept-msg from task c-map] (process-task from task c-map) - :else (! :logger [:log-msg :log-debug :concept-creator (str "unhandled msg:" msg)])) - (recur))) - -(defn create-concept - "TODO: update state for concept-actor to state initialiser - TODO: Create required sub-term concepts and propogate budget - " - [task c-map] - (let [{term :term} task] - (swap! c-map assoc term (spawn concept-actor)) - ;(! :logger [:log-msg :log-debug :concept-creator (str "Created concept: " term)]) - ) - ) - -(defn process-task - "When concept-map does not contain :term, create concept actor for term - then post task to task-dispatcher either way - " - [from task c-map] - (let [term (task :term)] - ; when concept not exist then create - goes here - (when (not (contains? @c-map term)) - (create-concept task c-map))) - - (! from [:task-msg task]) - ;(! :logger [:log-msg :log-debug :concept-creator "concept-creator - process-task"]) - ) diff --git a/src/narjure/actor/cross_modal_integrator.clj b/src/narjure/actor/cross_modal_integrator.clj new file mode 100644 index 0000000..629ce6f --- /dev/null +++ b/src/narjure/actor/cross_modal_integrator.clj @@ -0,0 +1,29 @@ +(ns narjure.actor.cross-modal-integrator + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare cross-modal-integrator process) + +(def aname :cross-modal-integrator) + +(defsfn cross-modal-integrator + "State is system-time and collection of precepts from current duration window." + [] + (register! :cross-modal-integrator @self) + (set-state! {:time 0 :percepts []}) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :system-time [[_ time] state] + (debug aname "process-system-time") + {:time time :percepts (state :percepts)}) + +(defmethod process :percept-sentence [_ _] + (debug aname "process-percept-sentence")) + diff --git a/src/narjure/actor/cross_modal_integrator_actor.clj b/src/narjure/actor/cross_modal_integrator_actor.clj deleted file mode 100644 index 93a2662..0000000 --- a/src/narjure/actor/cross_modal_integrator_actor.clj +++ /dev/null @@ -1,33 +0,0 @@ -(ns narjure.actor.cross-modal-integrator-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ] - [narjure.defaults :refer [serial-no]]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time) -(declare process-percept-sentence) -(declare cross-modal-integrator-actor) - -(defsfn cross-modal-integrator-actor - "state is system-time and collection of precepts from current duration window" - [] - (register! :cross-modal-integrator @self) - (set-state! {:time 0 :percepts []}) - (loop [] - (receive [msg] - [:system-time-msg time] (set-state! (process-system-time time @state)) - [:percept-sentence-msg percept-sentence] (set-state! (process-percept-sentence percept-sentence @state)) - :else (! :logger [:log-msg :log-debug :cross-modal-integrator (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time [time state] - (! :logger [:log-msg :log-debug :cross-modal-integrator "process-system-time"]) - {:time time :percepts (state :percepts)}) - -(defn process-percept-sentence [_ _] - (! :logger [:log-msg :log-debug :cross-modal-integrator "process-percept-sentence"])) - diff --git a/src/narjure/actor/derived_task_creator.clj b/src/narjure/actor/derived_task_creator.clj new file mode 100644 index 0000000..dca6406 --- /dev/null +++ b/src/narjure/actor/derived_task_creator.clj @@ -0,0 +1,26 @@ +(ns narjure.actor.derived-task-creator + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare derived-task-creator process) + +(def aname :derived-task-creator) + +(defsfn derived-task-creator + "State is system-time." + [] + (register! aname @self) + (set-state! {:time 0}) + (actor-loop aname process)) + +(defn process-system-time [[_ time] _] + (debug aname "process-system-time") + {:time time}) + +(defn process-inference-result [_ _] + (debug aname "process-inference-result")) diff --git a/src/narjure/actor/derived_task_creator_actor.clj b/src/narjure/actor/derived_task_creator_actor.clj deleted file mode 100644 index cba83be..0000000 --- a/src/narjure/actor/derived_task_creator_actor.clj +++ /dev/null @@ -1,32 +0,0 @@ -(ns narjure.actor.derived-task-creator-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time) -(declare process-inference-result) -(declare derived-task-creator-actor) - -(defsfn derived-task-creator-actor - "state is system-time" - [] - (register! :derived-task-creator @self) - (set-state! {:time 0}) - (loop [] - (receive [msg] - [:system-time-msg time] (set-state! (process-system-time time @state)) - [:inference-result-msg inference-result] (process-inference-result inference-result @state) - :else (! :logger [:log-msg :log-debug :derived-task-creator (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time [time state] - (! :logger [:log-msg :log-debug :derived-task-creator "process-system-time"]) - {:time time}) - -(defn process-inference-result [_ _] - (! :logger [:log-msg :log-debug :derived-task-creator "process-inference-result"])) - diff --git a/src/narjure/actor/forgettable_concept_collator.clj b/src/narjure/actor/forgettable_concept_collator.clj new file mode 100644 index 0000000..7ca91eb --- /dev/null +++ b/src/narjure/actor/forgettable_concept_collator.clj @@ -0,0 +1,27 @@ +(ns narjure.actor.forgettable-concept-collator + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare forgettable-concept-collator process) + +(def aname :forgettable-concept-collator) + +(defsfn forgettable-concept-collator + "State is collection of forgettable concepts." + [] + (register! :forgettable-concept-collator @self) + (set-state! []) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :forgetting-tick-msg [_ _] + #_(debug aname "process-forgetting-tick")) + +(defmethod process :forgettable-concept-msg [_ _] + (debug aname "process-forgettable-concept")) diff --git a/src/narjure/actor/forgettable_concept_collator_actor.clj b/src/narjure/actor/forgettable_concept_collator_actor.clj deleted file mode 100644 index 6b3bbaa..0000000 --- a/src/narjure/actor/forgettable_concept_collator_actor.clj +++ /dev/null @@ -1,31 +0,0 @@ -(ns narjure.actor.forgettable-concept-collator-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-forgetting-tick) -(declare process-forgettable-concept) -(declare forgettable-concept-collator-actor) - -(defsfn forgettable-concept-collator-actor - "state is collection of forgettable concepts" - [] - (register! :forgettable-concept-collator @self) - (set-state! []) - (loop [] - (receive [msg] - :forgetting-tick-msg (set-state! (process-forgetting-tick @state)) - [:forgettable-concept-msg forgettable-concept] (process-forgettable-concept forgettable-concept @state) - :else (! :logger [:log-msg :log-debug :forgettable-concept-collator (str "unhandled msg:" msg)])) - (recur))) - -(defn process-forgetting-tick [_] - ;(! :logger [:log-msg :log-debug :forgettable-concept-collator "process-forgetting-tick"]) - ) - -(defn process-forgettable-concept [_ _] - (! :logger [:log-msg :log-debug :forgettable-concept-collator "process-forgettable-concept"])) diff --git a/src/narjure/actor/general_inferencer.clj b/src/narjure/actor/general_inferencer.clj new file mode 100644 index 0000000..a2ad66b --- /dev/null +++ b/src/narjure/actor/general_inferencer.clj @@ -0,0 +1,24 @@ +(ns narjure.actor.general-inferencer + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare general-inferencer do-inference) + +(def aname :general-inferencer) + +(defsfn general-inferencer + "state is inference rule trie or equivalent" + [] + (register! aname @self) + (set-state! {:trie 0}) + (actor-loop aname do-inference)) + +(defn do-inference [_ _] + (debug aname "process-do-inference")) + + diff --git a/src/narjure/actor/general_inferencer_actor.clj b/src/narjure/actor/general_inferencer_actor.clj deleted file mode 100644 index 8d33981..0000000 --- a/src/narjure/actor/general_inferencer_actor.clj +++ /dev/null @@ -1,25 +0,0 @@ -(ns narjure.actor.general-inferencer-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-do-inference) -(declare general-inferencer-actor) - -(defsfn general-inferencer-actor - "state is inference rule trie or equivalent" - [] - (register! :general-inferencer @self) - (set-state! {:trie 0}) - (loop [] - (receive [msg] - [:do-inference-msg inference-package] (set-state! (process-do-inference inference-package @state)) - :else (! :logger [:log-msg :log-debug :general-inferencer (str "unhandled msg:" msg)])) - (recur))) - -(defn process-do-inference [_ _] - (! :logger [:log-msg :log-debug :general-inferencer "process-do-inference"])) diff --git a/src/narjure/actor/logger.clj b/src/narjure/actor/logger.clj deleted file mode 100644 index 7fdc4d9..0000000 --- a/src/narjure/actor/logger.clj +++ /dev/null @@ -1,73 +0,0 @@ -(ns narjure.actor.logger - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ] - [clj-time.local :as l]) - (:refer-clojure :exclude [promise await]) - ) - -(declare log-level-string) -(declare print-log-msg) -(declare process-log-msg) -(declare logger) - -(defsfn logger - "Actor that provides a message log to stdio service. - Ensures multiple thread println do not clash - - useage: (! :logger [msg-type args]) - - where msg-type can be: - - :log-level - sets the logger logging level - arg - :log-debug | :log-error | :log-warning | :log-info - - :log-msg - prints a log message to stdio specifying the requesting actor - args - log-level - :log-debug | :log-error | :log-warning | :log-info - from - key representing the actor that sent the :log-msg, can be :anon - msg-string - string message to output - - Examples :- - (! :logger [:log-level :log-info]) - (! :logger [:log-msg :log-debug :task-dispatcher \"processing task\"]) - (! :logger [:log-msg :log-debug :anon \"processing task\"]) - " - [in-log-level] - - ; register logger actor as :logger - (register! :logger @self) - ; set state to input arg - (set-state! in-log-level) - (loop [] - (receive [msg] - [:log-level level] (set-state! level) - [:log-msg log-level from msg-string] (process-log-msg log-level from msg-string) - :else (print-log-msg :log-info :logger (str "unhandled msg" msg))) - (recur))) - -(def log-level-string {:log-debug "[DEBUG]" :log-error "[ERROR]" :log-warning "[WARNING]" :log-info "[INFO]" }) - -(defn print-log-msg - "Print local time, log-level, requesting actor and log-msg to standard out - " - [log-level from msg-string] - (if (= from :anon) - (println (str (l/local-now)) (log-level-string log-level) msg-string) - (println (str (l/local-now)) (log-level-string log-level) (str from) msg-string)) - ) - -(defn process-log-msg - "If msg log-level is in log level set (state) then output log-msg. - state is the curently set global log-level and can be: - :log-debug :log-warning :log-error :log-info - " - [log-level from msg-string] - (case @state - :log-debug (when (#{:log-debug :log-warning :log-error :log-info} log-level) (print-log-msg log-level from msg-string)) - :log-error (when (#{:log-warning :log-error :log-info} log-level) (print-log-msg log-level from msg-string)) - :log-warning (when (#{:log-warning :log-info} log-level) (print-log-msg log-level from msg-string)) - :log-info (when (#{:log-info} log-level) (print-log-msg log-level from msg-string)))) diff --git a/src/narjure/actor/operator_executor.clj b/src/narjure/actor/operator_executor.clj new file mode 100644 index 0000000..35bf967 --- /dev/null +++ b/src/narjure/actor/operator_executor.clj @@ -0,0 +1,31 @@ +(ns narjure.actor.operator-executor + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare operator-executor process) + +(def aname :operator-executor) + +(defsfn operator-executor + "state is system-time" + [] + (register! aname @self) + (set-state! {:time 0}) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :system-time-msg [[_ time] _] + (debug aname "process-system-time") + {:time time}) + +(defmethod process :operator-execution-req-msg [_ _] + (debug aname "process-operator-execution-req")) + + + diff --git a/src/narjure/actor/operator_executor_actor.clj b/src/narjure/actor/operator_executor_actor.clj deleted file mode 100644 index 9be7d1a..0000000 --- a/src/narjure/actor/operator_executor_actor.clj +++ /dev/null @@ -1,35 +0,0 @@ -(ns narjure.actor.operator-executor-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ] - [narjure.defaults :refer [serial-no]]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time) -(declare process-operator-execution-req) -(declare operator-executor-actor) - -(defsfn operator-executor-actor - "state is system-time" - [] - (register! :operator-executor @self) - (set-state! {:time 0}) - (loop [] - (receive [msg] - [:system-time-msg time] (set-state! (process-system-time time @state)) - [:operator-execution-req-msg operator-execution-req] (process-operator-execution-req operator-execution-req @state) - :else (! :logger [:log-msg :log-debug :operator-executor (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time [time state] - (! :logger [:log-msg :log-debug :operator-executor "process-system-time"]) - {:time time}) - -(defn process-operator-execution-req [_ _] - (! :logger [:log-msg :log-debug :operator-executor "process-operator-execution-req"])) - - - diff --git a/src/narjure/actor/persistence_manager.clj b/src/narjure/actor/persistence_manager.clj new file mode 100644 index 0000000..0b4b9e1 --- /dev/null +++ b/src/narjure/actor/persistence_manager.clj @@ -0,0 +1,22 @@ +(ns narjure.actor.persistence-manager + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare concept-state persistence-manager) + +(def aname :persistence-manager) + +(defsfn persistence-manager + "state is file system handles" + [in-state] + (register! aname @self) + (set-state! in-state) + (actor-loop aname concept-state)) + +(defn concept-state [_ _] + (debug aname "process-concept-state")) diff --git a/src/narjure/actor/persistence_manager_actor.clj b/src/narjure/actor/persistence_manager_actor.clj deleted file mode 100644 index 689df31..0000000 --- a/src/narjure/actor/persistence_manager_actor.clj +++ /dev/null @@ -1,25 +0,0 @@ -(ns narjure.actor.persistence-manager-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-concept-state) -(declare persistence-manager-actor) - -(defsfn persistence-manager-actor - "state is file system handles" - [in-state] - (register! :persistence-manager @self) - (set-state! in-state) - (loop [] - (receive [msg] - [:concept-state-msg concept-state] (set-state! (process-concept-state concept-state @state)) - :else (! :logger [:log-msg :log-debug :persistence-manager (str "unhandled msg:" msg)])) - (recur))) - -(defn process-concept-state [_ _] - (! :logger [:log-msg :log-debug :persistence-manager "process-concept-state"])) diff --git a/src/narjure/actor/sentence_parser.clj b/src/narjure/actor/sentence_parser.clj new file mode 100644 index 0000000..09fba42 --- /dev/null +++ b/src/narjure/actor/sentence_parser.clj @@ -0,0 +1,43 @@ +(ns narjure.actor.sentence-parser + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self !]]] + [narjure.narsese :refer [parse]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug info]]) + (:refer-clojure :exclude [promise await])) + +(declare sentence-parser process) + +(def aname :sentence-parser) + +(def serial-no (atom 0)) + +(defsfn sentence-parser + [] + (register! aname @self) + (set-state! {:time 0}) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :system-time-msg [[_ time] _] + (debug aname "process-system-time") + {:time time}) + +(defn parse-task + "Parses a narsese string." + [string system-time] + (assoc (parse string) + :stamp + {:id (swap! serial-no inc) + :creation-time system-time + :occurrence-time system-time + :trail [serial-no]})) + +(defmethod process :narsese-string-msg + [[_ string] {time :time}] + (let [task (parse-task string time)] + (! :anticipated-event [:input-task-msg task]) + (info aname (str "process-narsese-string" task)))) diff --git a/src/narjure/actor/sentence_parser_actor.clj b/src/narjure/actor/sentence_parser_actor.clj deleted file mode 100644 index 31fd89f..0000000 --- a/src/narjure/actor/sentence_parser_actor.clj +++ /dev/null @@ -1,45 +0,0 @@ -(ns narjure.actor.sentence-parser-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ] - [narjure.narsese :refer [parse]] - [narjure.defaults :refer [serial-no]]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time) -(declare process-narsese-string) -(declare sentence-parser-actor) - -(defsfn sentence-parser-actor - "Example format for using actor with set-state! on recursion. - Usage: (def actor (spawn actor [state])) - This example uses a map for state {:id 0} and increments value on recursion - state is system-time" - [] - (register! :sentence-parser @self) - (set-state! {:time 0}) - (loop [] - (receive [msg] - [:system-time-msg time] (set-state! (process-system-time time @state)) - [:narsese-string-msg string] (set-state! (process-narsese-string string @state)) - :else (! :logger [:log-msg :log-debug :sentence-parser (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time [time state] - (! :logger [:log-msg :log-debug :sentence-parser "process-system-time"]) - {:time time}) - -(defn create-stamp-for-input-task [system-time serial-no] - {:id serial-no :creation-time system-time :occurence-time system-time :trail [serial-no]}) - -(defn process-narsese-string - "Parses a narsese string and converts tense to occurence time - and adds a stamp {id: id :creation-time system-time :occurence-time occurence-time :trail []} - " - [string state] - (let [task (assoc (parse string) :stamp (create-stamp-for-input-task (:time state) (swap! serial-no inc)))] - (! :anticipated-event [:input-task-msg task]) - (! :logger [:log-msg :log-info :sentence-parser (str "process-narsese-string" task)]))) diff --git a/src/narjure/actor/system_time.clj b/src/narjure/actor/system_time.clj new file mode 100644 index 0000000..d923220 --- /dev/null +++ b/src/narjure/actor/system_time.clj @@ -0,0 +1,23 @@ +(ns narjure.actor.system-time + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self]]] + [narjure.actor.utils :refer [actor-loop]] + [taoensso.timbre :refer [debug]]) + (:refer-clojure :exclude [promise await])) + +(declare system-time system-time-tick) + +(def aname :system-time) + +(defsfn system-time + "state is system-time" + [] + (register! aname @self) + (set-state! 0) + (actor-loop aname system-time-tick)) + +(defn system-time-tick [_ state] + ;(debug aname (str "process-system-time-tick " state)) + (inc state)) diff --git a/src/narjure/actor/system_time_actor.clj b/src/narjure/actor/system_time_actor.clj deleted file mode 100644 index bae65a0..0000000 --- a/src/narjure/actor/system_time_actor.clj +++ /dev/null @@ -1,26 +0,0 @@ -(ns narjure.actor.system-time-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare process-system-time-tick) -(declare system-time-actor) - -(defsfn system-time-actor - "state is system-time" - [] - (register! :system-time @self) - (set-state! 0) - (loop [] - (receive [msg] - :system-time-tick-msg (set-state! (process-system-time-tick @state)) - :else (! :logger [:log-msg :log-debug :system-time (str "unhandled msg:" msg)])) - (recur))) - -(defn process-system-time-tick [state] - ;(! :logger [:log-msg :log-debug :system-time (str "process-system-time-tick " state)]) - (inc state)) diff --git a/src/narjure/actor/task_dispatcher.clj b/src/narjure/actor/task_dispatcher.clj new file mode 100644 index 0000000..5fed054 --- /dev/null +++ b/src/narjure/actor/task_dispatcher.clj @@ -0,0 +1,37 @@ +(ns narjure.actor.task-dispatcher + (:require + [co.paralleluniverse.pulsar + [core :refer [defsfn]] + [actors :refer [register! set-state! self ! whereis]]] + [narjure.actor.utils :refer [actor-loop defhandler]] + [taoensso.timbre :refer [debug info]]) + (:refer-clojure :exclude [promise await])) + +(declare task-dispatcher process) + +(def aname :task-dispatcher) +(def c-map (atom {})) + +(defsfn task-dispatcher + "concept-map is atom {:term :actor-ref} shared between + task-dispatcher and concept-creator" + [] + (register! aname @self) + (actor-loop aname process)) + +(defhandler process) + +(defmethod process :task-msg + [[_ input-task] _] + (let [concept-creator (whereis :concept-creator) + term (input-task :term)] + (if-let [concept (@c-map term)] + (! concept :task-msg input-task) + (! concept-creator [:create-concept-msg @self input-task c-map]))) + #_(debug aname (str "process-task" input-task))) + +(defmethod process :forget-concept-msg [[_ forget-concept] _] + (debug aname "process-forget-concept")) + +(defmethod process :concept-count-msg [_ _] + (info aname (format "Concept count[%s]" (count @c-map)))) diff --git a/src/narjure/actor/task_dispatcher_actor.clj b/src/narjure/actor/task_dispatcher_actor.clj deleted file mode 100644 index df0277d..0000000 --- a/src/narjure/actor/task_dispatcher_actor.clj +++ /dev/null @@ -1,54 +0,0 @@ -(ns narjure.actor.task-dispatcher-actor - (:require - [co.paralleluniverse.pulsar - [core :refer :all] - [actors :refer :all] - ]) - (:refer-clojure :exclude [promise await]) - ) - -(declare c-map) -(declare process-task) -(declare process-forget-concept) -(declare process-concept-count) -(declare task-dispatcher-actor) - -(defsfn task-dispatcher-actor - "concept-map is atom {:term :actor-ref} shared between - task-dispatcher and concept-creator - " - [] - - (register! :task-dispatcher @self) - (def concept-creator (whereis :concept-creator)) - (loop [] - (receive [msg] - [:task-msg input-task] (process-task input-task c-map concept-creator) - [:forget-concept-msg forget-concept] (process-forget-concept forget-concept) - :concept-count (process-concept-count c-map) - :else (! :logger [:log-msg :log-debug :task-dispatcher (str "unhandled msg:" msg)])) - (recur))) - -(def c-map (atom {})) - -(defn process-task - - "Takes inut task and checks to see if concept exists, - if not sends task to concept-creator else posts task to - relevant concept actor - " - [input-task c-map concept-creator] - (let [term (input-task :term)] - (if (contains? @c-map term) - (! (@c-map term) :task-msg input-task) - (! concept-creator [:create-concept-msg @self input-task c-map]))) - ;(! :logger [:log-msg :log-debug :task-dispatcher (str "process-task" input-task)]) - ) - -(defn process-forget-concept [forget-concept] - (! :logger [:log-msg :log-debug :task-dispatcher "process-forget-concept"])) - -(defn process-concept-count [c-map] - ;(println (str (keys @c-map))) - (! :logger [:log-msg :log-info :task-dispatcher (str "Concept count[" (count @c-map) "]")]) - ) diff --git a/src/narjure/actor/utils.clj b/src/narjure/actor/utils.clj new file mode 100644 index 0000000..4ba315e --- /dev/null +++ b/src/narjure/actor/utils.clj @@ -0,0 +1,19 @@ +(ns narjure.actor.utils + (:require + [co.paralleluniverse.pulsar + [actors :refer [set-state! state receive !]]] + [taoensso.timbre :refer [debug]])) + +(defmacro defhandler [name] + `(do + (defmulti ~name (fn [[t#] c#] t#)) + (defmethod ~name :default [a# b#] :unhandled))) + +(defmacro actor-loop [name f] + `(loop [] + (let [msg# (receive) + result# (~f msg# @state)] + (if (= :unhandled result#) + (debug ~name (str "unhandled msg:" msg#)) + (set-state! result#)) + (recur)))) diff --git a/src/narjure/core.clj b/src/narjure/core.clj index d39e6a1..f0dbeb8 100644 --- a/src/narjure/core.clj +++ b/src/narjure/core.clj @@ -2,146 +2,143 @@ (:require [co.paralleluniverse.pulsar [core :refer :all] - [actors :refer :all] - ] + [actors :refer :all]] [immutant.scheduling :refer :all] - [narjure.actor.active-concept-collator-actor :refer [active-concept-collator-actor]] - [narjure.actor.anticipated-event-actor :refer [anticipated-event-actor]] - [narjure.actor.concept-creator-actor :refer [concept-creator-actor]] - [narjure.actor.cross-modal-integrator-actor :refer [cross-modal-integrator-actor]] - [narjure.actor.derived-task-creator-actor :refer [derived-task-creator-actor]] - [narjure.actor.forgettable-concept-collator-actor :refer [forgettable-concept-collator-actor]] - [narjure.actor.general-inferencer-actor :refer [general-inferencer-actor]] - [narjure.actor.operator-executor-actor :refer [operator-executor-actor]] - [narjure.actor.persistence-manager-actor :refer [persistence-manager-actor]] - [narjure.actor.sentence-parser-actor :refer [sentence-parser-actor]] - [narjure.actor.system-time-actor :refer [system-time-actor]] - [narjure.actor.task-dispatcher-actor :refer [task-dispatcher-actor]] - [narjure.actor.logger :refer [logger]]) + [narjure.actor + [active-concept-collator :refer [active-concept-collator]] + [anticipated-event :refer [anticipated-event]] + [concept-creator :refer [concept-creator]] + [cross-modal-integrator :refer [cross-modal-integrator]] + [derived-task-creator :refer [derived-task-creator]] + [forgettable-concept-collator :refer [forgettable-concept-collator]] + [general-inferencer :refer [general-inferencer]] + [operator-executor :refer [operator-executor]] + [persistence-manager :refer [persistence-manager]] + [sentence-parser :refer [sentence-parser]] + [system-time :refer [system-time]] + [task-dispatcher :refer [task-dispatcher]]] + [taoensso.timbre :refer [info set-level!]]) (:refer-clojure :exclude [promise await]) + (:import (ch.qos.logback.classic Level) + (org.slf4j LoggerFactory)) (:gen-class)) +(set-level! :info) +(doseq [logger ["co.paralleluniverse.actors.JMXActorMonitor" + "org.quartz.core.QuartzScheduler" + "co.paralleluniverse.actors.LocalActorRegistry" + "co.paralleluniverse.actors.ActorRegistry" + "org.projectodd.wunderboss.scheduling.Scheduling"]] + (.setLevel (LoggerFactory/getLogger logger) Level/OFF)) + +;co.paralleluniverse.actors.JMXActorMonitor +(def actors-names + #{:active-concept-collator + :anticipated-event + :concept-creator + :cross-modal-integrator + :derived-task-creator + :forgettable-concept-collator + :general-inferencer + :operator-executor + :persistence-manager + :sentence-parser + :system-time + :task-dispatcher}) + (defn create-system-actors - "spawns all actors which self register! - " - [] - (spawn active-concept-collator-actor) - (spawn anticipated-event-actor) - (spawn concept-creator-actor) - (spawn cross-modal-integrator-actor) - (spawn derived-task-creator-actor) - (spawn forgettable-concept-collator-actor) - (spawn general-inferencer-actor) - (spawn operator-executor-actor) - (spawn persistence-manager-actor :state) - (spawn sentence-parser-actor) - (spawn system-time-actor) - (spawn task-dispatcher-actor) - (spawn logger :log-info) - ) - -(defn check-actors-registered - " - " + "Spawns all actors which self register!" [] + (spawn active-concept-collator) + (spawn anticipated-event) + (spawn concept-creator) + (spawn cross-modal-integrator) + (spawn derived-task-creator) + (spawn forgettable-concept-collator) + (spawn general-inferencer) + (spawn operator-executor) + (spawn persistence-manager :state) + (spawn sentence-parser) + (spawn system-time) + (spawn task-dispatcher)) + +(defn check-actor [actor-name] + (info (if (whereis actor-name) "\t[OK]" "\t[FAILED]") (str actor-name))) + +(defn check-actors-registered [] + (info "Checking all services are registered...") + (doseq [actor-name actors-names] + (check-actor actor-name)) + (info "All services registered.")) + +(def inference-tick-interval 2500) +(def forgetting-tick-interval 3000) +(def system-tick-interval 2000) + +(defn inference-tick [] + (! :active-concept-collator [:inference-tick-msg])) + +(defn forgetting-tick [] + (! :forgettable-concept-collator [:forgetting-tick-msg])) + +(defn system-tick [] + (! :system-time [:system-time-tick-msg])) + +(defn prn-ok [msg] (info (format "\t[OK] %s" msg))) + +(defn start-timers [] + (info "Initialising system timers...") + (schedule inference-tick {:in inference-tick-interval + :every inference-tick-interval}) + (prn-ok :system-timer) + + (schedule forgetting-tick {:in forgetting-tick-interval + :every forgetting-tick-interval}) + (prn-ok :forgetting-timer) + + (schedule system-tick {:every system-tick-interval}) + (prn-ok :inference-timer) + + (info "System timer initialisation complete.")) + +(defn start-nars [& _] + (info "NARS initialising...") - (defn check-actor [actor-name] - (if (whereis actor-name) - (println "\t[OK]" (str actor-name)) - (println "\t[FAILED]" (str actor-name))) - ) - - (println "\nChecking all services are registered...") - (check-actor :logger) - (check-actor :active-concept-collator) - (check-actor :anticipated-event) - (check-actor :concept-creator) - (check-actor :cross-modal-integrator) - (check-actor :derived-task-creator) - (check-actor :forgettable-concept-collator) - (check-actor :general-inferencer) - (check-actor :operator-executor) - (check-actor :persistence-manager) - (check-actor :sentence-parser) - (check-actor :system-time) - (check-actor :task-dispatcher)) - (println "\nAll services registered.") - -(defn start-timers - " - " - [] - (println "\nInitialising system timers...") - (def inference-tick-interval 2500) - (defn inference-tick [] (! :active-concept-collator :inference-tick-msg)) - (schedule inference-tick (-> {:in inference-tick-interval :every inference-tick-interval})) - (println "\t[OK] ":system-timer "") - - (def forgetting-tick-interval 3000) - (defn forgetting-tick [] (! :forgettable-concept-collator :forgetting-tick-msg)) - (schedule forgetting-tick (-> {:in forgetting-tick-interval :every forgetting-tick-interval})) - (println "\t[OK] ":forgetting-timer "") - - (def system-tick-interval 2000) - (defn system-tick [] (! :system-time :system-time-tick-msg)) - (schedule system-tick (-> {:every system-tick-interval})) - (println "\t[OK] ":inference-timer "") - - (println "\nSystem timer initialisation complete.") - ) - -(defn start-nars - " - " - [& args] - - (println "NARS initialising...") ; spawn all actors except concepts (create-system-actors) - (Thread/sleep 1000) ; allow delay for all actors to be initialised + ; allow delay for all actors to be initialised + (sleep 1 :sec) (check-actors-registered) (start-timers) ; update user with status - (! :logger [:log-msg :log-info :anon "NARS initialised."]) - + (info "NARS initialised.") ; *** Test code - (def task-dispatcher (whereis :task-dispatcher)) - (! :logger [:log-msg :log-info :anon "Beginning test..."]) - (time - (loop [n 0] - (when (< n 1000000) - (let [n1 (if (< (rand) 0.01) n (rand-int (/ n 10)))] ; select approximately 90% from existing concepts - (! task-dispatcher [:task-msg {:term (format "a --> %d" n1) :other "other"}]) - (when (== (mod n 100000) 0) - (! :logger [:log-msg :log-info :anon (str "processed [" n "] messages")]) - )) - (recur (inc n))))) - (Thread/sleep 100) ; allow delay for all actors to process their queues - (! :logger [:log-msg :log-info :anon "Test complete."]) + (let [task-dispatcher (whereis :task-dispatcher)] + (info "Beginning test...") + (time + (loop [n 0] + (when (< n 1000000) + ; select approximately 90% from existing concepts + (let [n1 (if (< (rand) 0.01) n (rand-int (/ n 10)))] + (! task-dispatcher [:task-msg {:term (format "a --> %d" n1) + :other "other"}]) + (when (== (mod n 100000) 0) + (info (format "processed [%s] messages" n)))) + (recur (inc n)))))) + ; allow delay for all actors to process their queues + (Thread/sleep 100) + (info "Test complete.") ; *** End test code ; join all actors so the terminate cleanly - (join (whereis :active-concept-collator)) - (join (whereis :anticipated-event)) - (join (whereis :concept-creator)) - (join (whereis :cross-modal-integrator)) - (join (whereis :derived-task-creator)) - (join (whereis :forgettable-concept-collator)) - (join (whereis :general-inferencer)) - (join (whereis :new-input-task-creator)) - (join (whereis :operator-executor)) - (join (whereis :persistence-manager)) - (join (whereis :sentence-parser)) - (join (whereis :serialiser)) - (join (whereis :system-time)) - (join (whereis :task-dispatcher)) - (join (whereis :logger)) + (doseq [actor-name actors-names] + (join (whereis actor-name))) ; cancel schedulers - (stop) - ) + (stop)) ; call main function -(start-nars) \ No newline at end of file +(defn run [] + (future (start-nars))) diff --git a/src/narjure/defaults.clj b/src/narjure/defaults.clj index 10be69a..74b6938 100644 --- a/src/narjure/defaults.clj +++ b/src/narjure/defaults.clj @@ -1,7 +1,5 @@ (ns narjure.defaults) -(def serial-no (atom 0)) - (def judgement-frequency 1.0) (def judgement-confidence 0.9) From d0748dcef7594c60f568dd7114d16581f544c983 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 29 Mar 2016 11:28:28 +0300 Subject: [PATCH 2/7] logging config --- src/narjure/core.clj | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/narjure/core.clj b/src/narjure/core.clj index f0dbeb8..c964b48 100644 --- a/src/narjure/core.clj +++ b/src/narjure/core.clj @@ -23,13 +23,6 @@ (org.slf4j LoggerFactory)) (:gen-class)) -(set-level! :info) -(doseq [logger ["co.paralleluniverse.actors.JMXActorMonitor" - "org.quartz.core.QuartzScheduler" - "co.paralleluniverse.actors.LocalActorRegistry" - "co.paralleluniverse.actors.ActorRegistry" - "org.projectodd.wunderboss.scheduling.Scheduling"]] - (.setLevel (LoggerFactory/getLogger logger) Level/OFF)) ;co.paralleluniverse.actors.JMXActorMonitor (def actors-names @@ -101,7 +94,20 @@ (info "System timer initialisation complete.")) +(def disable-third-party-loggers [] + (doseq [logger ["co.paralleluniverse.actors.JMXActorMonitor" + "org.quartz.core.QuartzScheduler" + "co.paralleluniverse.actors.LocalActorRegistry" + "co.paralleluniverse.actors.ActorRegistry" + "org.projectodd.wunderboss.scheduling.Scheduling"]] + (.setLevel (LoggerFactory/getLogger logger) Level/OFF))) + +(defn logging-setup [] + (set-level! :info) + (disable-third-party-loggers)) + (defn start-nars [& _] + (logging-setup) (info "NARS initialising...") ; spawn all actors except concepts From 19d4100281221e7766c7d550d1d922eef38ea276 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 29 Mar 2016 11:41:07 +0300 Subject: [PATCH 3/7] setup-logging --- src/narjure/core.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/narjure/core.clj b/src/narjure/core.clj index c964b48..235a148 100644 --- a/src/narjure/core.clj +++ b/src/narjure/core.clj @@ -102,12 +102,12 @@ "org.projectodd.wunderboss.scheduling.Scheduling"]] (.setLevel (LoggerFactory/getLogger logger) Level/OFF))) -(defn logging-setup [] +(defn setup-logging [] (set-level! :info) (disable-third-party-loggers)) (defn start-nars [& _] - (logging-setup) + (setup-logging) (info "NARS initialising...") ; spawn all actors except concepts From 44ca968882e6858057f35afb4204048f9749f305 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 29 Mar 2016 17:12:00 +0300 Subject: [PATCH 4/7] new namespaces --- src/narjure/core.clj | 20 ++++++++++--------- .../active_concept_collator.clj | 2 +- .../derived_task_creator.clj | 2 +- .../general_inferencer.clj | 2 +- .../{actor => memory_management}/concept.clj | 2 +- .../concept_creator.clj | 4 ++-- .../forgettable_concept_collator.clj | 2 +- .../persistence_manager.clj | 2 +- .../task_dispatcher.clj | 2 +- .../anticipated_event.clj | 2 +- .../cross_modal_integrator.clj | 2 +- .../operator_executor.clj | 2 +- .../sentence_parser.clj | 2 +- .../system_time.clj | 2 +- 14 files changed, 25 insertions(+), 23 deletions(-) rename src/narjure/{actor => general_inference}/active_concept_collator.clj (92%) rename src/narjure/{actor => general_inference}/derived_task_creator.clj (92%) rename src/narjure/{actor => general_inference}/general_inferencer.clj (91%) rename src/narjure/{actor => memory_management}/concept.clj (95%) rename src/narjure/{actor => memory_management}/concept_creator.clj (91%) rename src/narjure/{actor => memory_management}/forgettable_concept_collator.clj (92%) rename src/narjure/{actor => memory_management}/persistence_manager.clj (91%) rename src/narjure/{actor => memory_management}/task_dispatcher.clj (96%) rename src/narjure/{actor => perception_action}/anticipated_event.clj (95%) rename src/narjure/{actor => perception_action}/cross_modal_integrator.clj (93%) rename src/narjure/{actor => perception_action}/operator_executor.clj (93%) rename src/narjure/{actor => perception_action}/sentence_parser.clj (95%) rename src/narjure/{actor => perception_action}/system_time.clj (92%) diff --git a/src/narjure/core.clj b/src/narjure/core.clj index 235a148..36e62e8 100644 --- a/src/narjure/core.clj +++ b/src/narjure/core.clj @@ -4,19 +4,21 @@ [core :refer :all] [actors :refer :all]] [immutant.scheduling :refer :all] - [narjure.actor + [narjure.memory_management + [concept-creator :refer [concept-creator]] + [forgettable-concept-collator :refer [forgettable-concept-collator]] + [persistence-manager :refer [persistence-manager]] + [task-dispatcher :refer [task-dispatcher]]] + [narjure.general_inference [active-concept-collator :refer [active-concept-collator]] + [derived-task-creator :refer [derived-task-creator]] + [general-inferencer :refer [general-inferencer]]] + [narjure.perception_action [anticipated-event :refer [anticipated-event]] - [concept-creator :refer [concept-creator]] [cross-modal-integrator :refer [cross-modal-integrator]] - [derived-task-creator :refer [derived-task-creator]] - [forgettable-concept-collator :refer [forgettable-concept-collator]] - [general-inferencer :refer [general-inferencer]] [operator-executor :refer [operator-executor]] - [persistence-manager :refer [persistence-manager]] [sentence-parser :refer [sentence-parser]] - [system-time :refer [system-time]] - [task-dispatcher :refer [task-dispatcher]]] + [system-time :refer [system-time]]] [taoensso.timbre :refer [info set-level!]]) (:refer-clojure :exclude [promise await]) (:import (ch.qos.logback.classic Level) @@ -94,7 +96,7 @@ (info "System timer initialisation complete.")) -(def disable-third-party-loggers [] +(defn disable-third-party-loggers [] (doseq [logger ["co.paralleluniverse.actors.JMXActorMonitor" "org.quartz.core.QuartzScheduler" "co.paralleluniverse.actors.LocalActorRegistry" diff --git a/src/narjure/actor/active_concept_collator.clj b/src/narjure/general_inference/active_concept_collator.clj similarity index 92% rename from src/narjure/actor/active_concept_collator.clj rename to src/narjure/general_inference/active_concept_collator.clj index 125905c..886a766 100644 --- a/src/narjure/actor/active_concept_collator.clj +++ b/src/narjure/general_inference/active_concept_collator.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.active-concept-collator +(ns narjure.general_inference.active-concept-collator (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/derived_task_creator.clj b/src/narjure/general_inference/derived_task_creator.clj similarity index 92% rename from src/narjure/actor/derived_task_creator.clj rename to src/narjure/general_inference/derived_task_creator.clj index dca6406..2e37277 100644 --- a/src/narjure/actor/derived_task_creator.clj +++ b/src/narjure/general_inference/derived_task_creator.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.derived-task-creator +(ns narjure.general_inference.derived-task-creator (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/general_inferencer.clj b/src/narjure/general_inference/general_inferencer.clj similarity index 91% rename from src/narjure/actor/general_inferencer.clj rename to src/narjure/general_inference/general_inferencer.clj index a2ad66b..09d1b8e 100644 --- a/src/narjure/actor/general_inferencer.clj +++ b/src/narjure/general_inference/general_inferencer.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.general-inferencer +(ns narjure.general_inference.general-inferencer (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/concept.clj b/src/narjure/memory_management/concept.clj similarity index 95% rename from src/narjure/actor/concept.clj rename to src/narjure/memory_management/concept.clj index d5fc55b..6c119aa 100644 --- a/src/narjure/actor/concept.clj +++ b/src/narjure/memory_management/concept.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.concept +(ns narjure.memory_management.concept (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/concept_creator.clj b/src/narjure/memory_management/concept_creator.clj similarity index 91% rename from src/narjure/actor/concept_creator.clj rename to src/narjure/memory_management/concept_creator.clj index 7c04edc..ba209e0 100644 --- a/src/narjure/actor/concept_creator.clj +++ b/src/narjure/memory_management/concept_creator.clj @@ -1,9 +1,9 @@ -(ns narjure.actor.concept-creator +(ns narjure.memory_management.concept-creator (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] [actors :refer [register! set-state! self ! spawn]]] - [narjure.actor.concept :refer [concept]] + [narjure.memory_management.concept :refer [concept]] [narjure.actor.utils :refer [actor-loop]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) diff --git a/src/narjure/actor/forgettable_concept_collator.clj b/src/narjure/memory_management/forgettable_concept_collator.clj similarity index 92% rename from src/narjure/actor/forgettable_concept_collator.clj rename to src/narjure/memory_management/forgettable_concept_collator.clj index 7ca91eb..db03516 100644 --- a/src/narjure/actor/forgettable_concept_collator.clj +++ b/src/narjure/memory_management/forgettable_concept_collator.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.forgettable-concept-collator +(ns narjure.memory_management.forgettable-concept-collator (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/persistence_manager.clj b/src/narjure/memory_management/persistence_manager.clj similarity index 91% rename from src/narjure/actor/persistence_manager.clj rename to src/narjure/memory_management/persistence_manager.clj index 0b4b9e1..790d9b0 100644 --- a/src/narjure/actor/persistence_manager.clj +++ b/src/narjure/memory_management/persistence_manager.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.persistence-manager +(ns narjure.memory_management.persistence-manager (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/task_dispatcher.clj b/src/narjure/memory_management/task_dispatcher.clj similarity index 96% rename from src/narjure/actor/task_dispatcher.clj rename to src/narjure/memory_management/task_dispatcher.clj index 5fed054..8c5d154 100644 --- a/src/narjure/actor/task_dispatcher.clj +++ b/src/narjure/memory_management/task_dispatcher.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.task-dispatcher +(ns narjure.memory_management.task-dispatcher (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/anticipated_event.clj b/src/narjure/perception_action/anticipated_event.clj similarity index 95% rename from src/narjure/actor/anticipated_event.clj rename to src/narjure/perception_action/anticipated_event.clj index e9b4ff4..bbc4abe 100644 --- a/src/narjure/actor/anticipated_event.clj +++ b/src/narjure/perception_action/anticipated_event.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.anticipated-event +(ns narjure.perception_action.anticipated-event (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/cross_modal_integrator.clj b/src/narjure/perception_action/cross_modal_integrator.clj similarity index 93% rename from src/narjure/actor/cross_modal_integrator.clj rename to src/narjure/perception_action/cross_modal_integrator.clj index 629ce6f..7279ccf 100644 --- a/src/narjure/actor/cross_modal_integrator.clj +++ b/src/narjure/perception_action/cross_modal_integrator.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.cross-modal-integrator +(ns narjure.perception_action.cross-modal-integrator (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/operator_executor.clj b/src/narjure/perception_action/operator_executor.clj similarity index 93% rename from src/narjure/actor/operator_executor.clj rename to src/narjure/perception_action/operator_executor.clj index 35bf967..67596c1 100644 --- a/src/narjure/actor/operator_executor.clj +++ b/src/narjure/perception_action/operator_executor.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.operator-executor +(ns narjure.perception_action.operator-executor (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/sentence_parser.clj b/src/narjure/perception_action/sentence_parser.clj similarity index 95% rename from src/narjure/actor/sentence_parser.clj rename to src/narjure/perception_action/sentence_parser.clj index 09fba42..275bc6b 100644 --- a/src/narjure/actor/sentence_parser.clj +++ b/src/narjure/perception_action/sentence_parser.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.sentence-parser +(ns narjure.perception_action.sentence-parser (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] diff --git a/src/narjure/actor/system_time.clj b/src/narjure/perception_action/system_time.clj similarity index 92% rename from src/narjure/actor/system_time.clj rename to src/narjure/perception_action/system_time.clj index d923220..a519f8e 100644 --- a/src/narjure/actor/system_time.clj +++ b/src/narjure/perception_action/system_time.clj @@ -1,4 +1,4 @@ -(ns narjure.actor.system-time +(ns narjure.perception_action.system-time (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] From 00f76e00c95071235f3368b6cb515edc6a08ef19 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Tue, 29 Mar 2016 18:20:27 +0300 Subject: [PATCH 5/7] task-msg fix --- src/narjure/memory_management/concept.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/narjure/memory_management/concept.clj b/src/narjure/memory_management/concept.clj index 6c119aa..7b6e94a 100644 --- a/src/narjure/memory_management/concept.clj +++ b/src/narjure/memory_management/concept.clj @@ -21,7 +21,7 @@ (defn debug [msg] (t/debug :concept msg)) -(defmethod process :task [_ _] +(defmethod process :task-msg [_ _] #_(debug "process-task")) (defmethod process :belief-req [_ _] From bcfcd41a4f0aa717dfd19b4baf8d917ab727020b Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Wed, 30 Mar 2016 13:10:49 +0300 Subject: [PATCH 6/7] defmacro --- src/narjure/actor/utils.clj | 32 ++++++++++++++++--- src/narjure/core.clj | 8 ++--- .../active_concept_collator.clj | 25 ++++++--------- .../derived_task_creator.clj | 26 +++++++-------- .../general_inference/general_inferencer.clj | 21 ++++-------- src/narjure/memory_management/concept.clj | 28 +++++++--------- .../memory_management/concept_creator.clj | 21 +++++------- .../forgettable_concept_collator.clj | 25 ++++++--------- .../memory_management/persistence_manager.clj | 19 ++++------- .../memory_management/task_dispatcher.clj | 29 ++++++++--------- .../perception_action/anticipated_event.clj | 28 +++++++--------- .../cross_modal_integrator.clj | 27 ++++++---------- .../perception_action/operator_executor.clj | 28 +++++++--------- .../perception_action/sentence_parser.clj | 32 ++++++++----------- src/narjure/perception_action/system_time.clj | 21 ++++-------- 15 files changed, 160 insertions(+), 210 deletions(-) diff --git a/src/narjure/actor/utils.clj b/src/narjure/actor/utils.clj index 4ba315e..21a53eb 100644 --- a/src/narjure/actor/utils.clj +++ b/src/narjure/actor/utils.clj @@ -1,13 +1,10 @@ (ns narjure.actor.utils (:require [co.paralleluniverse.pulsar - [actors :refer [set-state! state receive !]]] + [core :refer [defsfn]] + [actors :refer [set-state! state receive ! self register!]]] [taoensso.timbre :refer [debug]])) -(defmacro defhandler [name] - `(do - (defmulti ~name (fn [[t#] c#] t#)) - (defmethod ~name :default [a# b#] :unhandled))) (defmacro actor-loop [name f] `(loop [] @@ -17,3 +14,28 @@ (debug ~name (str "unhandled msg:" msg#)) (set-state! result#)) (recur)))) + +(defn create-actor + ([name handlers] + (create-actor name "" {} handlers)) + ([name doc handlers] + (create-actor name doc {} handlers)) + ([name doc default-state handlers] + (let [aname (keyword name) + has-args (and (vector? default-state) + (symbol? (first default-state)))] + `(defsfn ~name ~doc ~(if has-args default-state []) + ~@(when (not= 'concept name) [`(register! ~aname @self)]) + (set-state! ~(if has-args + (first default-state) + default-state)) + (loop [] + (let [msg# (receive) + handler# (get ~handlers (first msg#) :unhandled)] + (if (= :unhandled handler#) + (debug ~name (str "unhandled msg:" msg#)) + (set-state! (handler# msg# @state))) + (recur))))))) + +(defmacro defactor [& args] + (apply create-actor args)) diff --git a/src/narjure/core.clj b/src/narjure/core.clj index 36e62e8..0c79325 100644 --- a/src/narjure/core.clj +++ b/src/narjure/core.clj @@ -4,16 +4,16 @@ [core :refer :all] [actors :refer :all]] [immutant.scheduling :refer :all] - [narjure.memory_management + [narjure.memory-management [concept-creator :refer [concept-creator]] [forgettable-concept-collator :refer [forgettable-concept-collator]] [persistence-manager :refer [persistence-manager]] [task-dispatcher :refer [task-dispatcher]]] - [narjure.general_inference + [narjure.general-inference [active-concept-collator :refer [active-concept-collator]] [derived-task-creator :refer [derived-task-creator]] [general-inferencer :refer [general-inferencer]]] - [narjure.perception_action + [narjure.perception-action [anticipated-event :refer [anticipated-event]] [cross-modal-integrator :refer [cross-modal-integrator]] [operator-executor :refer [operator-executor]] @@ -105,7 +105,7 @@ (.setLevel (LoggerFactory/getLogger logger) Level/OFF))) (defn setup-logging [] - (set-level! :info) + (set-level! :debug) (disable-third-party-loggers)) (defn start-nars [& _] diff --git a/src/narjure/general_inference/active_concept_collator.clj b/src/narjure/general_inference/active_concept_collator.clj index 886a766..a45abfd 100644 --- a/src/narjure/general_inference/active_concept_collator.clj +++ b/src/narjure/general_inference/active_concept_collator.clj @@ -1,28 +1,21 @@ -(ns narjure.general_inference.active-concept-collator +(ns narjure.general-inference.active-concept-collator (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare process active-concept-collator) +(declare inference-tick active-concept active-concept-collator) -(def aname :active-concept-collator) - -(defsfn active-concept-collator +(defactor active-concept-collator "State is collection of active concepts." - [] - (register! aname @self) - (set-state! []) - (actor-loop aname process)) + {:inference-tick-msg inference-tick + :active-concept-msg active-concept}) -(defhandler process) +(def aname :active-concept-collator) -(defmethod process :inference-tick-msg [_ _] +(defn inference-tick [_ _] ;(debug aname "process-inference-tick") []) -(defmethod process :active-concept-msg [_ _] +(defn active-concept [_ _] (debug aname "process-active-concept")) diff --git a/src/narjure/general_inference/derived_task_creator.clj b/src/narjure/general_inference/derived_task_creator.clj index 2e37277..f6aaca1 100644 --- a/src/narjure/general_inference/derived_task_creator.clj +++ b/src/narjure/general_inference/derived_task_creator.clj @@ -1,26 +1,22 @@ -(ns narjure.general_inference.derived-task-creator +(ns narjure.general-inference.derived-task-creator (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare derived-task-creator process) +(declare derived-task-creator system-time inference-result) -(def aname :derived-task-creator) - -(defsfn derived-task-creator +(defactor derived-task-creator "State is system-time." - [] - (register! aname @self) - (set-state! {:time 0}) - (actor-loop aname process)) + {:time 0} + {:system-time-msg system-time + :inference-result-msg inference-result}) + +(def aname :derived-task-creator) -(defn process-system-time [[_ time] _] +(defn system-time [[_ time] _] (debug aname "process-system-time") {:time time}) -(defn process-inference-result [_ _] +(defn inference-result [_ _] (debug aname "process-inference-result")) diff --git a/src/narjure/general_inference/general_inferencer.clj b/src/narjure/general_inference/general_inferencer.clj index 09d1b8e..8c4a28b 100644 --- a/src/narjure/general_inference/general_inferencer.clj +++ b/src/narjure/general_inference/general_inferencer.clj @@ -1,24 +1,17 @@ -(ns narjure.general_inference.general-inferencer +(ns narjure.general-inference.general-inferencer (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) (declare general-inferencer do-inference) -(def aname :general-inferencer) - -(defsfn general-inferencer - "state is inference rule trie or equivalent" - [] - (register! aname @self) - (set-state! {:trie 0}) - (actor-loop aname do-inference)) +(defactor general-inferencer + "State is inference rule trie or equivalent." + {:trie 0} + {:do-inference-msg do-inference}) (defn do-inference [_ _] - (debug aname "process-do-inference")) + (debug :general-inferencer "process-do-inference")) diff --git a/src/narjure/memory_management/concept.clj b/src/narjure/memory_management/concept.clj index 7b6e94a..df3f369 100644 --- a/src/narjure/memory_management/concept.clj +++ b/src/narjure/memory_management/concept.clj @@ -1,34 +1,30 @@ -(ns narjure.memory_management.concept +(ns narjure.memory-management.concept (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state!]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :as t]) (:refer-clojure :exclude [promise await])) -(declare concept process) +(declare concept task-req belief-req inference-req persistence-req) -(defsfn concept +(defactor concept "State is a map {:name :budget :activation-level :belief-tab :goal-tab :task-bag :term-bag} (this list may not be complete)." - [] - (set-state! {}) - (actor-loop :concept process)) - -(defhandler process) + {:task-msg task-req + :belief-req-msq belief-req + :inference-req-msq inference-req + :persistence-req-msg persistence-req}) (defn debug [msg] (t/debug :concept msg)) -(defmethod process :task-msg [_ _] +(defn task-req [_ _] #_(debug "process-task")) -(defmethod process :belief-req [_ _] +(defn belief-req [_ _] (debug "process-belief-req")) -(defmethod process :inference-req [_ _] +(defn inference-req [_ _] (debug "process-inference-req")) -(defmethod process :persistence-req [_ _] +(defn persistence-req [_ _] (debug "process-persistence-req")) diff --git a/src/narjure/memory_management/concept_creator.clj b/src/narjure/memory_management/concept_creator.clj index ba209e0..14397d0 100644 --- a/src/narjure/memory_management/concept_creator.clj +++ b/src/narjure/memory_management/concept_creator.clj @@ -1,21 +1,16 @@ -(ns narjure.memory_management.concept-creator +(ns narjure.memory-management.concept-creator (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self ! spawn]]] - [narjure.memory_management.concept :refer [concept]] - [narjure.actor.utils :refer [actor-loop]] + [co.paralleluniverse.pulsar.actors :refer [! spawn]] + [narjure.memory-management.concept :refer [concept]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare concept-creator process-task) +(declare concept-creator task) -(def aname :concept-creator) +(defactor concept-creator {:create-concept-msg task}) -(defsfn concept-creator - [] - (register! aname @self) - (actor-loop aname process-task)) +(def aname :concept-creator) (defn create-concept ;TODO: update state for concept-actor to state initialiser @@ -25,7 +20,7 @@ (swap! c-map assoc term (spawn concept)) #_(debug aname (str "Created concept: " term)))) -(defn process-task +(defn task "When concept-map does not contain :term, create concept actor for term then post task to task-dispatcher either way." [[_ from task c-map] _] diff --git a/src/narjure/memory_management/forgettable_concept_collator.clj b/src/narjure/memory_management/forgettable_concept_collator.clj index db03516..81797c7 100644 --- a/src/narjure/memory_management/forgettable_concept_collator.clj +++ b/src/narjure/memory_management/forgettable_concept_collator.clj @@ -1,27 +1,20 @@ -(ns narjure.memory_management.forgettable-concept-collator +(ns narjure.memory-management.forgettable-concept-collator (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare forgettable-concept-collator process) +(declare forgettable-concept-collator forgetting-tick forgettable-concept) -(def aname :forgettable-concept-collator) - -(defsfn forgettable-concept-collator +(defactor forgettable-concept-collator "State is collection of forgettable concepts." - [] - (register! :forgettable-concept-collator @self) - (set-state! []) - (actor-loop aname process)) + {:forgetting-tick-msg forgetting-tick + :forgettable-concept-msg forgettable-concept}) -(defhandler process) +(def aname :forgettable-concept-collator) -(defmethod process :forgetting-tick-msg [_ _] +(defn forgetting-tick [_ _] #_(debug aname "process-forgetting-tick")) -(defmethod process :forgettable-concept-msg [_ _] +(defn forgettable-concept [_ _] (debug aname "process-forgettable-concept")) diff --git a/src/narjure/memory_management/persistence_manager.clj b/src/narjure/memory_management/persistence_manager.clj index 790d9b0..a06e2ae 100644 --- a/src/narjure/memory_management/persistence_manager.clj +++ b/src/narjure/memory_management/persistence_manager.clj @@ -1,22 +1,15 @@ -(ns narjure.memory_management.persistence-manager +(ns narjure.memory-management.persistence-manager (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) (declare concept-state persistence-manager) -(def aname :persistence-manager) - -(defsfn persistence-manager - "state is file system handles" +(defactor persistence-manager + "State is file system handles" [in-state] - (register! aname @self) - (set-state! in-state) - (actor-loop aname concept-state)) + {:concept-state-msg concept-state}) (defn concept-state [_ _] - (debug aname "process-concept-state")) + (debug :persistence-manager "process-concept-state")) diff --git a/src/narjure/memory_management/task_dispatcher.clj b/src/narjure/memory_management/task_dispatcher.clj index 8c5d154..256a391 100644 --- a/src/narjure/memory_management/task_dispatcher.clj +++ b/src/narjure/memory_management/task_dispatcher.clj @@ -1,27 +1,24 @@ -(ns narjure.memory_management.task-dispatcher +(ns narjure.memory-management.task-dispatcher (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self ! whereis]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [co.paralleluniverse.pulsar.actors :refer [self ! whereis]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug info]]) (:refer-clojure :exclude [promise await])) -(declare task-dispatcher process) +(declare task-dispatcher task forget-concept concept-count) -(def aname :task-dispatcher) (def c-map (atom {})) -(defsfn task-dispatcher - "concept-map is atom {:term :actor-ref} shared between +(defactor task-dispatcher + "Concept-map is atom {:term :actor-ref} shared between task-dispatcher and concept-creator" - [] - (register! aname @self) - (actor-loop aname process)) + {:task-msg task + :forget-concept-msg forget-concept + :concept-count-msg concept-count}) -(defhandler process) +(def aname :task-dispatcher) -(defmethod process :task-msg +(defn task [[_ input-task] _] (let [concept-creator (whereis :concept-creator) term (input-task :term)] @@ -30,8 +27,8 @@ (! concept-creator [:create-concept-msg @self input-task c-map]))) #_(debug aname (str "process-task" input-task))) -(defmethod process :forget-concept-msg [[_ forget-concept] _] +(defn forget-concept [[_ forget-concept] _] (debug aname "process-forget-concept")) -(defmethod process :concept-count-msg [_ _] +(defn concept-count [_ _] (info aname (format "Concept count[%s]" (count @c-map)))) diff --git a/src/narjure/perception_action/anticipated_event.clj b/src/narjure/perception_action/anticipated_event.clj index bbc4abe..1f343f2 100644 --- a/src/narjure/perception_action/anticipated_event.clj +++ b/src/narjure/perception_action/anticipated_event.clj @@ -1,35 +1,31 @@ -(ns narjure.perception_action.anticipated-event +(ns narjure.perception-action.anticipated-event (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self !]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [co.paralleluniverse.pulsar.actors :refer [!]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare anticipated-event process) +(declare anticipated-event anticipated-event-handler system-time input-task) (def aname :anticipated-event) -(defsfn anticipated-event +(defactor anticipated-event "State is system-time and collection of anticipated events." - [] - (register! aname @self) - (set-state! {:time 0 :anticipated-events {}}) - (actor-loop aname process)) + {:time 0 :anticipated-events {}} + {:system-time-msg system-time + :anticipated-event-msg anticipated-event-handler + :input-task-msg input-task}) -(defhandler process) - -(defmethod process :system-time-msg +(defn system-time [[_ time] state] (debug aname "process-system-time") {:time time :anticipated-events (state :percepts)}) -(defmethod process :anticipated-event-msg +(defn anticipated-event-handler [_ _] #_(debug aname "process-anticipated-event")) -(defmethod process :input-task-msg +(defn input-task [[_ input-task] _] #_(debug aname "process-input-task") (! :task-dispatcher [:task-msg input-task])) diff --git a/src/narjure/perception_action/cross_modal_integrator.clj b/src/narjure/perception_action/cross_modal_integrator.clj index 7279ccf..fff1181 100644 --- a/src/narjure/perception_action/cross_modal_integrator.clj +++ b/src/narjure/perception_action/cross_modal_integrator.clj @@ -1,29 +1,22 @@ -(ns narjure.perception_action.cross-modal-integrator +(ns narjure.perception-action.cross-modal-integrator (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare cross-modal-integrator process) +(declare cross-modal-integrator system-time percept-sentence) -(def aname :cross-modal-integrator) - -(defsfn cross-modal-integrator +(defactor cross-modal-integrator "State is system-time and collection of precepts from current duration window." - [] - (register! :cross-modal-integrator @self) - (set-state! {:time 0 :percepts []}) - (actor-loop aname process)) + {:time 0 :percepts []} + {:system-time-msg system-time + :percept-sentence-msg percept-sentence}) -(defhandler process) +(def aname :cross-modal-integrator) -(defmethod process :system-time [[_ time] state] +(defn system-time [[_ time] state] (debug aname "process-system-time") {:time time :percepts (state :percepts)}) -(defmethod process :percept-sentence [_ _] +(defn percept-sentence [_ _] (debug aname "process-percept-sentence")) - diff --git a/src/narjure/perception_action/operator_executor.clj b/src/narjure/perception_action/operator_executor.clj index 67596c1..08df78c 100644 --- a/src/narjure/perception_action/operator_executor.clj +++ b/src/narjure/perception_action/operator_executor.clj @@ -1,31 +1,25 @@ -(ns narjure.perception_action.operator-executor +(ns narjure.perception-action.operator-executor (:require [co.paralleluniverse.pulsar [core :refer [defsfn]] [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) -(declare operator-executor process) +(declare operator-executor process system-time operator-execution-req) -(def aname :operator-executor) - -(defsfn operator-executor - "state is system-time" - [] - (register! aname @self) - (set-state! {:time 0}) - (actor-loop aname process)) +(defactor operator-executor + "State is system-time" + {:time 0} + {:system-time-msg system-time + :operator-execution-req-msg operator-execution-req}) -(defhandler process) +(def aname :operator-executor) -(defmethod process :system-time-msg [[_ time] _] +(defn system-time [[_ time] _] (debug aname "process-system-time") {:time time}) -(defmethod process :operator-execution-req-msg [_ _] +(defn operator-execution-req [_ _] (debug aname "process-operator-execution-req")) - - - diff --git a/src/narjure/perception_action/sentence_parser.clj b/src/narjure/perception_action/sentence_parser.clj index 275bc6b..9ef7d71 100644 --- a/src/narjure/perception_action/sentence_parser.clj +++ b/src/narjure/perception_action/sentence_parser.clj @@ -1,28 +1,23 @@ -(ns narjure.perception_action.sentence-parser +(ns narjure.perception-action.sentence-parser (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self !]]] + [co.paralleluniverse.pulsar.actors :refer [!]] [narjure.narsese :refer [parse]] - [narjure.actor.utils :refer [actor-loop defhandler]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug info]]) (:refer-clojure :exclude [promise await])) -(declare sentence-parser process) - -(def aname :sentence-parser) +(declare sentence-parser system-time narsese-string) (def serial-no (atom 0)) -(defsfn sentence-parser - [] - (register! aname @self) - (set-state! {:time 0}) - (actor-loop aname process)) +(defactor sentence-parser + {:time 0} + {:system-time-msg system-time + :narsese-string-msg narsese-string}) -(defhandler process) +(def aname :sentence-parser) -(defmethod process :system-time-msg [[_ time] _] +(defn system-time [[_ time] _] (debug aname "process-system-time") {:time time}) @@ -36,8 +31,9 @@ :occurrence-time system-time :trail [serial-no]})) -(defmethod process :narsese-string-msg - [[_ string] {time :time}] +(defn narsese-string + [[_ string] {time :time :as state}] (let [task (parse-task string time)] (! :anticipated-event [:input-task-msg task]) - (info aname (str "process-narsese-string" task)))) + (info aname (str "process-narsese-string" task))) + state) diff --git a/src/narjure/perception_action/system_time.clj b/src/narjure/perception_action/system_time.clj index a519f8e..7126290 100644 --- a/src/narjure/perception_action/system_time.clj +++ b/src/narjure/perception_action/system_time.clj @@ -1,23 +1,16 @@ -(ns narjure.perception_action.system-time +(ns narjure.perception-action.system-time (:require - [co.paralleluniverse.pulsar - [core :refer [defsfn]] - [actors :refer [register! set-state! self]]] - [narjure.actor.utils :refer [actor-loop]] + [narjure.actor.utils :refer [defactor]] [taoensso.timbre :refer [debug]]) (:refer-clojure :exclude [promise await])) (declare system-time system-time-tick) -(def aname :system-time) - -(defsfn system-time - "state is system-time" - [] - (register! aname @self) - (set-state! 0) - (actor-loop aname system-time-tick)) +(defactor system-time + "State is system-time." + 0 + {:system-time-tick-msg system-time-tick}) (defn system-time-tick [_ state] - ;(debug aname (str "process-system-time-tick " state)) + ;(debug :system-time (str "process-system-time-tick " state)) (inc state)) From 7f30765b91065051270b18fadf4db9e94a2cef15 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Fri, 1 Apr 2016 14:53:09 +0300 Subject: [PATCH 7/7] side-effect! --- src/narjure/actor/utils.clj | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/narjure/actor/utils.clj b/src/narjure/actor/utils.clj index 21a53eb..952427e 100644 --- a/src/narjure/actor/utils.clj +++ b/src/narjure/actor/utils.clj @@ -5,16 +5,6 @@ [actors :refer [set-state! state receive ! self register!]]] [taoensso.timbre :refer [debug]])) - -(defmacro actor-loop [name f] - `(loop [] - (let [msg# (receive) - result# (~f msg# @state)] - (if (= :unhandled result#) - (debug ~name (str "unhandled msg:" msg#)) - (set-state! result#)) - (recur)))) - (defn create-actor ([name handlers] (create-actor name "" {} handlers)) @@ -37,5 +27,12 @@ (set-state! (handler# msg# @state))) (recur))))))) +(defn side-effect! + "Wraps handler which generates side effect. Returns state without changes." + [handler] + (fn [message state] + (handler message state) + state)) + (defmacro defactor [& args] (apply create-actor args))