(ns emmy.sci
(:refer-clojure :exclude [ns-map])
(:require [emmy.env]
[emmy.util :refer [copy-ns]]
[sci.core :as sci]
[sci.ctx-store])
#?(:cljs (:require-macros [emmy.sci])))
(def namespaces
"SCI namespace map. Consumers wishing to use a more
minimal SCI environment should select their desired namespaces from this map."
{'emmy.algebra.fold (copy-ns emmy.algebra.fold (sci/create-ns 'emmy.algebra.fold))
'emmy.complex (copy-ns emmy.complex (sci/create-ns 'emmy.complex))
'emmy.differential (copy-ns emmy.differential (sci/create-ns 'emmy.differential))
'emmy.env (copy-ns emmy.env (sci/create-ns 'emmy.env))
'emmy.expression (copy-ns emmy.expression (sci/create-ns 'emmy.expression))
'emmy.function (copy-ns emmy.function (sci/create-ns 'emmy.function))
'emmy.generic (copy-ns emmy.generic (sci/create-ns 'emmy.generic))
'emmy.matrix (copy-ns emmy.matrix (sci/create-ns 'emmy.matrix))
'emmy.modint (copy-ns emmy.modint (sci/create-ns 'emmy.modint))
'emmy.numsymb (copy-ns emmy.numsymb (sci/create-ns 'emmy.numsymb))
'emmy.operator (copy-ns emmy.operator (sci/create-ns 'emmy.operator))
'emmy.pattern.consequence (copy-ns emmy.pattern.consequence (sci/create-ns 'emmy.pattern.consequence))
'emmy.pattern.match (copy-ns emmy.pattern.match (sci/create-ns 'emmy.pattern.match))
'emmy.pattern.rule (copy-ns emmy.pattern.rule (sci/create-ns 'emmy.pattern.rule))
'emmy.pattern.syntax (copy-ns emmy.pattern.syntax (sci/create-ns 'emmy.pattern.syntax))
'emmy.polynomial (copy-ns emmy.polynomial (sci/create-ns 'emmy.polynomial))
'emmy.polynomial.factor (copy-ns emmy.polynomial.factor (sci/create-ns 'emmy.polynomial.factor))
'emmy.polynomial.gcd (copy-ns emmy.polynomial.gcd (sci/create-ns 'emmy.polynomial.gcd))
'emmy.polynomial.interpolate (copy-ns emmy.polynomial.interpolate (sci/create-ns 'emmy.polynomial.interpolate))
'emmy.polynomial.richardson (copy-ns emmy.polynomial.richardson (sci/create-ns 'emmy.polynomial.richardson))
'emmy.quaternion (copy-ns emmy.quaternion (sci/create-ns 'emmy.quaternion))
'emmy.ratio (copy-ns emmy.ratio (sci/create-ns 'emmy.ratio))
'emmy.rational-function (copy-ns emmy.rational-function (sci/create-ns 'emmy.rational-function))
'emmy.rational-function.interpolate (copy-ns emmy.rational-function.interpolate (sci/create-ns 'emmy.rational-function.interpolate))
'emmy.series (copy-ns emmy.series (sci/create-ns 'emmy.series))
'emmy.simplify (copy-ns emmy.simplify (sci/create-ns 'emmy.simplify))
'emmy.simplify.rules (copy-ns emmy.simplify.rules (sci/create-ns 'emmy.simplify.rules))
'emmy.structure (copy-ns emmy.structure (sci/create-ns 'emmy.structure))
'emmy.util (copy-ns emmy.util (sci/create-ns 'emmy.util))
'emmy.value (copy-ns emmy.value (sci/create-ns 'emmy.value))
'emmy.abstract.function (copy-ns emmy.abstract.function (sci/create-ns 'emmy.abstract.function))
'emmy.abstract.number (copy-ns emmy.abstract.number (sci/create-ns 'emmy.abstract.number))
'emmy.calculus.basis (copy-ns emmy.calculus.basis (sci/create-ns 'emmy.calculus.basis))
'emmy.calculus.connection (copy-ns emmy.calculus.connection (sci/create-ns 'emmy.calculus.connection))
'emmy.calculus.coordinate (copy-ns emmy.calculus.coordinate (sci/create-ns 'emmy.calculus.coordinate))
'emmy.calculus.covariant (copy-ns emmy.calculus.covariant (sci/create-ns 'emmy.calculus.covariant))
'emmy.calculus.curvature (copy-ns emmy.calculus.curvature (sci/create-ns 'emmy.calculus.curvature))
'emmy.calculus.derivative (copy-ns emmy.calculus.derivative (sci/create-ns 'emmy.calculus.derivative))
'emmy.calculus.form-field (copy-ns emmy.calculus.form-field (sci/create-ns 'emmy.calculus.form-field))
'emmy.calculus.frame (copy-ns emmy.calculus.frame (sci/create-ns 'emmy.calculus.frame))
'emmy.calculus.hodge-star (copy-ns emmy.calculus.hodge-star (sci/create-ns 'emmy.calculus.hodge-star))
'emmy.calculus.indexed (copy-ns emmy.calculus.indexed (sci/create-ns 'emmy.calculus.indexed))
'emmy.calculus.manifold (copy-ns emmy.calculus.manifold (sci/create-ns 'emmy.calculus.manifold))
'emmy.calculus.metric (copy-ns emmy.calculus.metric (sci/create-ns 'emmy.calculus.metric))
'emmy.calculus.map (copy-ns emmy.calculus.map (sci/create-ns 'emmy.calculus.map))
'emmy.calculus.vector-calculus (copy-ns emmy.calculus.vector-calculus (sci/create-ns 'emmy.calculus.vector-calculus))
'emmy.calculus.vector-field (copy-ns emmy.calculus.vector-field (sci/create-ns 'emmy.calculus.vector-field))
'emmy.expression.analyze (copy-ns emmy.expression.analyze (sci/create-ns 'emmy.expression.analyze))
'emmy.expression.compile (copy-ns emmy.expression.compile (sci/create-ns 'emmy.expression.compile))
'emmy.expression.cse (copy-ns emmy.expression.cse (sci/create-ns 'emmy.expression.cse))
'emmy.expression.render (copy-ns emmy.expression.render (sci/create-ns 'emmy.expression.render))
'emmy.mechanics.lagrange (copy-ns emmy.mechanics.lagrange (sci/create-ns 'emmy.mechanics.lagrange))
'emmy.mechanics.hamilton (copy-ns emmy.mechanics.hamilton (sci/create-ns 'emmy.mechanics.hamilton))
'emmy.mechanics.noether (copy-ns emmy.mechanics.noether (sci/create-ns 'emmy.mechanics.noether))
'emmy.mechanics.rigid (copy-ns emmy.mechanics.rigid (sci/create-ns 'emmy.mechanics.rigid))
'emmy.mechanics.rotation (copy-ns emmy.mechanics.rotation (sci/create-ns 'emmy.mechanics.rotation))
'emmy.mechanics.routhian (copy-ns emmy.mechanics.routhian (sci/create-ns 'emmy.mechanics.routhian))
'emmy.mechanics.time-evolution (copy-ns emmy.mechanics.time-evolution (sci/create-ns 'emmy.mechanics.time-evolution))
'emmy.numerical.derivative (copy-ns emmy.numerical.derivative (sci/create-ns 'emmy.numerical.derivative))
'emmy.numerical.minimize (copy-ns emmy.numerical.minimize (sci/create-ns 'emmy.numerical.minimize))
'emmy.numerical.ode (copy-ns emmy.numerical.ode (sci/create-ns 'emmy.numerical.ode))
'emmy.numerical.quadrature (copy-ns emmy.numerical.quadrature (sci/create-ns 'emmy.numerical.quadrature))
'emmy.numerical.multimin.nelder-mead (copy-ns emmy.numerical.multimin.nelder-mead (sci/create-ns 'emmy.numerical.multimin.nelder-mead))
'emmy.numerical.unimin.bracket (copy-ns emmy.numerical.unimin.bracket (sci/create-ns 'emmy.numerical.unimin.bracket))
'emmy.numerical.unimin.brent (copy-ns emmy.numerical.unimin.brent (sci/create-ns 'emmy.numerical.unimin.brent))
'emmy.numerical.unimin.golden (copy-ns emmy.numerical.unimin.golden (sci/create-ns 'emmy.numerical.unimin.golden))
'emmy.special.elliptic (copy-ns emmy.special.elliptic (sci/create-ns 'emmy.special.elliptic))
'emmy.special.factorial (copy-ns emmy.special.factorial (sci/create-ns 'emmy.special.factorial))
'emmy.sr.boost (copy-ns emmy.sr.boost (sci/create-ns 'emmy.sr.boost))
'emmy.sr.frames (copy-ns emmy.sr.frames (sci/create-ns 'emmy.sr.frames))
'emmy.util.aggregate (copy-ns emmy.util.aggregate (sci/create-ns 'emmy.util.aggregate))
'emmy.util.def (copy-ns emmy.util.def (sci/create-ns 'emmy.util.def))
'emmy.util.logic (copy-ns emmy.util.logic (sci/create-ns 'emmy.util.logic))
'emmy.util.permute (copy-ns emmy.util.permute (sci/create-ns 'emmy.util.permute))
'emmy.util.stream (copy-ns emmy.util.stream (sci/create-ns 'emmy.util.stream))})
{emmy.abstract.function {->Function #object[sci.lang.Var 0x69077aaf {:status :ready :val #object[emmy.abstract.function$eval77944$__GT_Function__77946 0x63e456ea "
emmy.abstract.function$eval77944$__GT_Function__77946@63e456ea"
]
}
]
literal-function #object[sci.lang.Var 0x71dac2e0 {:status :ready :val #object[emmy.abstract.function$literal_function 0x7ea195be "
emmy.abstract.function$literal_function@7ea195be"
]
}
]
literal-function? #object[sci.lang.Var 0x7fefc1a5 {:status :ready :val #object[emmy.abstract.function$literal_function_QMARK_ 0x58a6c6f4 "
emmy.abstract.function$literal_function_QMARK_@58a6c6f4"
]
}
]
with-literal-functions #object[sci.lang.Var 0x281e2255 {:status :ready :val #object[emmy.abstract.function$with_literal_functions 0x7a1ef7fb "
emmy.abstract.function$with_literal_functions@7a1ef7fb"
]
}
]
}
emmy.abstract.number {abstract-number? #object[sci.lang.Var 0x5d74e79a {:status :ready :val #object[emmy.abstract.number$abstract_number_QMARK_ 0x2007f425 "
emmy.abstract.number$abstract_number_QMARK_@2007f425"
]
}
]
literal-number #object[sci.lang.Var 0x5c97e778 {:status :ready :val #object[emmy.abstract.number$literal_number 0x1da16095 "
emmy.abstract.number$literal_number@1da16095"
]
}
]
literal-number? #object[sci.lang.Var 0x5426a35 {:status :ready :val #object[emmy.abstract.number$literal_number_QMARK_ 0x21e8faf6 "
emmy.abstract.number$literal_number_QMARK_@21e8faf6"
]
}
]
}
emmy.algebra.fold {average #object[sci.lang.Var 0x8eef449 {:status :ready :val #object[emmy.algebra.fold$average 0x725c9af9 "
emmy.algebra.fold$average@725c9af9"
]
}
]
constant #object[sci.lang.Var 0x11131fed {:status :ready :val #object[emmy.algebra.fold$constant 0x543c6aab "
emmy.algebra.fold$constant@543c6aab"
]
}
]
count #object[sci.lang.Var 0x796dc38 {:status :ready :val #object[emmy.algebra.fold$count 0x6005073a "
emmy.algebra.fold$count@6005073a"
]
}
]
fold->scan-fn #object[sci.lang.Var 0x78252c3f {:status :ready :val #object[emmy.algebra.fold$fold__GT_scan_fn 0x42c6cd15 "
emmy.algebra.fold$fold__GT_scan_fn@42c6cd15"
]
}
]
fold->sum-fn #object[sci.lang.Var 0x6e38ea90 {:status :ready :val #object[emmy.algebra.fold$fold__GT_sum_fn 0x48212f8a "
emmy.algebra.fold$fold__GT_sum_fn@48212f8a"
]
}
]
generic-sum-fold #object[sci.lang.Var 0x67dd7ccd {:status :ready :val #object[emmy.algebra.fold$generic_sum_fold 0x4a0adc6f "
emmy.algebra.fold$generic_sum_fold@4a0adc6f"
]
}
]
join #object[sci.lang.Var 0x561b1b12 {2 more elided}] kahan #object[3 more elided] kahan-babushka-klein #object[3 more elided] kahan-babushka-neumaier #object[3 more elided] 5 more elided}
emmy.calculus.basis {12 more elided} emmy.calculus.connection {9 more elided} emmy.calculus.coordinate {5 more elided} emmy.calculus.covariant {20+ more elided} emmy.calculus.curvature {6 more elided} emmy.calculus.derivative {6 more elided} emmy.calculus.form-field {19 more elided} 65 more elided}
(def config
"Default sci context options required (currently only `:namespace`
bindings) required to evaluate Emmy forms from inside of an SCI
context. Pass these to `sci/init` to generate an sci context."
{:namespaces namespaces
;; NOTE that these entries are required if you'd like to call the
;; `emmy.algebra.fold/kbk-n` macro, which generates code using
;; `Math/abs`. JVM and js forms are shown.
:classes #?(:clj {'java.lang.Math java.lang.Math}
:cljs {'js goog/global :allow :all})})
{:classes {java.lang.Math java.lang.Math} :namespaces {emmy.abstract.function {->Function #object[sci.lang.Var 0x69077aaf {:status :ready :val #object[emmy.abstract.function$eval77944$__GT_Function__77946 0x63e456ea "
emmy.abstract.function$eval77944$__GT_Function__77946@63e456ea"
]
}
]
literal-function #object[sci.lang.Var 0x71dac2e0 {:status :ready :val #object[emmy.abstract.function$literal_function 0x7ea195be "
emmy.abstract.function$literal_function@7ea195be"
]
}
]
literal-function? #object[sci.lang.Var 0x7fefc1a5 {:status :ready :val #object[emmy.abstract.function$literal_function_QMARK_ 0x58a6c6f4 "
emmy.abstract.function$literal_function_QMARK_@58a6c6f4"
]
}
]
with-literal-functions #object[sci.lang.Var 0x281e2255 {:status :ready :val #object[emmy.abstract.function$with_literal_functions 0x7a1ef7fb "
emmy.abstract.function$with_literal_functions@7a1ef7fb"
]
}
]
}
emmy.abstract.number {abstract-number? #object[sci.lang.Var 0x5d74e79a {:status :ready :val #object[emmy.abstract.number$abstract_number_QMARK_ 0x2007f425 "
emmy.abstract.number$abstract_number_QMARK_@2007f425"
]
}
]
literal-number #object[sci.lang.Var 0x5c97e778 {:status :ready :val #object[emmy.abstract.number$literal_number 0x1da16095 "
emmy.abstract.number$literal_number@1da16095"
]
}
]
literal-number? #object[sci.lang.Var 0x5426a35 {:status :ready :val #object[emmy.abstract.number$literal_number_QMARK_ 0x21e8faf6 "
emmy.abstract.number$literal_number_QMARK_@21e8faf6"
]
}
]
}
emmy.algebra.fold {average #object[sci.lang.Var 0x8eef449 {:status :ready :val #object[emmy.algebra.fold$average 0x725c9af9 "
emmy.algebra.fold$average@725c9af9"
]
}
]
constant #object[sci.lang.Var 0x11131fed {:status :ready :val #object[emmy.algebra.fold$constant 0x543c6aab "
emmy.algebra.fold$constant@543c6aab"
]
}
]
count #object[sci.lang.Var 0x796dc38 {:status :ready :val #object[emmy.algebra.fold$count 0x6005073a "
emmy.algebra.fold$count@6005073a"
]
}
]
fold->scan-fn #object[sci.lang.Var 0x78252c3f {:status :ready :val #object[emmy.algebra.fold$fold__GT_scan_fn 0x42c6cd15 "
emmy.algebra.fold$fold__GT_scan_fn@42c6cd15"
]
}
]
fold->sum-fn #object[sci.lang.Var 0x6e38ea90 {:status :ready :val #object[emmy.algebra.fold$fold__GT_sum_fn 0x48212f8a "
emmy.algebra.fold$fold__GT_sum_fn@48212f8a"
]
}
]
generic-sum-fold #object[sci.lang.Var 0x67dd7ccd {:status :ready :val #object[emmy.algebra.fold$generic_sum_fold 0x4a0adc6f "
emmy.algebra.fold$generic_sum_fold@4a0adc6f"
]
}
]
join #object[3 more elided] kahan #object[3 more elided] kahan-babushka-klein #object[3 more elided] kahan-babushka-neumaier #object[3 more elided] 5 more elided}
emmy.calculus.basis {12 more elided} emmy.calculus.connection {9 more elided} emmy.calculus.coordinate {5 more elided} emmy.calculus.covariant {20+ more elided} emmy.calculus.curvature {6 more elided} emmy.calculus.derivative {6 more elided} emmy.calculus.form-field {19 more elided} 65 more elided}}
(def context
"sci context required to evaluate Emmy forms via SCI."
(sci/init config))
{:allow nil :bindings {} :check-permissions nil :deny nil :env #object[clojure.lang.Atom 0x2c31e1e7 {:status :ready :val {:class->opts {clojure.lang.Delay {:class clojure.lang.Delay} clojure.lang.ExceptionInfo {:class clojure.lang.ExceptionInfo} clojure.lang.LazySeq {:class clojure.lang.LazySeq} clojure.lang.LineNumberingPushbackReader {:class clojure.lang.LineNumberingPushbackReader} java.io.StringReader {:class java.io.StringReader} java.io.StringWriter {:class java.io.StringWriter} java.lang.ArithmeticException {:class java.lang.ArithmeticException} java.lang.AssertionError {:class java.lang.AssertionError} java.lang.Double {:class java.lang.Double} java.lang.Exception {:class java.lang.Exception} 9 more elided} :imports {ArithmeticException java.lang.ArithmeticException AssertionError java.lang.AssertionError Double java.lang.Double Exception java.lang.Exception Integer java.lang.Integer Number java.lang.Number Object java.lang.Object String java.lang.String} :load-fn nil :namespaces {clojure.core {* #object[sci.lang.Var 0x745c0c1a {:status :ready :val #object[clojure.core$_STAR_ 0x4c3c9924 "
clojure.core$_STAR_@4c3c9924"
]
}
]
*' #object[sci.lang.Var 0x68cc5e2b {:status :ready :val #object[clojure.core$_STAR__SINGLEQUOTE_ 0x5f7a8410 "
clojure.core$_STAR__SINGLEQUOTE_@5f7a8410"
]
}
]
*1 #object[sci.lang.Var 0x14b6aae6 {:status :ready :val #object[clojure.lang.Var$Unbound 0x1e48b6 "
Unbound: #'sci.impl.namespaces/*1"
]
}
]
*2 #object[sci.lang.Var 0xa296398 {:status :ready :val #object[clojure.lang.Var$Unbound 0x1f82cc9 "
Unbound: #'sci.impl.namespaces/*2"
]
}
]
*3 #object[sci.lang.Var 0x20b8578a {:status :ready :val #object[clojure.lang.Var$Unbound 0x5291e0d3 "
Unbound: #'sci.impl.namespaces/*3"
]
}
]
*assert* #object[3 more elided] *clojure-version* #object[3 more elided] *data-readers* #object[3 more elided] *default-data-reader-fn* #object[3 more elided] *e #object[3 more elided] 547 more elided}
clojure.edn {3 more elided} clojure.lang {11 more elided} clojure.repl {12 more elided} clojure.set {13 more elided} clojure.string {22 more elided} clojure.template {3 more elided} clojure.walk {11 more elided} emmy.abstract.function {4 more elided} emmy.abstract.number {3 more elided} 77 more elided}
:ns-aliases {} :public-class nil :raw-classes {19 more elided}}
}
]
:features nil :main-thread-id 1 :proxy-fn nil :readers nil :reify-fn #object[sci.impl.opts$default_reify_fn 0x5b381b27 "
sci.impl.opts$default_reify_fn@5b381b27"
]
1 more elided}
(defn install!
"Installs [[config]] into the shared SCI context store."
[]
(sci.ctx-store/swap-ctx!
sci/merge-opts
config))
#object[emmy.sci$install_BANG_ 0x5f45a21a "
emmy.sci$install_BANG_@5f45a21a"
]