Skip to content

Commit

Permalink
Merge pull request lspector#65 from thelmuth/fix/float-and-better-log…
Browse files Browse the repository at this point in the history
…ging

Added float_div, and made logging print each value on one line instead of pretty-printed across many lines.
  • Loading branch information
lspector authored Nov 8, 2023
2 parents fac7b03 + a7ce415 commit 98d7126
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 7 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,9 @@ Calling `(-main)` will run the default genetic programming problem.

## Description

Propel is an implementation of the Push programming
language and the PushGP genetic programming system in Clojure.
Propeller is an implementation of the Push programming
language and the PushGP genetic programming system in Clojure, based
on Tom Helmuth's little PushGP implementation [propel](https://github.com/thelmuth/propel).

For more information on Push and PushGP see
[http://pushlanguage.org](http://pushlanguage.org).
Expand Down
10 changes: 5 additions & 5 deletions src/propeller/gp.cljc
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
(ns propeller.gp
"Main genetic programming loop."
(:require [clojure.string]
[clojure.pprint]
[propeller.genome :as genome]
[propeller.simplification :as simplification]
[propeller.variation :as variation]
Expand All @@ -22,20 +21,21 @@
"Reports information each generation."
[evaluations pop generation argmap training-data]
(let [best (first pop)]
(clojure.pprint/pprint
(utils/pretty-map-println
{:generation generation
:best-plushy (:plushy best)
:best-program (genome/plushy->push (:plushy best) argmap)
:best-total-error (:total-error best)
:evaluations evaluations
:ds-indices (map #(:index %) training-data)
:ds-indices (if (:downsample? argmap)
(map #(:index %) training-data)
nil)
:best-errors (:errors best)
:best-behaviors (:behaviors best)
:genotypic-diversity (float (/ (count (distinct (map :plushy pop))) (count pop)))
:behavioral-diversity (float (/ (count (distinct (map :behaviors pop))) (count pop)))
:average-genome-length (float (/ (reduce + (map count (map :plushy pop))) (count pop)))
:average-total-error (float (/ (reduce + (map :total-error pop)) (count pop)))})
(println)))
:average-total-error (float (/ (reduce + (map :total-error pop)) (count pop)))})))

(defn cleanup
[]
Expand Down
8 changes: 8 additions & 0 deletions src/propeller/push/instructions/numeric.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,14 @@ Otherwise, acts as a NOOP"
;; FLOAT Instructions only
;; =============================================================================

;; Divides the top two items on the float stack
;; If denominator is 0, returns 1.0
(def-instruction
:float_div
^{:stacks #{:float}}
(fn [state]
(make-instruction state #(float (if (zero? %2) 1 (/ %1 %2))) [:float :float] :float)))

;; Pushes the cosine of the top FLOAT
(def-instruction
:float_cos
Expand Down
11 changes: 11 additions & 0 deletions src/propeller/utils.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,14 @@
(if (coll? thing-or-collection)
(rand-nth thing-or-collection)
thing-or-collection))

(defn pretty-map-println
"Takes a map and prints it, with each key/value pair on its own line."
[mp]
(print "{")
(let [mp-seq (seq mp)
[first-key first-val] (first mp-seq)]
(println (pr-str first-key first-val))
(doseq [[k v] (rest mp-seq)]
(println (str " " (pr-str k v)))))
(println "}"))

0 comments on commit 98d7126

Please sign in to comment.