From a7b625d9422e197efd369e01fcf1fecb5e9a3b00 Mon Sep 17 00:00:00 2001 From: Ryan Boldi Date: Thu, 3 Mar 2022 22:56:10 -0500 Subject: [PATCH 1/2] removed simplification complexity from gp.cljc and added it to simplification.cljc. also updated tests to reflect this --- src/propeller/gp.cljc | 4 ++-- src/propeller/simplification.cljc | 12 ++++++------ test/propeller/utils_test.cljc | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/propeller/gp.cljc b/src/propeller/gp.cljc index 3c89f00..72ec5af 100644 --- a/src/propeller/gp.cljc +++ b/src/propeller/gp.cljc @@ -60,8 +60,8 @@ (do (prn {:success-generation generation}) (prn {:total-test-error (:total-error (error-function argmap (:testing-data argmap) best-individual))}) - (if (:simplification? argmap) - (let [simplified-plushy (simplification/auto-simplify-plushy argmap (:plushy best-individual) (:simplification-steps argmap) error-function (:training-data argmap) (:simplification-k argmap) (:simplification-verbose? argmap))] + (when (:simplification? argmap) + (let [simplified-plushy (simplification/auto-simplify-plushy (:plushy best-individual) error-function argmap)] (prn {:total-test-error-simplified (:total-error (error-function argmap (:testing-data argmap) (hash-map :plushy simplified-plushy)))})))) ;; (>= generation max-generations) diff --git a/src/propeller/simplification.cljc b/src/propeller/simplification.cljc index fbd47b1..f896e38 100644 --- a/src/propeller/simplification.cljc +++ b/src/propeller/simplification.cljc @@ -13,7 +13,7 @@ "deletes the values at given set of indices" [indices plushy] (let [sorted-indices (sort > indices)] - (keep-indexed #(if (not (some #{%1} sorted-indices)) %2) plushy))) + (keep-indexed #(when (not (some #{%1} sorted-indices)) %2) plushy))) (defn delete-k-random [k plushy] @@ -21,13 +21,13 @@ (defn auto-simplify-plushy "naive auto-simplification" - [argmap plushy steps error-function training-data k verbose?] - (if verbose? (prn {:start-plushy-length (count plushy) :k k})) + [plushy error-function {:keys [simplification-steps training-data simplification-k simplification-verbose?] :as argmap}] + (when simplification-verbose? (prn {:start-plushy-length (count plushy) :k simplification-k})) (let [initial-errors (:errors (error-function argmap training-data {:plushy plushy}))] (loop [step 0 curr-plushy plushy] - (if (< steps step) - (do (if verbose? (prn {:final-plushy-length (count curr-plushy) :final-plushy curr-plushy})) curr-plushy) - (let [new-plushy (delete-k-random (rand-int k) curr-plushy) + (if (< simplification-steps step) + (do (when simplification-verbose? (prn {:final-plushy-length (count curr-plushy) :final-plushy curr-plushy})) curr-plushy) + (let [new-plushy (delete-k-random (rand-int simplification-k) curr-plushy) new-plushy-errors (:errors (error-function argmap training-data {:plushy new-plushy})) new-equal? (= new-plushy-errors initial-errors)] (recur (inc step) diff --git a/test/propeller/utils_test.cljc b/test/propeller/utils_test.cljc index e450a38..f8b4567 100644 --- a/test/propeller/utils_test.cljc +++ b/test/propeller/utils_test.cljc @@ -71,8 +71,8 @@ (t/testing "auto-simplify-plushy" (t/testing "should handle having an empty plushy" - (t/is (= (s/auto-simplify-plushy {} '() 100 (fn [argmap data plushy] 0) {} 3 false) '()))) + (t/is (= (s/auto-simplify-plushy '() (fn [argmap data plushy] 0) {:simplification-steps 100 :simplification-k 4 :simplification-verbose? false}) '()))) (let [plushy '(:exec_dup 1 :integer_add close :in1 :integer_add 0 :in1 :in1 :integer_mult :integer_add)] (t/testing "should decrease size of plushy that always has perfect scores" - (t/is (< (count (s/auto-simplify-plushy {} plushy 5 (fn [argmap data plushy] 0) {} 3 false)) (count plushy))) - (t/is (< (count (s/auto-simplify-plushy {} plushy 1 (fn [argmap data plushy] 0) {} 10 false)) (count plushy)))))) \ No newline at end of file + (t/is (< (count (s/auto-simplify-plushy plushy (fn [argmap data plushy] 0) {:simplification-steps 100 :simplification-k 4 :simplification-verbose? false})) (count plushy))) + (t/is (< (count (s/auto-simplify-plushy plushy (fn [argmap data plushy] 0) {:simplification-steps 100 :simplification-k 10 :simplification-verbose? false})) (count plushy)))))) \ No newline at end of file From 64a81cb4502d91123ba41084b5d8dc4f7ccb567b Mon Sep 17 00:00:00 2001 From: Ryan Boldi Date: Thu, 3 Mar 2022 21:29:42 -0500 Subject: [PATCH 2/2] update documentation to include simplification --- doc/intro.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/doc/intro.md b/doc/intro.md index 2a2a4ec..0e67dcf 100644 --- a/doc/intro.md +++ b/doc/intro.md @@ -1,3 +1,32 @@ -# Introduction to propeller +# Introduction to Propeller TODO: write [great documentation](http://jacobian.org/writing/what-to-write/) + + + + +# Simplification + +To use Propeller's auto-simplification system, simply include the following four command line arguments when running a problem: + +```clojure +:simplification? true +``` +Toggle auto-simplification +```clojure +:simplification-k 4 +``` +This is the upper bound for elements deleted from the plushy every step. Every step, a number in $[1, k]$ of elements is deleted from the plushy representation of the solution. +```clojure +:simplification-steps 1000 +``` +Number of simplification steps to perform +```clojure +:simplification-verbose? true +``` +whether or not to output simplification info into the output of the evolutionary run. +The output with verbose adds the following lines to the output: +```clojure +{:start-plushy-length 42, :k 4} +{:final-plushy-length 13, :final-plushy (:in1 :in1 :integer_quot :in1 :in1 :exec_dup :in1 :integer_mult close :exec_dup :integer_add 1 :integer_add)} +``` \ No newline at end of file