From 82f41520a1d89b429fa2385c96d5977eeb61c115 Mon Sep 17 00:00:00 2001
From: Shuzo Katayama
 <shuzokatayama@host-Shuzos-Air-mac-6476ba9b7300.eduroam.ssid.10net.amherst.edu>
Date: Mon, 12 Jul 2021 17:26:19 -0400
Subject: [PATCH] some PSB2 problems added

---
 project.clj                                   |  2 +-
 propeller.iml                                 |  2 +-
 src/propeller/problems/PSB2/bowling.cljc      |  2 +-
 src/propeller/problems/PSB2/dice_game.cljc    | 69 +++++++++++++++++++
 .../problems/PSB2/substitution_cipher.cljc    | 10 +--
 5 files changed, 77 insertions(+), 8 deletions(-)
 create mode 100644 src/propeller/problems/PSB2/dice_game.cljc

diff --git a/project.clj b/project.clj
index 35aa7f7..6aa55f3 100644
--- a/project.clj
+++ b/project.clj
@@ -6,6 +6,6 @@
   :dependencies [[org.clojure/clojure "1.10.0"]
                  [org.clojure/clojurescript "1.9.946"]
                  [org.clojure/test.check "1.1.0"]
-                 [net.clojars.schneau/psb2 "1.0.0"]]
+                 [net.clojars.schneau/psb2 "1.1.0"]]
   :main ^:skip-aot propeller.core
   :repl-options {:init-ns propeller.core})
diff --git a/propeller.iml b/propeller.iml
index f97fb0d..f20aa6f 100644
--- a/propeller.iml
+++ b/propeller.iml
@@ -23,7 +23,7 @@
     <orderEntry type="library" name="Leiningen: com.google.javascript/closure-compiler-unshaded:v20170910" level="project" />
     <orderEntry type="library" name="Leiningen: com.google.jsinterop/jsinterop-annotations:1.0.0" level="project" />
     <orderEntry type="library" name="Leiningen: com.google.protobuf/protobuf-java:3.0.2" level="project" />
-    <orderEntry type="library" name="Leiningen: net.clojars.schneau/psb2:1.0.0" level="project" />
+    <orderEntry type="library" name="Leiningen: net.clojars.schneau/psb2:1.1.0" level="project" />
     <orderEntry type="library" name="Leiningen: nrepl:0.6.0" level="project" />
     <orderEntry type="library" name="Leiningen: org.clojure/clojure:1.10.0" level="project" />
     <orderEntry type="library" name="Leiningen: org.clojure/clojurescript:1.9.946" level="project" />
diff --git a/src/propeller/problems/PSB2/bowling.cljc b/src/propeller/problems/PSB2/bowling.cljc
index 7ae4a63..75f22d3 100644
--- a/src/propeller/problems/PSB2/bowling.cljc
+++ b/src/propeller/problems/PSB2/bowling.cljc
@@ -29,7 +29,7 @@
       ;;; close
       (list 'close)
       ;;; ERCs (constants)
-      (list \- \X \/ \1 \2 \3 \4 \5 \6 \7 \8 \9 random-int))))
+      (list \- \X \/ \1 \2 \3 \4 \5 \6 \7 \8 \9 10 random-int))))
 
 (defn error-function
   ([argmap individual]
diff --git a/src/propeller/problems/PSB2/dice_game.cljc b/src/propeller/problems/PSB2/dice_game.cljc
new file mode 100644
index 0000000..7f9bfb8
--- /dev/null
+++ b/src/propeller/problems/PSB2/dice_game.cljc
@@ -0,0 +1,69 @@
+(ns propeller.problems.PSB2.dice-game
+  (:require [psb2.core :as psb2]
+            [propeller.genome :as genome]
+            [propeller.push.interpreter :as interpreter]
+            [propeller.utils :as utils]
+            [propeller.push.utils.helpers :refer [get-stack-instructions]]
+            [propeller.push.state :as state]
+            [clojure.pprint :as pprint]
+            [propeller.tools.math :as math]))
+
+; ===========  PROBLEM DESCRIPTION  ===============================
+; DICE GAME from PSB2
+; Peter has an n sided die and Colin has an m
+; sided die. If they both roll their dice at the same time, return
+; the probability that Peter rolls strictly higher than Colin.
+;
+; Source: https://arxiv.org/pdf/2106.06086.pdf
+; ==================================================================
+
+(defn map-vals-input
+  "Returns all the input values of a map (specific helper method for bouncing-balls)"
+  [i]
+  (vals (select-keys i [:input1 :input2])))
+
+(defn map-vals-output
+  "Returns the output values of a map (specific helper method for bouncing-balls)"
+  [i]
+  (get i :output1))
+
+(def instructions
+  (utils/not-lazy
+    (concat
+      ;;; stack-specific instructions
+      (get-stack-instructions #{:exec :integer :float :boolean :print})
+      ;;; input instructions
+      (list :in1 :in2)
+      ;;; close
+      (list 'close)
+      ;;; ERCs (constants)
+      (list 0.0 1.0))))
+
+(defn error-function
+  ([argmap individual]
+   (error-function argmap individual :train))
+  ([argmap individual subset]
+   (let [program (genome/plushy->push (:plushy individual) argmap)
+         data (get (get argmap :train-and-test-data) subset)
+         inputs (map (fn [i] (map-vals-input i)) data)
+         correct-outputs (map (fn [i] (map-vals-output i)) data)
+         outputs (map (fn [input]
+                        (state/peek-stack
+                          (interpreter/interpret-program
+                            program
+                            (assoc state/empty-state :input {:in1 (nth input 0)
+                                                             :in2 (nth input 1)})
+                            (:step-limit argmap))
+                          :float))
+                      inputs)
+         errors (map (fn [correct-output output]
+                       (if (= output :no-stack-item)
+                         1000000.0
+                         (min 1000.0 (math/abs (- correct-output output)))))
+                     correct-outputs
+                     outputs)]
+     (assoc individual
+       :behaviors outputs
+       :errors errors
+       :total-error #?(:clj  (apply +' errors)
+                       :cljs (apply + errors))))))
diff --git a/src/propeller/problems/PSB2/substitution_cipher.cljc b/src/propeller/problems/PSB2/substitution_cipher.cljc
index 82f501f..c29ef3f 100644
--- a/src/propeller/problems/PSB2/substitution_cipher.cljc
+++ b/src/propeller/problems/PSB2/substitution_cipher.cljc
@@ -10,11 +10,11 @@
 
 ; ===========  PROBLEM DESCRIPTION  =========================
 ; SUBSTITUTION CIPHER from PSB2
-;This problem gives 3 strings.
-;The first two represent a cipher, mapping each character in
-;one string to the one at the same index in the other string.
-;The program must apply this cipher to the third string and
-;return the deciphered message.
+; This problem gives 3 strings.
+; The first two represent a cipher, mapping each character in
+; one string to the one at the same index in the other string.
+; The program must apply this cipher to the third string and
+; return the deciphered message.
 ;
 ; Source: https://arxiv.org/pdf/2106.06086.pdf
 ; ============================================================