Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Method code too large! error when feeding BOPP more than 10 priors to sample from #2

Open
BorisVSchmid opened this issue Oct 31, 2018 · 0 comments

Comments

@BorisVSchmid
Copy link

BorisVSchmid commented Oct 31, 2018

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant