Great work Maik!

It's an impressive library - the fact that you can implement a general 
purpose symbolic analysis technique like "extremata" in a dozen lines of 
Clojure shows just how powerful this is.
On Monday, 23 September 2013 23:38:47 UTC+8, Maik Schünemann wrote:
>
> GSoC ends today and I can announce the 0.2.0 version of the expresso [1] 
> library.
> It is build on top of core.logic and core.matrix and provides symbolic 
> manipulation of algebraic expressions.
>
> What's there? 
> 1. An api/dsl for manipulation of algebraic expressions which doesn't get 
> in your way. Expresso's expressions are 
>    just clojure s-expressions and can be manipulated with rich set of 
> clojure sequence functions
> 2. useful manipulations for mathematical expressions: simplify, 
> multiply-out, differentiate, ...
> 3. An equation solver which is capable of solving a single equation and 
> multiple equations for unknowns.
> 4. An optimizer which transforms a mathematical expression to a 
> semantically equivalent but performanter one
> 5. An expression compiler to compile an expression to an efficient clojure 
> function
> 6. A semantic rule based translator on top of which many of expresso's 
> features are implemented
>
> The code is fully documented and I wrote a tutorial and showcase of 
> expresso, the expresso-tutorial [2].
>
> GSoC has been a really fun and valuable time for me. I learned a lot. Of 
> course I will continue developing expresso!
> Expresso and core.matrix are the first steps in the direction of a full 
> computer algebra system for clojure. I hope that it will help clojure to be 
> an attractive choice for scientific computing projects in the future.
>
> Showcase: 
> Here are two examples of expresso's facility to manipulate mathematical 
> expressions. They can be found and are explained in the expresso-tutorial 
> [2].
>
> 1. solving word problems:
>
> (solve 'blue
>   (ex (= pencils (+ green white blue red)))
>   (ex (= (/ pencils 10) green))
>   (ex (= (/ pencils 2) white))
>   (ex (= (/ pencils 4) blue))
>   (ex (= red 45))) ;=> #{{blue 75N}}
>
>
> 2. Analyzing roots and extremata of functions. This code shows how easy 
> one can implement tasks involving symbolic manipulation with expresso: 
>
> (defn roots
>   "returns the set of roots of the expression in regard to var"
>   [var expr]
>   (solve var (ex (= ~expr 0))))
>
>
> (defn extremata 
>   "gets the extrema of the expression in regard to var. Returns a map with the
>    keys :maxima and :minima"
>   [var expr]
>   (let [d1 (differentiate [var] expr)
>         d2 (differentiate [var] d1)
>         candidates (roots var d1)]
>     (if (seq candidates)
>       (let [extremata
>             (->> candidates
>                  (map (fn [candidate] [candidate (evaluate d2 {var 
> candidate})]))
>                  (remove #(== 0 (second %)))
>                  (group-by #(< 0 (second %))))]
>         {:maxima (map first (get extremata false))
>          :minima (map first (get extremata true))}))))
>                  
>
> (defn analyse-function 
>   "returns a map with the :roots, the :maxima and the :minima of the 
> expression
>    in regard to var"
>   [var expr]
>   (assoc (extremata var expr)
>     :roots (roots var expr)))
>
> (analyse-function 'x (ex (- (** x 4) (** x 2))))
> ;=> {:roots #{0 -1 1},
> ;;   :maxima (0),
> ;;   :minima (0.7071067811865476 -0.7071067811865476)}
>
>
> Ideas/feedbacks etc are greatly appreciated!
> Enjoy,
> Maik
>
> [1] https://github.com/clojure-numerics/expresso
> [2] https://github.com/mschuene/expresso-tutorial
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to