bopp
bopp copied to clipboard
Method code too large! error when feeding BOPP more than 10 priors to sample from
I am getting a
clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Method code too large!, compiling:(C:\Users\Boris\Boris\home\projects\methodlarge\src\methodlarge\core.clj:13:1)
error when feeding BOPP too many priors and a primitive procedure. Here is a minimal example with BOPP 0.1.5 with java version 1.8.0_191, in which the first defopt example spits the method code too large error. The problem doesn't seem to be with anglican, but with BOPP. Is there any way around it?
(ns methodlarge.core
(:require [bopp.core :refer :all])
(:require [anglican.core :refer :all])
(:require [anglican.runtime :refer :all])
(:require [anglican.emit :refer :all]))
;;
;; With a primitive procedure, defopt seems to have a max of 10 priors.
;; Adding s11 gives a "method code too large!"
;;
(defn dummy [n] n)
(anglican.emit/with-primitive-procedures [dummy]
(defopt condenser [] [s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11]
(let [s1 (sample (uniform-continuous 0 1))
s2 (sample (uniform-continuous 0 1))
s3 (sample (uniform-continuous 0 1))
s4 (sample (uniform-continuous 0 1))
s5 (sample (uniform-continuous 0 1))
s6 (sample (uniform-continuous 0 1))
s7 (sample (uniform-continuous 0 1))
s8 (sample (uniform-continuous 0 1))
s9 (sample (uniform-continuous 0 1))
s10 (sample (uniform-continuous 0 1))
s11 (sample (uniform-continuous 0 1))
score (+ s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11)]
(observe (normal 0 0.1) score))))
;;
;; Without the primitive procedure, defopt can deal with many priors
;;
(defopt condenser [] [s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20]
(let [s1 (sample (uniform-continuous 0 1))
s2 (sample (uniform-continuous 0 1))
s3 (sample (uniform-continuous 0 1))
s4 (sample (uniform-continuous 0 1))
s5 (sample (uniform-continuous 0 1))
s6 (sample (uniform-continuous 0 1))
s7 (sample (uniform-continuous 0 1))
s8 (sample (uniform-continuous 0 1))
s9 (sample (uniform-continuous 0 1))
s10 (sample (uniform-continuous 0 1))
s11 (sample (uniform-continuous 0 1))
s12 (sample (uniform-continuous 0 1))
s13 (sample (uniform-continuous 0 1))
s14 (sample (uniform-continuous 0 1))
s15 (sample (uniform-continuous 0 1))
s16 (sample (uniform-continuous 0 1))
s17 (sample (uniform-continuous 0 1))
s18 (sample (uniform-continuous 0 1))
s19 (sample (uniform-continuous 0 1))
s20 (sample (uniform-continuous 0 1))
score (+ s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20)]
(observe (normal 0 0.1) score)))
;;
;; the 11 priors sampled doesn't seem to be a restriction of anglican.
;;
(anglican.emit/with-primitive-procedures [dummy]
(defquery condenser []
(let [s1 (sample (uniform-continuous 0 1))
s2 (sample (uniform-continuous 0 1))
s3 (sample (uniform-continuous 0 1))
s4 (sample (uniform-continuous 0 1))
s5 (sample (uniform-continuous 0 1))
s6 (sample (uniform-continuous 0 1))
s7 (sample (uniform-continuous 0 1))
s8 (sample (uniform-continuous 0 1))
s9 (sample (uniform-continuous 0 1))
s10 (sample (uniform-continuous 0 1))
s11 (sample (uniform-continuous 0 1))
s12 (sample (uniform-continuous 0 1))
s13 (sample (uniform-continuous 0 1))
s14 (sample (uniform-continuous 0 1))
s15 (sample (uniform-continuous 0 1))
s16 (sample (uniform-continuous 0 1))
s17 (sample (uniform-continuous 0 1))
s18 (sample (uniform-continuous 0 1))
s19 (sample (uniform-continuous 0 1))
s20 (sample (uniform-continuous 0 1))
score (+ s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20)]
(observe (normal 0 0.1) score))))
What I can find on the internet, is that some functions in clojure can generate errors like that. See: https://stackoverflow.com/questions/26353658/for-vs-doseq-and-method-code-too-large