Home

Awesome

MathPresso - Mathematical Expression Evaluator And Jit Compiler for C++ Language

This is fork of MathPresso. Main project is located at http://code.google.com/p/mathpresso/

MathPresso is C++ library that is able to parse and evaluate mathematical expressions. Because evaluating expressions can be slow MathPresso contains jit compiler that can compile expressions into machine code. Jit compiled expressions are many times faster than built-in evaluator. Thanks to AsmJit library MathPresso is able to compile functions for 32-bit (x86) and 64-bit (x64) processors.

MathPresso is also an example how is possible to do with AsmJit library.

Dependencies

AsmJit - 1.0 or later

Example

Example how to compile and evaluate expression:

#include <cstdlib>
#include <iostream>
#include <MathPresso/MathPresso.h>

using namespace std;

int main(void)
{
	MathPresso::Context ctx;
	MathPresso::Expression e;

	// values of variables used in expression
	MathPresso::mreal_t variables[] = { 1, 2 };

	// initialize the context with math environment (add math functions like sin, cos ..)
	ctx.addEnvironment(MathPresso::MENVIRONMENT_MATH);

	// add variables (name, offset)
	ctx.addVariable("x", 0 * sizeof(MathPresso::mreal_t));
	ctx.addVariable("y", 1 * sizeof(MathPresso::mreal_t));

	// compile an expression in specific context
	if (e.create(ctx, "pow(sin(x), 2) + pow(cos(x), 2)", MathPresso::MOPTION_NONE) != MathPresso::MRESULT_OK)
	{
		// handle compilation errr
		cerr << "Error compiling expression" << endl;
		return EXIT_FAILURE;
	}

	// if success then evaluate an expression 
	cout << e.evaluate(variables) << endl;

	return EXIT_SUCCESS;
}


JIT compilation

Currently MathPresso is able to generate SSE or SSE2 instructions. The code in default branch generates SSE instructions and operates with single precision floating point numbers (SP-FP). If you need to perform an operations with double precision floating point (DP-FP, 64 bit) then you need to check out DoublePresso branch.

Embedded functions

MathPresso supports following embedded functions:

If it's not enough you can add your function to the context:

// implement your function
static mreal_t sum(mreal_t x, mreal_t y) { return x + y; }
...

// add your function to the context
ctx.addFunction("sum", (void *) sum, MathPresso::MFUNC_F_ARG2);
...

// and use it on expression
if (e.create(ctx, "1 + sum(x, y)", MathPresso::MOPTION_NONE) != MathPresso::MRESULT_OK)
{
...