The Emmy Computer Algebra System.
#139:
Fixes matrix and simplification-related test failures introduced in the last couple of PRs.
Removes the custom ->Quaternion
constructor in emmy.quaternion
; this was causing build warnings in cljs
. Any place you might have used ->Quaternion
, please use emmy.quaternion/make
.
Backs off the various protocol extensions in emmy.collection
from IPersistentMap
and IPersistentSet
to the concrete types shipped with Clojure. This prevents these implementations from attaching, on the JVM side, to new defrecord
instances or other types that extend those protocols.
Fixes a documentation error with emmy.generic/atan
.
#135:
Adds some hidden features for use by emmy.js
to support use of Emmy from JavaScript. These features are not used by default, but are meant to be opted-in by JS libraries that need them.
The function object now uses the field f-name
instead of name
to hold the name of the function. The name property of Function objects in JS is readonly, so we need a different property that we can modify in order to create a JS object which is both an Emmy and an ES6 function.
Adds the function make-es6-callable
to promote an IFn object to a native JS function by birthing a new function object which delegates to the original object's apply method, and copying over the rest of the object's identity.
Adds the function make-es6-indexable
to promote an Emmy Structure to something that behaves more like an ES6 array.
Structure objects are declared es6-iterable
using a standard CLJS feature.
Using with-meta
on a function creates a new object which is not a native JS function, though still invokable in Clojure. This is a steep price to pay for the privilege of adding metadata to a function, so for function objects we allow metadata to be directly applied.
The IMeta interface can be used to retrieve this property-based metadata, but IWithMeta cannot be used to attach it (this interface guarantees the production of a new object). See emmy.function/with-meta
.
#134:
Adds ->TeX
handlers for matrix-by-rows
and column-matrix
.
matrices now freeze into (matrix-by-rows [...] [...])
instead of (matrix-by-rows (up ...) (up ...))
.
functions in emmy.numerical.ode
now set :compile?
to true
by default.
Fixes some TeX
typos in a few of the literate notebooks.
#131 fixes accidental simplification of keywords to nil
.
This release includes big performance upgrades to the emmy.numerical.ode
and emmy.expression.compile
namespaces. These features anticipate lots of lovely visualization features that'll be coming soon.
To port from sicmutils
, simply rename sicmutils
to emmy
everywhere. (If you were using pattern.*
, you'll need to add an emmy
prefix and use emmy.pattern.match
etc instead.)
We also have a new website at https://emmy.mentat.org, and a new project template for getting started with Emmy and Clerk.
#126:
Adds a deps-new
template that sets up a basic Clerk project with Emmy
installed as a dependency. The template lives here.
Adds dev/emmy/notebook.clj
as the new homepage for https://emmy.mentat.org.
#98 upgrades same/ish
to 0.1.6, renames all same
requires to same.core
and removes final :include-macros true
from the codebase.
#124:
Upgrades babashka/sci
to 0.7.39.
Adds a working bb repl
command to the repository.
Renames emmy.env.sci
=> emmy.sci
, and adds an emmy.sci/install!
command to make it easier to install all namespaces into a shared SCI context.
Renames context-opts
in the new emmy.sci
to emmy.sci/config
, to match the sci-configs
style.
The full library is now published to https://emmy.mentat.org
as a series of Clerk notebooks. This required a dependency on https://clerk-utils.mentat.org, but no actual Clerk dependency in the library.
#119:
Removes support for :flat
compilation mode (this was a step toward what is now called :primitive). Flat has no further use case.
You can now "bring your own array" to the function provided by stream-integrator
, avoiding an allocation in performance-sensitive contexts.
#118:
Fixes problems with the resolve
calls in emmy.util.def
triggered by vanilla (non-shadow) cljs compilation.
Updates Complex.js
and Fraction.js
dependencies to their latest NPM versions.
Updates odex
to the latest release candidate on NPM.
The cljs
side of emmy.numerical.ode/stream-integrator
gains a :js?
option that defaults to true
. If false
, the returned function will return native JS arrays vs converting the return value to Clojure.
In emmy.expression.compile
, compile-fn
and compile-state-fn
gain a :simplify?
argument that defaults to true
. If false
, compilation will not attempt to simplify the function body before proceeding.
#115:
This PR introduces significant upgrades to the functions in emmy.expression.compile
. compile-state-fn
and compile-fn
now share the same code. Expect some more shifts here as we work on animations.
Specifically, this update:
Removes timers from the code in emmy.numerical.ode
. If you want timing data you can generate an derivative yourself that performs timing. Including this by default introduced a significant performance cost.
Renames emmy.numerical.ode/integration-opts
to make-integrator*
; it now returns only a call to stream-integrator
instead of the old map of this result and timers.
In emmy.expression.compile
:
compile-state-fn*
and compile-fn*
are now removed, in favor of the non-starred versions with option :cache? false
supplied.
compile-fn
now calls compile-state-fn
with params
set to false
and an :arity
option supplied, vs using its own mostly-duplicated implementation.
:flatten?
option removed in favor of the more granular :calling-convention
. This option supports values of :structure
, :flat
and :primitive
. See the docstring for details.
:mode
supports :js
, :source
, :clj
, :native
or :sci
.
#110:
Moves all docstrings that existed as metadata on defs (i.e., (def ^{:doc "..."} sym ...)
) down below the symbol. I hadn't realized that this was a valid way to attach a docstring!
Upgrades GitHub Actions clj-kondo
invocation to version 2013.01.20 and saves some work in the actions setup. Fix all linting errors that resulted.
#109:
->JavaScript
now produces expressions, and not function bodies. This change makes ->JavaScript
do the same job as ->infix
and ->TeX
. Initially, the JS rendering emitted a function in order to facilitate experiments with embedding equations of motion in dynamic web pages. This can still be done: compile-state-fn
has been extended to allow the compilation of a state function into either Clojure or Javascript notation. The test directory contains many worked examples.
numerous local gensym
replacements found useful as part of test fixtures have been gathered together into monotonic-symbol-generator
.
generation of sums and differences in all of the infix generators has been improved to more closely approach standard mathematical notation (e.g., instead of -2 * x + -2 * y
you will see - 2 * x - 2 * y
).
#107:
move CSE to its own namespace to avoid the circular dependency compile
->render
->compile
refactor JS rendering to allow compiler to use it
adjust meaning of :native and :source compilation modes: now you get what's compatible with your execution environment. You can also ask for a specific language, allowing tests to be bilingual.
#100:
Implements predicate support for segment
, entire-segment
and reverse-segment
in emmy.pattern.match
. This support bubbles up to forms in rules like (?? x pred1 pred2)
.
Removes the :emmy.pattern/ignored-restriction
linter keyword, and all clj-kondo code warning that restrictions aren't supported on segment binding forms.
#96 renames #sicm/{bigint, quaternion, complex, ratio}
to #emmy/{bigint, quaternion, complex, ratio}
.
#1, #2:
Renames the sicmutils
portion of all namespaces to emmy
.
Moves the pattern.*
namespaces into emmy.pattern.*
Ran cljfmt
on all code to tidy up hidden tabs, extra whitespace, etc
Attempted to switch over all badges and links to the proper new locations... we'll see how this went, and I'll fix anything I missed as it comes up.