Fast and simple access to Julia embedded in node
npm install node-julianode-julia
==========

Fast and simple access to Julia embedded in node.
First install Julia, then
npm install node-julia
When the module is built, the installer searches for Julia in several
standard locations starting with julia located on the command path.
Is is assumed that the julia lib directory is located in a standard location
relative to where the julia executable is located see here
for full documentation and release notes.
To compute the solution to a system of 3 equations and 3 unknowns, use the Julia
linear algebra package.
julia = require('node-julia');
var a = julia.eval('[ 1 2 3 ; 3 4 1; 8 2 9]');
var b = julia.eval("[1 1 1]'");
var c = julia.exec('\\',a,b);
console.log('Solution: ' + c[0][0] + 'x + ' + c[1][0] + 'y + ' + c[2][0] + 'z');
produces
Solution: -0.1463414634146341x + 0.3170731707317073y + 0.17073170731707316z
There are 4 base functions; eval exec and Script, and import.
This function takes a single string argument and evaluates it like it was typed
in the Julia command line and returns the result res while err will be false if
successful or contain a error message otherwise
julia.eval('e^10',function(err,res) {
if(!err) console.log('exp(10) = ',res)
});
// simple prevention of premature exit
setTimeout(function(){ console.log('done.'); },1000);
Calls to eval without a function callback are also supported. Matrices
are easily constructed using Julia's Matlab-like matrix syntax.
console.log('2x2 matrix: ',julia.eval('[1 2; 3 4]'));
This function takes a String naming the Julia function to use followed by any number of
arguments for that function. Like eval the last argument may be a function callback.
Calculate the inverse of a matrix and print the result.
var a = julia.eval('[2 1; 1 1]');
julia.exec('inv',a,function(err,inv) {
if(!err) {
console.log("Inverse is:");
for(var i = 0;i < 2;i++)
console.log('[' + inv[i][0] + ', ' + inv[i][1] + ']');
}
else console.log(err);
});
setTimeout(function(){ console.log('done.'); },1000);
Julia modules may be imported using import and the functions exported by
the module will be mapped to Javascript functions. For example,
JuMP can conveniently be
used to solve a linear programming problem in the following way:
var julia = require('node-julia');
var JuMP = julia.import('JuMP');
var m = julia.eval('m = JuMP.Model()');
var m = julia.eval('m = JuMP.Model()');
var x = julia.eval('JuMP.@defVar(m,0 <= x <= 2)');
var y = julia.eval('JuMP.@defVar(m,0 <= y <= 30)');
julia.eval('JuMP.@setObjective(m,Max, 5x + 3*y)');
julia.eval('JuMP.@addConstraint(m,1x + 5y <= 3.0)');
var status = JuMP.solve(m);
console.log('Objective value: ',JuMP.getObjectiveValue(m));
console.log('X value: ',JuMP.getValue(x));
console.log('Y value: ',JuMP.getValue(y));
Julia scripts can be functionalized and compiled and then subsequently
called using Script.exec which has the same semantics as exec.
var aScript = julia.Script('ascript.jl');
aScript.exec();
var a = julia.exec('rand',400,400); // synchronous
julia.exec('svd',a,function(err,u,s,v) { // asynchronous
...
});
When executing a call synchronously, Julia errors are caught and then
thrown as JavaScript exceptions. Conversely, when Julia errors occur when
processing asynchronously, the error code is returned as the first argument
to the callback function.
npm test
Julia version 0.3 is supported on all versions of node and iojs, but Julia 0.4+
and node 0.10 are incompatible.
Tested on OS/X, Linux, Windows.
* node 0.10 is deprecated due to Julia changes that have caused an incompatibility
between Julia 0.4 and node 0.10.