Project DescriptionSimple C#/F# library for Symbolic Differentiation and whatever else comes to mind ;)
This project is about building a library of useful code and at the same time have fun with the latest C# 3.0 / F# CTP features :)
And now also to explore the interoperability between C# and F# :))
At the moment we have a simple implementation of the following:
C# and F#:
- Tokenizer
- Combinator Parsers inspired by Brian's brillian Inside F# blog
- AST
- Symbolic Differentiation Visitor
- Simplifier Visitor
- Functions support
- Conditional expression support (new)
F# only:
- Aggregation of sequences based on Expressions ;)
- Parallel computation of expressions based on depth of AST (Example: Expression like:
(A+B) * (D+E) uses 2 cores and
( (A +B) * (D+E) ) + ( (A +B) * (D+E) ) uses 4 cores :))))
- ToString Visitor
Requirements:
- Any code contributed to this project be fully TDDed.
- No code generation code is allowed.
What's next:
- Expand the functionality of each component to cover as many cases as possible and improve the quality of the code and testing along the way.
Recommended Readings
Structure and Interpretation of Computer ProgramsExpert F#References:
http://fsharpcode.blogspot.comhttp://en.wikipedia.org/wiki/Differentiation_ruleshttp://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!133.entry?_c=BlogParthttp://blogs.msdn.com/lukeh/archive/2007/08/19/monadic-parser-combinators-using-c-3-0.aspxhttp://www.cs.nott.ac.uk/~gmh/pearl.pdfhttp://leibnizdream.wordpress.com/2007/12/22/first-class-functions2-multiprogramming/Parallel versus Sequential Computation Performance:
Expression:
(((A + B) * (A + B)) * ((A + B) * (A + B))) + (((A + B) * (A + B)) * ((A + B) * (A + B))) Data Size:
A: 1..1000000 B: 1..1000000 Intel Xeon CPU X5450 QUAD-CORE @ 3.00Ghz X2 (8 cores) 3.25 GB of Ram Sequential elapsed:
00:06:28.4842822 Parallel elapsed:
00:01:48.6659580 Operations were made more intensive using the following code:
(+) : for (int i = 0; i < 10000; i++) { z = x + y; } (*) : for (int i = 0; i < 10000; i++) { z = x * y; } Performance comparison between C# and F# Tokenizer:
(Size of the test data: 100.000 Letters separated by spaces)
C#: 00:09:39.7925956 (hh:mm:ss)
F#: 00:09:42.6639161 (hh:mm:ss)
Enjoy ;)
Edmondo Pentangelo