|
1 | 1 | (ns gen.dynamic |
2 | 2 | (:require [clojure.math :as math] |
3 | | - [clojure.set :as set] |
4 | 3 | [clojure.walk :as walk] |
5 | 4 | [gen] |
6 | 5 | [gen.choice-map :as choice-map] |
7 | | - [gen.dynamic.choice-map :as dynamic.choice-map] |
8 | | - [gen.dynamic.trace :as dynamic.trace #?@(:cljs [:refer [Trace]])] |
| 6 | + [gen.dynamic.trace :as dynamic.trace] |
9 | 7 | [gen.generative-function :as gf] |
10 | 8 | [gen.trace :as trace]) |
11 | 9 | #?(:cljs |
12 | | - (:require-macros [gen.dynamic])) |
13 | | - #?(:clj |
14 | | - (:import (gen.dynamic.trace Trace)))) |
| 10 | + (:require-macros [gen.dynamic]))) |
15 | 11 |
|
16 | 12 | (defrecord DynamicDSLFunction [clojure-fn] |
17 | 13 | gf/Simulate |
|
25 | 21 |
|
26 | 22 | dynamic.trace/*trace* |
27 | 23 | (fn [k gf args] |
| 24 | + (dynamic.trace/validate-empty! @trace k) |
28 | 25 | (let [subtrace (gf/simulate gf args)] |
29 | 26 | (swap! trace dynamic.trace/assoc-subtrace k subtrace) |
30 | 27 | (trace/retval subtrace)))] |
|
50 | 47 |
|
51 | 48 | dynamic.trace/*trace* |
52 | 49 | (fn [k gf args] |
53 | | - (let [{subtrace :trace |
54 | | - weight :weight} |
55 | | - (if-let [constraints (get (choice-map/submaps constraints) |
56 | | - k)] |
57 | | - (gf/generate gf args constraints) |
| 50 | + (dynamic.trace/validate-empty! (:trace @state) k) |
| 51 | + (let [{subtrace :trace :as ret} |
| 52 | + (if-let [k-constraints (get (choice-map/submaps constraints) k)] |
| 53 | + (gf/generate gf args k-constraints) |
58 | 54 | (gf/generate gf args))] |
59 | | - (swap! state update :trace dynamic.trace/assoc-subtrace k subtrace) |
60 | | - (swap! state update :weight + weight) |
| 55 | + (swap! state dynamic.trace/combine k ret) |
61 | 56 | (trace/retval subtrace)))] |
62 | 57 | (let [retval (apply clojure-fn args) |
63 | 58 | trace (:trace @state)] |
|
115 | 110 | (-invoke [_ arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 arg20] (dynamic.trace/without-tracing (clojure-fn arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 arg20))) |
116 | 111 | (-invoke [_ arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 arg20 args] (apply clojure-fn arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11 arg12 arg13 arg14 arg15 arg16 arg17 arg18 arg19 arg20 args))])) |
117 | 112 |
|
118 | | -(extend-type Trace |
119 | | - trace/Update |
120 | | - (update [prev-trace constraints] |
121 | | - (let [^DynamicDSLFunction gf (trace/gf prev-trace) |
122 | | - state (atom {:trace (dynamic.trace/trace gf (trace/args prev-trace)) |
123 | | - :weight 0 |
124 | | - :discard (dynamic.choice-map/choice-map)})] |
125 | | - (binding [dynamic.trace/*splice* |
126 | | - (fn [& _] |
127 | | - (throw (ex-info "Not yet implemented." {}))) |
128 | | - |
129 | | - dynamic.trace/*trace* |
130 | | - (fn [k gf args] |
131 | | - (let [{subtrace :trace |
132 | | - weight :weight |
133 | | - discard :discard} |
134 | | - (if-let [prev-subtrace (get (.-subtraces prev-trace) k)] |
135 | | - (let [{new-subtrace :trace |
136 | | - new-weight :weight |
137 | | - discard :discard} |
138 | | - (trace/update prev-subtrace |
139 | | - (get (choice-map/submaps constraints) |
140 | | - k))] |
141 | | - {:trace new-subtrace |
142 | | - :weight new-weight |
143 | | - :discard discard}) |
144 | | - (gf/generate gf args (get (choice-map/submaps constraints) |
145 | | - k)))] |
146 | | - (swap! state update :trace dynamic.trace/assoc-subtrace k subtrace) |
147 | | - (swap! state update :weight + weight) |
148 | | - (when discard |
149 | | - (swap! state update :discard assoc k discard)) |
150 | | - (trace/retval subtrace)))] |
151 | | - (let [retval (apply (.-clojure-fn gf) |
152 | | - (trace/args prev-trace)) |
153 | | - {:keys [trace weight discard]} @state |
154 | | - unvisited (select-keys (trace/choices prev-trace) |
155 | | - (set/difference (set (keys (trace/choices prev-trace))) |
156 | | - (set (keys (trace/choices trace)))))] |
157 | | - |
158 | | - {:trace (dynamic.trace/with-retval trace retval) |
159 | | - :weight weight |
160 | | - :discard (merge discard unvisited)}))))) |
161 | | - |
162 | 113 | (defn trace-form? |
163 | 114 | "Returns true if `form` is a trace form." |
164 | 115 | [form] |
|
0 commit comments