Support for adding elements in random positions in an opennl matrix.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 30 Oct 2005 18:38:35 +0000 (18:38 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sun, 30 Oct 2005 18:38:35 +0000 (18:38 +0000)
Also some code formatting.

intern/opennl/extern/ONL_opennl.h
intern/opennl/intern/opennl.c

index a84a153709d6a25f382ae9fe5cbf62fa8560b6ba..128f1b137bcfb12550dc2e2ba5182165948c9981 100644 (file)
@@ -52,33 +52,25 @@ extern "C" {
 
 #define NL_VERSION_0_0 1
 
-/*
- *
- * Datatypes
- *
- */
+/* Datatypes */
 
 typedef unsigned int   NLenum;
 typedef unsigned char  NLboolean;
 typedef unsigned int   NLbitfield;
-typedef void           NLvoid;
-typedef signed char    NLbyte;         /* 1-byte signed */
-typedef short          NLshort;        /* 2-byte signed */
-typedef int            NLint;          /* 4-byte signed */
+typedef void                   NLvoid;
+typedef signed char            NLbyte;         /* 1-byte signed */
+typedef short                  NLshort;        /* 2-byte signed */
+typedef int                            NLint;          /* 4-byte signed */
 typedef unsigned char  NLubyte;        /* 1-byte unsigned */
 typedef unsigned short NLushort;       /* 2-byte unsigned */
 typedef unsigned int   NLuint;         /* 4-byte unsigned */
-typedef int            NLsizei;        /* 4-byte signed */
-typedef float          NLfloat;        /* single precision float */
-typedef double         NLdouble;       /* double precision float */
+typedef int                            NLsizei;        /* 4-byte signed */
+typedef float                  NLfloat;        /* single precision float */
+typedef double                 NLdouble;       /* double precision float */
 
-typedef void* NLContext ;
+typedef void* NLContext;
 
-/*
- *
- * Constants
- *
- */
+/* Constants */
 
 #define NL_FALSE   0x0
 #define NL_TRUE    0x1
@@ -106,54 +98,51 @@ typedef void* NLContext ;
 #define NL_RIGHT_HAND_SIDE 0x500
 #define NL_ROW_SCALING     0x501
 
-/*
- * Contexts
- */
-    NLContext nlNewContext(void) ;
-    void nlDeleteContext(NLContext context) ;
-    void nlMakeCurrent(NLContext context) ;
-    NLContext nlGetCurrent(void) ;
+/* Contexts */
 
-/*
- * State set/get
- */
+NLContext nlNewContext(void);
+void nlDeleteContext(NLContext context);
+void nlMakeCurrent(NLContext context);
+NLContext nlGetCurrent(void);
 
-    void nlSolverParameterf(NLenum pname, NLfloat param) ;
-    void nlSolverParameteri(NLenum pname, NLint param) ;
+/* State get/set */
 
-    void nlRowParameterf(NLenum pname, NLfloat param) ;
-    void nlRowParameteri(NLenum pname, NLint param) ;
+void nlSolverParameterf(NLenum pname, NLfloat param);
+void nlSolverParameteri(NLenum pname, NLint param);
 
-    void nlGetBooleanv(NLenum pname, NLboolean* params) ;
-    void nlGetFloatv(NLenum pname, NLfloat* params) ;
-    void nlGetIntergerv(NLenum pname, NLint* params) ;
+void nlRowParameterf(NLenum pname, NLfloat param);
+void nlRowParameteri(NLenum pname, NLint param);
 
-    void nlEnable(NLenum pname) ;
-    void nlDisable(NLenum pname) ;
-    NLboolean nlIsEnabled(NLenum pname) ;
+void nlGetBooleanv(NLenum pname, NLboolean* params);
+void nlGetFloatv(NLenum pname, NLfloat* params);
+void nlGetIntergerv(NLenum pname, NLint* params);
 
-/*
- * Variables
- */
-    void nlSetVariable(NLuint index, NLfloat value) ;
-    NLfloat nlGetVariable(NLuint index) ;
-    void nlLockVariable(NLuint index) ;
-    void nlUnlockVariable(NLuint index) ;
-    NLboolean nlVariableIsLocked(NLuint index) ;
+void nlEnable(NLenum pname);
+void nlDisable(NLenum pname);
+NLboolean nlIsEnabled(NLenum pname);
 
-/*
- * Begin/End
- */
+/* Variables */
 
-    void nlBegin(NLenum primitive) ;
-    void nlEnd(NLenum primitive) ;
-    void nlCoefficient(NLuint index, NLfloat value) ;
+void nlSetVariable(NLuint index, NLfloat value);
+NLfloat nlGetVariable(NLuint index);
+void nlLockVariable(NLuint index);
+void nlUnlockVariable(NLuint index);
+NLboolean nlVariableIsLocked(NLuint index);
 
-/*
- * Solve
- */
+/* Begin/End */
+
+void nlBegin(NLenum primitive);
+void nlEnd(NLenum primitive);
+void nlCoefficient(NLuint index, NLfloat value);
+
+/* Setting random elements matrix/vector - not for least squares! */
+
+void nlMatrixAdd(NLuint row, NLuint col, NLfloat value);
+void nlRightHandSideAdd(NLuint index, NLfloat value);
+
+/* Solve */
 
-    NLboolean nlSolve(void) ;
+NLboolean nlSolve(void);
 
 #ifdef __cplusplus
 }
index 3bc87c8dc76755e8a9a6110e9a8886213a791ef4..7773582e0272932262883ea2424bc18b7c5d29c3 100644 (file)
@@ -62,8 +62,8 @@ static void __nl_assertion_failed(char* cond, char* file, int line) {
         stderr, 
         "OpenNL assertion failed: %s, file:%s, line:%d\n",
         cond,file,line
-    ) ;
-    abort() ;
+    );
+    abort();
 }
 
 static void __nl_range_assertion_failed(
@@ -73,8 +73,8 @@ static void __nl_range_assertion_failed(
         stderr, 
         "OpenNL range assertion failed: %f in [ %f ... %f ], file:%s, line:%d\n",
         x, min_val, max_val, file,line
-    ) ;
-    abort() ;
+    );
+    abort();
 }
 
 static void __nl_should_not_have_reached(char* file, int line) {
@@ -82,14 +82,14 @@ static void __nl_should_not_have_reached(char* file, int line) {
         stderr, 
         "OpenNL should not have reached this point: file:%s, line:%d\n",
         file,line
-    ) ;
-    abort() ;
+    );
+    abort();
 }
 
 
 #define __nl_assert(x) {                                        \
     if(!(x)) {                                                  \
-        __nl_assertion_failed(#x,__FILE__, __LINE__) ;          \
+        __nl_assertion_failed(#x,__FILE__, __LINE__);          \
     }                                                           \
 } 
 
@@ -97,12 +97,12 @@ static void __nl_should_not_have_reached(char* file, int line) {
     if(((x) < (min_val)) || ((x) > (max_val))) {                \
         __nl_range_assertion_failed(x, min_val, max_val,        \
             __FILE__, __LINE__                                  \
-        ) ;                                                     \
+        );                                                     \
     }                                                           \
 }
 
 #define __nl_assert_not_reached {                               \
-    __nl_should_not_have_reached(__FILE__, __LINE__) ;          \
+    __nl_should_not_have_reached(__FILE__, __LINE__);          \
 }
 
 #ifdef NL_DEBUG
@@ -148,73 +148,73 @@ static void __nl_should_not_have_reached(char* file, int line) {
 /* Dynamic arrays for sparse row/columns */
 
 typedef struct {
-    NLuint   index ;
-    NLfloat value ;
-} __NLCoeff ;
+    NLuint   index;
+    NLfloat value;
+} __NLCoeff;
 
 typedef struct {
-    NLuint size ;
-    NLuint capacity ;
-    __NLCoeff* coeff ;
-} __NLRowColumn ;
+    NLuint size;
+    NLuint capacity;
+    __NLCoeff* coeff;
+} __NLRowColumn;
 
 static void __nlRowColumnConstruct(__NLRowColumn* c) {
-    c->size     = 0 ;
-    c->capacity = 0 ;
-    c->coeff    = NULL ;
+    c->size     = 0;
+    c->capacity = 0;
+    c->coeff    = NULL;
 }
 
 static void __nlRowColumnDestroy(__NLRowColumn* c) {
-    __NL_DELETE_ARRAY(c->coeff) ;
+    __NL_DELETE_ARRAY(c->coeff);
 #ifdef NL_PARANOID
-    __NL_CLEAR(__NLRowColumn, c) 
+    __NL_CLEAR(__NLRowColumn, c); 
 #endif
 }
 
 static void __nlRowColumnGrow(__NLRowColumn* c) {
     if(c->capacity != 0) {
-        c->capacity = 2 * c->capacity ;
-        c->coeff = __NL_RENEW_ARRAY(__NLCoeff, c->coeff, c->capacity) ;
+        c->capacity = 2 * c->capacity;
+        c->coeff = __NL_RENEW_ARRAY(__NLCoeff, c->coeff, c->capacity);
     } else {
-        c->capacity = 4 ;
-        c->coeff = __NL_NEW_ARRAY(__NLCoeff, c->capacity) ;
+        c->capacity = 4;
+        c->coeff = __NL_NEW_ARRAY(__NLCoeff, c->capacity);
     }
 }
 
 static void __nlRowColumnAdd(__NLRowColumn* c, NLint index, NLfloat value) {
-    NLuint i ;
+    NLuint i;
     for(i=0; i<c->size; i++) {
         if(c->coeff[i].index == (NLuint)index) {
-            c->coeff[i].value += value ;
-            return ;
+            c->coeff[i].value += value;
+            return;
         }
     }
     if(c->size == c->capacity) {
-        __nlRowColumnGrow(c) ;
+        __nlRowColumnGrow(c);
     }
-    c->coeff[c->size].index = index ;
-    c->coeff[c->size].value = value ;
-    c->size++ ;
+    c->coeff[c->size].index = index;
+    c->coeff[c->size].value = value;
+    c->size++;
 }
 
 /* Does not check whether the index already exists */
 static void __nlRowColumnAppend(__NLRowColumn* c, NLint index, NLfloat value) {
     if(c->size == c->capacity) {
-        __nlRowColumnGrow(c) ;
+        __nlRowColumnGrow(c);
     }
-    c->coeff[c->size].index = index ;
-    c->coeff[c->size].value = value ;
-    c->size++ ;
+    c->coeff[c->size].index = index;
+    c->coeff[c->size].value = value;
+    c->size++;
 }
 
 static void __nlRowColumnZero(__NLRowColumn* c) {
-    c->size = 0 ;
+    c->size = 0;
 }
 
 static void __nlRowColumnClear(__NLRowColumn* c) {
-    c->size     = 0 ;
-    c->capacity = 0 ;
-    __NL_DELETE_ARRAY(c->coeff) ;
+    c->size     = 0;
+    c->capacity = 0;
+    __NL_DELETE_ARRAY(c->coeff);
 }
 
 /************************************************************************************/
@@ -225,115 +225,115 @@ static void __nlRowColumnClear(__NLRowColumn* c) {
 #define __NL_SYMMETRIC 4
 
 typedef struct {
-    NLuint m ;
-    NLuint n ;
-    NLuint diag_size ;
-    NLenum storage ;
-    __NLRowColumn* row ;
-    __NLRowColumn* column ;
-    NLfloat*      diag ;
-} __NLSparseMatrix ;
+    NLuint m;
+    NLuint n;
+    NLuint diag_size;
+    NLenum storage;
+    __NLRowColumn* row;
+    __NLRowColumn* column;
+    NLfloat*      diag;
+} __NLSparseMatrix;
 
 
 static void __nlSparseMatrixConstruct(
     __NLSparseMatrix* M, NLuint m, NLuint n, NLenum storage
 ) {
-    NLuint i ;
-    M->m = m ;
-    M->n = n ;
-    M->storage = storage ;
+    NLuint i;
+    M->m = m;
+    M->n = n;
+    M->storage = storage;
     if(storage & __NL_ROWS) {
-        M->row = __NL_NEW_ARRAY(__NLRowColumn, m) ;
+        M->row = __NL_NEW_ARRAY(__NLRowColumn, m);
         for(i=0; i<n; i++) {
-            __nlRowColumnConstruct(&(M->row[i])) ;
+            __nlRowColumnConstruct(&(M->row[i]));
         }
     } else {
-        M->row = NULL ;
+        M->row = NULL;
     }
 
     if(storage & __NL_COLUMNS) {
-        M->column = __NL_NEW_ARRAY(__NLRowColumn, n) ;
+        M->column = __NL_NEW_ARRAY(__NLRowColumn, n);
         for(i=0; i<n; i++) {
-            __nlRowColumnConstruct(&(M->column[i])) ;
+            __nlRowColumnConstruct(&(M->column[i]));
         }
     } else {
-        M->column = NULL ;
+        M->column = NULL;
     }
 
-    M->diag_size = MIN(m,n) ;
-    M->diag = __NL_NEW_ARRAY(NLfloat, M->diag_size) ;
+    M->diag_size = MIN(m,n);
+    M->diag = __NL_NEW_ARRAY(NLfloat, M->diag_size);
 }
 
 static void __nlSparseMatrixDestroy(__NLSparseMatrix* M) {
-    NLuint i ;
-    __NL_DELETE_ARRAY(M->diag) ;
+    NLuint i;
+    __NL_DELETE_ARRAY(M->diag);
     if(M->storage & __NL_ROWS) {
         for(i=0; i<M->m; i++) {
-            __nlRowColumnDestroy(&(M->row[i])) ;
+            __nlRowColumnDestroy(&(M->row[i]));
         }
-        __NL_DELETE_ARRAY(M->row) ;
+        __NL_DELETE_ARRAY(M->row);
     }
     if(M->storage & __NL_COLUMNS) {
         for(i=0; i<M->n; i++) {
-            __nlRowColumnDestroy(&(M->column[i])) ;
+            __nlRowColumnDestroy(&(M->column[i]));
         }
-        __NL_DELETE_ARRAY(M->column) ;
+        __NL_DELETE_ARRAY(M->column);
     }
 #ifdef NL_PARANOID
-    __NL_CLEAR(__NLSparseMatrix,M) ;
+    __NL_CLEAR(__NLSparseMatrix,M);
 #endif
 }
 
 static void __nlSparseMatrixAdd(
     __NLSparseMatrix* M, NLuint i, NLuint j, NLfloat value
 ) {
-    __nl_parano_range_assert(i, 0, M->m - 1) ;
-    __nl_parano_range_assert(j, 0, M->n - 1) ;
+    __nl_parano_range_assert(i, 0, M->m - 1);
+    __nl_parano_range_assert(j, 0, M->n - 1);
     if((M->storage & __NL_SYMMETRIC) && (j > i)) {
-        return ;
+        return;
     }
     if(i == j) {
-        M->diag[i] += value ;
+        M->diag[i] += value;
     }
     if(M->storage & __NL_ROWS) {
-        __nlRowColumnAdd(&(M->row[i]), j, value) ;
+        __nlRowColumnAdd(&(M->row[i]), j, value);
     }
     if(M->storage & __NL_COLUMNS) {
-        __nlRowColumnAdd(&(M->column[j]), i, value) ;
+        __nlRowColumnAdd(&(M->column[j]), i, value);
     }
 }
 
 static void __nlSparseMatrixClear( __NLSparseMatrix* M) {
-    NLuint i ;
+    NLuint i;
     if(M->storage & __NL_ROWS) {
         for(i=0; i<M->m; i++) {
-            __nlRowColumnClear(&(M->row[i])) ;
+            __nlRowColumnClear(&(M->row[i]));
         }
     }
     if(M->storage & __NL_COLUMNS) {
         for(i=0; i<M->n; i++) {
-            __nlRowColumnClear(&(M->column[i])) ;
+            __nlRowColumnClear(&(M->column[i]));
         }
     }
-    __NL_CLEAR_ARRAY(NLfloat, M->diag, M->diag_size) ;    
+    __NL_CLEAR_ARRAY(NLfloat, M->diag, M->diag_size);    
 }
 
 /* Returns the number of non-zero coefficients */
 static NLuint __nlSparseMatrixNNZ( __NLSparseMatrix* M) {
-    NLuint nnz = 0 ;
-    NLuint i ;
+    NLuint nnz = 0;
+    NLuint i;
     if(M->storage & __NL_ROWS) {
         for(i = 0; i<M->m; i++) {
-            nnz += M->row[i].size ;
+            nnz += M->row[i].size;
         }
     } else if (M->storage & __NL_COLUMNS) {
         for(i = 0; i<M->n; i++) {
-            nnz += M->column[i].size ;
+            nnz += M->column[i].size;
         }
     } else {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
-    return nnz ;
+    return nnz;
 }
 
 /************************************************************************************/
@@ -342,18 +342,18 @@ static NLuint __nlSparseMatrixNNZ( __NLSparseMatrix* M) {
 static void __nlSparseMatrix_mult_rows_symmetric(
     __NLSparseMatrix* A, NLfloat* x, NLfloat* y
 ) {
-    NLuint m = A->m ;
-    NLuint i,ij ;
-    __NLRowColumn* Ri = NULL ;
-    __NLCoeff* c = NULL ;
+    NLuint m = A->m;
+    NLuint i,ij;
+    __NLRowColumn* Ri = NULL;
+    __NLCoeff* c = NULL;
     for(i=0; i<m; i++) {
-        y[i] = 0 ;
-        Ri = &(A->row[i]) ;
+        y[i] = 0;
+        Ri = &(A->row[i]);
         for(ij=0; ij<Ri->size; ij++) {
-            c = &(Ri->coeff[ij]) ;
-            y[i] += c->value * x[c->index] ;
+            c = &(Ri->coeff[ij]);
+            y[i] += c->value * x[c->index];
             if(i != c->index) {
-                y[c->index] += c->value * x[i] ;
+                y[c->index] += c->value * x[i];
             }
         }
     }
@@ -362,16 +362,16 @@ static void __nlSparseMatrix_mult_rows_symmetric(
 static void __nlSparseMatrix_mult_rows(
     __NLSparseMatrix* A, NLfloat* x, NLfloat* y
 ) {
-    NLuint m = A->m ;
-    NLuint i,ij ;
-    __NLRowColumn* Ri = NULL ;
-    __NLCoeff* c = NULL ;
+    NLuint m = A->m;
+    NLuint i,ij;
+    __NLRowColumn* Ri = NULL;
+    __NLCoeff* c = NULL;
     for(i=0; i<m; i++) {
-        y[i] = 0 ;
-        Ri = &(A->row[i]) ;
+        y[i] = 0;
+        Ri = &(A->row[i]);
         for(ij=0; ij<Ri->size; ij++) {
-            c = &(Ri->coeff[ij]) ;
-            y[i] += c->value * x[c->index] ;
+            c = &(Ri->coeff[ij]);
+            y[i] += c->value * x[c->index];
         }
     }
 }
@@ -379,18 +379,18 @@ static void __nlSparseMatrix_mult_rows(
 static void __nlSparseMatrix_mult_cols_symmetric(
     __NLSparseMatrix* A, NLfloat* x, NLfloat* y
 ) {
-    NLuint n = A->n ;
-    NLuint j,ii ;
-    __NLRowColumn* Cj = NULL ;
-    __NLCoeff* c = NULL ;
+    NLuint n = A->n;
+    NLuint j,ii;
+    __NLRowColumn* Cj = NULL;
+    __NLCoeff* c = NULL;
     for(j=0; j<n; j++) {
-        y[j] = 0 ;
-        Cj = &(A->column[j]) ;
+        y[j] = 0;
+        Cj = &(A->column[j]);
         for(ii=0; ii<Cj->size; ii++) {
-            c = &(Cj->coeff[ii]) ;
-            y[c->index] += c->value * x[j] ;
+            c = &(Cj->coeff[ii]);
+            y[c->index] += c->value * x[j];
             if(j != c->index) {
-                y[j] += c->value * x[c->index] ;
+                y[j] += c->value * x[c->index];
             }
         }
     }
@@ -399,16 +399,16 @@ static void __nlSparseMatrix_mult_cols_symmetric(
 static void __nlSparseMatrix_mult_cols(
     __NLSparseMatrix* A, NLfloat* x, NLfloat* y
 ) {
-    NLuint n = A->n ;
-    NLuint j,ii 
-    __NLRowColumn* Cj = NULL ;
-    __NLCoeff* c = NULL ;
-    __NL_CLEAR_ARRAY(NLfloat, y, A->m) ;
+    NLuint n = A->n;
+    NLuint j,ii; 
+    __NLRowColumn* Cj = NULL;
+    __NLCoeff* c = NULL;
+    __NL_CLEAR_ARRAY(NLfloat, y, A->m);
     for(j=0; j<n; j++) {
-        Cj = &(A->column[j]) ;
+        Cj = &(A->column[j]);
         for(ii=0; ii<Cj->size; ii++) {
-            c = &(Cj->coeff[ii]) ;
-            y[c->index] += c->value * x[j] ;
+            c = &(Cj->coeff[ii]);
+            y[c->index] += c->value * x[j];
         }
     }
 }
@@ -419,15 +419,15 @@ static void __nlSparseMatrix_mult_cols(
 static void __nlSparseMatrixMult(__NLSparseMatrix* A, NLfloat* x, NLfloat* y) {
     if(A->storage & __NL_ROWS) {
         if(A->storage & __NL_SYMMETRIC) {
-            __nlSparseMatrix_mult_rows_symmetric(A, x, y) ;
+            __nlSparseMatrix_mult_rows_symmetric(A, x, y);
         } else {
-            __nlSparseMatrix_mult_rows(A, x, y) ;
+            __nlSparseMatrix_mult_rows(A, x, y);
         }
     } else {
         if(A->storage & __NL_SYMMETRIC) {
-            __nlSparseMatrix_mult_cols_symmetric(A, x, y) ;
+            __nlSparseMatrix_mult_cols_symmetric(A, x, y);
         } else {
-            __nlSparseMatrix_mult_cols(A, x, y) ;
+            __nlSparseMatrix_mult_cols(A, x, y);
         }
     }
 }
@@ -435,13 +435,13 @@ static void __nlSparseMatrixMult(__NLSparseMatrix* A, NLfloat* x, NLfloat* y) {
 /************************************************************************************/
 /* NLContext data structure */
 
-typedef void(*__NLMatrixFunc)(float* x, float* y) ;
+typedef void(*__NLMatrixFunc)(float* x, float* y);
 
 typedef struct {
-    NLfloat  value ;
-    NLboolean locked ;
-    NLuint    index ;
-} __NLVariable ;
+    NLfloat  value;
+    NLboolean locked;
+    NLuint    index;
+} __NLVariable;
 
 #define __NL_STATE_INITIAL            0
 #define __NL_STATE_SYSTEM             1
@@ -452,213 +452,213 @@ typedef struct {
 #define __NL_STATE_SOLVED             6
 
 typedef struct {
-    NLenum           state ;
-    __NLVariable*    variable ;
-    NLuint           n ;
-    __NLSparseMatrix M ;
-    __NLRowColumn    af ;
-    __NLRowColumn    al ;
-    __NLRowColumn    xl ;
-    NLfloat*        x ;
-    NLfloat*        b ;
-    NLfloat         right_hand_side ;
-    NLfloat         row_scaling ;
-    NLuint           nb_variables ;
-    NLuint           current_row ;
-    NLboolean        least_squares ;
-    NLboolean        symmetric ;
-    NLboolean        normalize_rows ;
-    NLboolean        alloc_M ;
-    NLboolean        alloc_af ;
-    NLboolean        alloc_al ;
-    NLboolean        alloc_xl ;
-    NLboolean        alloc_variable ;
-    NLboolean        alloc_x ;
-    NLboolean        alloc_b ;
-    NLfloat         error ;
-    __NLMatrixFunc   matrix_vector_prod ;
-} __NLContext ;
-
-static __NLContext* __nlCurrentContext = NULL ;
+    NLenum           state;
+    __NLVariable*    variable;
+    NLuint           n;
+    __NLSparseMatrix M;
+    __NLRowColumn    af;
+    __NLRowColumn    al;
+    __NLRowColumn    xl;
+    NLfloat*        x;
+    NLfloat*        b;
+    NLfloat         right_hand_side;
+    NLfloat         row_scaling;
+    NLuint           nb_variables;
+    NLuint           current_row;
+    NLboolean        least_squares;
+    NLboolean        symmetric;
+    NLboolean        normalize_rows;
+    NLboolean        alloc_M;
+    NLboolean        alloc_af;
+    NLboolean        alloc_al;
+    NLboolean        alloc_xl;
+    NLboolean        alloc_variable;
+    NLboolean        alloc_x;
+    NLboolean        alloc_b;
+    NLfloat         error;
+    __NLMatrixFunc   matrix_vector_prod;
+} __NLContext;
+
+static __NLContext* __nlCurrentContext = NULL;
 
 static void __nlMatrixVectorProd_default(NLfloat* x, NLfloat* y) {
-    __nlSparseMatrixMult(&(__nlCurrentContext->M), x, y) ;
+    __nlSparseMatrixMult(&(__nlCurrentContext->M), x, y);
 }
 
 
 NLContext nlNewContext(void) {
-    __NLContext* result      = __NL_NEW(__NLContext) ;
-    result->state            = __NL_STATE_INITIAL ;
-    result->row_scaling      = 1.0 ;
-    result->right_hand_side  = 0.0 ;
-    result->matrix_vector_prod = __nlMatrixVectorProd_default ;
-    nlMakeCurrent(result) ;
-    return result ;
+    __NLContext* result      = __NL_NEW(__NLContext);
+    result->state            = __NL_STATE_INITIAL;
+    result->row_scaling      = 1.0;
+    result->right_hand_side  = 0.0;
+    result->matrix_vector_prod = __nlMatrixVectorProd_default;
+    nlMakeCurrent(result);
+    return result;
 }
 
 void nlDeleteContext(NLContext context_in) {
-    __NLContext* context = (__NLContext*)(context_in) ;
+    __NLContext* context = (__NLContext*)(context_in);
     if(__nlCurrentContext == context) {
-        __nlCurrentContext = NULL ;
+        __nlCurrentContext = NULL;
     }
     if(context->alloc_M) {
-        __nlSparseMatrixDestroy(&context->M) ;
+        __nlSparseMatrixDestroy(&context->M);
     }
     if(context->alloc_af) {
-        __nlRowColumnDestroy(&context->af) ;
+        __nlRowColumnDestroy(&context->af);
     }
     if(context->alloc_al) {
-        __nlRowColumnDestroy(&context->al) ;
+        __nlRowColumnDestroy(&context->al);
     }
     if(context->alloc_xl) {
-        __nlRowColumnDestroy(&context->xl) ;
+        __nlRowColumnDestroy(&context->xl);
     }
     if(context->alloc_variable) {
-        __NL_DELETE_ARRAY(context->variable) ;
+        __NL_DELETE_ARRAY(context->variable);
     }
     if(context->alloc_x) {
-        __NL_DELETE_ARRAY(context->x) ;
+        __NL_DELETE_ARRAY(context->x);
     }
     if(context->alloc_b) {
-        __NL_DELETE_ARRAY(context->b) ;
+        __NL_DELETE_ARRAY(context->b);
     }
 
 #ifdef NL_PARANOID
-    __NL_CLEAR(__NLContext, context) ;
+    __NL_CLEAR(__NLContext, context);
 #endif
-    __NL_DELETE(context) ;
+    __NL_DELETE(context);
 }
 
 void nlMakeCurrent(NLContext context) {
-    __nlCurrentContext = (__NLContext*)(context) ;
+    __nlCurrentContext = (__NLContext*)(context);
 }
 
 NLContext nlGetCurrent(void) {
-    return __nlCurrentContext ;
+    return __nlCurrentContext;
 }
 
 static void __nlCheckState(NLenum state) {
-    __nl_assert(__nlCurrentContext->state == state) ;
+    __nl_assert(__nlCurrentContext->state == state);
 }
 
 static void __nlTransition(NLenum from_state, NLenum to_state) {
-    __nlCheckState(from_state) ;
-    __nlCurrentContext->state = to_state ;
+    __nlCheckState(from_state);
+    __nlCurrentContext->state = to_state;
 }
 
 /************************************************************************************/
 /* Get/Set parameters */
 
 void nlSolverParameterf(NLenum pname, NLfloat param) {
-    __nlCheckState(__NL_STATE_INITIAL) ;
+    __nlCheckState(__NL_STATE_INITIAL);
     switch(pname) {
     case NL_NB_VARIABLES: {
-        __nl_assert(param > 0) ;
-        __nlCurrentContext->nb_variables = (NLuint)param ;
-    } break ;
+        __nl_assert(param > 0);
+        __nlCurrentContext->nb_variables = (NLuint)param;
+    } break;
     case NL_LEAST_SQUARES: {
-        __nlCurrentContext->least_squares = (NLboolean)param ;
-    } break ;
+        __nlCurrentContext->least_squares = (NLboolean)param;
+    } break;
     case NL_SYMMETRIC: {
-        __nlCurrentContext->symmetric = (NLboolean)param ;        
+        __nlCurrentContext->symmetric = (NLboolean)param;        
     }
     default: {
-        __nl_assert_not_reached ;
-    } break ;
+        __nl_assert_not_reached;
+    } break;
     }
 }
 
 void nlSolverParameteri(NLenum pname, NLint param) {
-    __nlCheckState(__NL_STATE_INITIAL) ;
+    __nlCheckState(__NL_STATE_INITIAL);
     switch(pname) {
     case NL_NB_VARIABLES: {
-        __nl_assert(param > 0) ;
-        __nlCurrentContext->nb_variables = (NLuint)param ;
-    } break ;
+        __nl_assert(param > 0);
+        __nlCurrentContext->nb_variables = (NLuint)param;
+    } break;
     case NL_LEAST_SQUARES: {
-        __nlCurrentContext->least_squares = (NLboolean)param ;
-    } break ;
+        __nlCurrentContext->least_squares = (NLboolean)param;
+    } break;
     case NL_SYMMETRIC: {
-        __nlCurrentContext->symmetric = (NLboolean)param ;        
+        __nlCurrentContext->symmetric = (NLboolean)param;        
     }
     default: {
-        __nl_assert_not_reached ;
-    } break ;
+        __nl_assert_not_reached;
+    } break;
     }
 }
 
 void nlRowParameterf(NLenum pname, NLfloat param) {
-    __nlCheckState(__NL_STATE_MATRIX) ;
+    __nlCheckState(__NL_STATE_MATRIX);
     switch(pname) {
     case NL_RIGHT_HAND_SIDE: {
-        __nlCurrentContext->right_hand_side = param ;
-    } break ;
+        __nlCurrentContext->right_hand_side = param;
+    } break;
     case NL_ROW_SCALING: {
-        __nlCurrentContext->row_scaling = param ;
-    } break ;
+        __nlCurrentContext->row_scaling = param;
+    } break;
     }
 }
 
 void nlRowParameteri(NLenum pname, NLint param) {
-    __nlCheckState(__NL_STATE_MATRIX) ;
+    __nlCheckState(__NL_STATE_MATRIX);
     switch(pname) {
     case NL_RIGHT_HAND_SIDE: {
-        __nlCurrentContext->right_hand_side = (NLfloat)param ;
-    } break ;
+        __nlCurrentContext->right_hand_side = (NLfloat)param;
+    } break;
     case NL_ROW_SCALING: {
-        __nlCurrentContext->row_scaling = (NLfloat)param ;
-    } break ;
+        __nlCurrentContext->row_scaling = (NLfloat)param;
+    } break;
     }
 }
 
 void nlGetBooleanv(NLenum pname, NLboolean* params) {
     switch(pname) {
     case NL_LEAST_SQUARES: {
-        *params = __nlCurrentContext->least_squares ;
-    } break ;
+        *params = __nlCurrentContext->least_squares;
+    } break;
     case NL_SYMMETRIC: {
-        *params = __nlCurrentContext->symmetric ;
-    } break ;
+        *params = __nlCurrentContext->symmetric;
+    } break;
     default: {
-        __nl_assert_not_reached ;
-    } break ;
+        __nl_assert_not_reached;
+    } break;
     }
 }
 
 void nlGetFloatv(NLenum pname, NLfloat* params) {
     switch(pname) {
     case NL_NB_VARIABLES: {
-        *params = (NLfloat)(__nlCurrentContext->nb_variables) ;
-    } break ;
+        *params = (NLfloat)(__nlCurrentContext->nb_variables);
+    } break;
     case NL_LEAST_SQUARES: {
-        *params = (NLfloat)(__nlCurrentContext->least_squares) ;
-    } break ;
+        *params = (NLfloat)(__nlCurrentContext->least_squares);
+    } break;
     case NL_SYMMETRIC: {
-        *params = (NLfloat)(__nlCurrentContext->symmetric) ;
-    } break ;
+        *params = (NLfloat)(__nlCurrentContext->symmetric);
+    } break;
     case NL_ERROR: {
-        *params = (NLfloat)(__nlCurrentContext->error) ;
-    } break ;
+        *params = (NLfloat)(__nlCurrentContext->error);
+    } break;
     default: {
-        __nl_assert_not_reached ;
-    } break ;
+        __nl_assert_not_reached;
+    } break;
     }
 }
 
 void nlGetIntergerv(NLenum pname, NLint* params) {
     switch(pname) {
     case NL_NB_VARIABLES: {
-        *params = (NLint)(__nlCurrentContext->nb_variables) ;
-    } break ;
+        *params = (NLint)(__nlCurrentContext->nb_variables);
+    } break;
     case NL_LEAST_SQUARES: {
-        *params = (NLint)(__nlCurrentContext->least_squares) ;
-    } break ;
+        *params = (NLint)(__nlCurrentContext->least_squares);
+    } break;
     case NL_SYMMETRIC: {
-        *params = (NLint)(__nlCurrentContext->symmetric) ;
-    } break ;
+        *params = (NLint)(__nlCurrentContext->symmetric);
+    } break;
     default: {
-        __nl_assert_not_reached ;
-    } break ;
+        __nl_assert_not_reached;
+    } break;
     }
 }
 
@@ -668,11 +668,11 @@ void nlGetIntergerv(NLenum pname, NLint* params) {
 void nlEnable(NLenum pname) {
     switch(pname) {
     case NL_NORMALIZE_ROWS: {
-        __nl_assert(__nlCurrentContext->state != __NL_STATE_ROW) ;
-        __nlCurrentContext->normalize_rows = NL_TRUE ;
-    } break ;
+        __nl_assert(__nlCurrentContext->state != __NL_STATE_ROW);
+        __nlCurrentContext->normalize_rows = NL_TRUE;
+    } break;
     default: {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
     }
 }
@@ -680,11 +680,11 @@ void nlEnable(NLenum pname) {
 void nlDisable(NLenum pname) {
     switch(pname) {
     case NL_NORMALIZE_ROWS: {
-        __nl_assert(__nlCurrentContext->state != __NL_STATE_ROW) ;
-        __nlCurrentContext->normalize_rows = NL_FALSE ;
-    } break ;
+        __nl_assert(__nlCurrentContext->state != __NL_STATE_ROW);
+        __nlCurrentContext->normalize_rows = NL_FALSE;
+    } break;
     default: {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
     }
 }
@@ -692,217 +692,219 @@ void nlDisable(NLenum pname) {
 NLboolean nlIsEnabled(NLenum pname) {
     switch(pname) {
     case NL_NORMALIZE_ROWS: {
-        return __nlCurrentContext->normalize_rows ;
-    } break ;
+        return __nlCurrentContext->normalize_rows;
+    } break;
     default: {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
     }
-    return NL_FALSE ;
+    return NL_FALSE;
 }
 
 /************************************************************************************/
 /* Get/Set Lock/Unlock variables */
 
 void nlSetVariable(NLuint index, NLfloat value) {
-    __nlCheckState(__NL_STATE_SYSTEM) ;
-    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1) ;
-    __nlCurrentContext->variable[index].value = value ;    
+    __nlCheckState(__NL_STATE_SYSTEM);
+    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
+    __nlCurrentContext->variable[index].value = value;    
 }
 
 NLfloat nlGetVariable(NLuint index) {
-    __nl_assert(__nlCurrentContext->state != __NL_STATE_INITIAL) ;
-    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1) ;
-    return __nlCurrentContext->variable[index].value ;
+    __nl_assert(__nlCurrentContext->state != __NL_STATE_INITIAL);
+    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
+    return __nlCurrentContext->variable[index].value;
 }
 
 void nlLockVariable(NLuint index) {
-    __nlCheckState(__NL_STATE_SYSTEM) ;
-    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1) ;
-    __nlCurrentContext->variable[index].locked = NL_TRUE ;
+    __nlCheckState(__NL_STATE_SYSTEM);
+    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
+    __nlCurrentContext->variable[index].locked = NL_TRUE;
 }
 
 void nlUnlockVariable(NLuint index) {
-    __nlCheckState(__NL_STATE_SYSTEM) ;
-    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1) ;
-    __nlCurrentContext->variable[index].locked = NL_FALSE ;
+    __nlCheckState(__NL_STATE_SYSTEM);
+    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
+    __nlCurrentContext->variable[index].locked = NL_FALSE;
 }
 
 NLboolean nlVariableIsLocked(NLuint index) {
-    __nl_assert(__nlCurrentContext->state != __NL_STATE_INITIAL) ;
-    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1) ;
-    return __nlCurrentContext->variable[index].locked  ;
+    __nl_assert(__nlCurrentContext->state != __NL_STATE_INITIAL);
+    __nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
+    return __nlCurrentContext->variable[index].locked;
 }
 
 /************************************************************************************/
 /* System construction */
 
 static void __nlVariablesToVector() {
-    NLuint i ;
-    __nl_assert(__nlCurrentContext->alloc_x) ;
-    __nl_assert(__nlCurrentContext->alloc_variable) ;
+    NLuint i;
+    __nl_assert(__nlCurrentContext->alloc_x);
+    __nl_assert(__nlCurrentContext->alloc_variable);
     for(i=0; i<__nlCurrentContext->nb_variables; i++) {
-        __NLVariable* v = &(__nlCurrentContext->variable[i]) ;
+        __NLVariable* v = &(__nlCurrentContext->variable[i]);
         if(!v->locked) {
-            __nl_assert(v->index < __nlCurrentContext->n) ;
-            __nlCurrentContext->x[v->index] = v->value ;
+            __nl_assert(v->index < __nlCurrentContext->n);
+            __nlCurrentContext->x[v->index] = v->value;
         }
     }
 }
 
 static void __nlVectorToVariables() {
-    NLuint i ;
-    __nl_assert(__nlCurrentContext->alloc_x) ;
-    __nl_assert(__nlCurrentContext->alloc_variable) ;
+    NLuint i;
+    __nl_assert(__nlCurrentContext->alloc_x);
+    __nl_assert(__nlCurrentContext->alloc_variable);
     for(i=0; i<__nlCurrentContext->nb_variables; i++) {
-        __NLVariable* v = &(__nlCurrentContext->variable[i]) ;
+        __NLVariable* v = &(__nlCurrentContext->variable[i]);
         if(!v->locked) {
-            __nl_assert(v->index < __nlCurrentContext->n) ;
-            v->value = __nlCurrentContext->x[v->index] ;
+            __nl_assert(v->index < __nlCurrentContext->n);
+            v->value = __nlCurrentContext->x[v->index];
         }
     }
 }
 
 
 static void __nlBeginSystem() {
-    __nlTransition(__NL_STATE_INITIAL, __NL_STATE_SYSTEM) ;
-    __nl_assert(__nlCurrentContext->nb_variables > 0) ;
+    __nlTransition(__NL_STATE_INITIAL, __NL_STATE_SYSTEM);
+    __nl_assert(__nlCurrentContext->nb_variables > 0);
     __nlCurrentContext->variable = __NL_NEW_ARRAY(
         __NLVariable, __nlCurrentContext->nb_variables
-    ) ;
-    __nlCurrentContext->alloc_variable = NL_TRUE ;
+    );
+    __nlCurrentContext->alloc_variable = NL_TRUE;
 }
 
 static void __nlEndSystem() {
-    __nlTransition(__NL_STATE_MATRIX_CONSTRUCTED, __NL_STATE_SYSTEM_CONSTRUCTED) ;    
+    __nlTransition(__NL_STATE_MATRIX_CONSTRUCTED, __NL_STATE_SYSTEM_CONSTRUCTED);    
 }
 
 static void __nlBeginMatrix() {
-    NLuint i ;
-    NLuint n = 0 ;
-    NLenum storage = __NL_ROWS ;
+    NLuint i;
+    NLuint n = 0;
+    NLenum storage = __NL_ROWS;
 
-    __nlTransition(__NL_STATE_SYSTEM, __NL_STATE_MATRIX) ;
+    __nlTransition(__NL_STATE_SYSTEM, __NL_STATE_MATRIX);
 
     for(i=0; i<__nlCurrentContext->nb_variables; i++) {
         if(!__nlCurrentContext->variable[i].locked) {
-            __nlCurrentContext->variable[i].index = n ;
-            n++ ;
+            __nlCurrentContext->variable[i].index = n;
+            n++;
         } else {
-            __nlCurrentContext->variable[i].index = ~0 ;
+            __nlCurrentContext->variable[i].index = ~0;
         }
     }
 
-    __nlCurrentContext->n = n ;
+    __nlCurrentContext->n = n;
 
     /* a least squares problem results in a symmetric matrix */
     if(__nlCurrentContext->least_squares) {
-        __nlCurrentContext->symmetric = NL_TRUE ;
+        __nlCurrentContext->symmetric = NL_TRUE;
     }
 
     if(__nlCurrentContext->symmetric) {
-        storage = (storage | __NL_SYMMETRIC) ;
+        storage = (storage | __NL_SYMMETRIC);
     }
 
     /* SuperLU storage does not support symmetric storage */
-    storage = (storage & ~__NL_SYMMETRIC) ;
+    storage = (storage & ~__NL_SYMMETRIC);
 
-    __nlSparseMatrixConstruct(&__nlCurrentContext->M, n, n, storage) ;
-    __nlCurrentContext->alloc_M = NL_TRUE ;
+    __nlSparseMatrixConstruct(&__nlCurrentContext->M, n, n, storage);
+    __nlCurrentContext->alloc_M = NL_TRUE;
 
-    __nlCurrentContext->x = __NL_NEW_ARRAY(NLfloat, n) ;
-    __nlCurrentContext->alloc_x = NL_TRUE ;
+    __nlCurrentContext->x = __NL_NEW_ARRAY(NLfloat, n);
+    __nlCurrentContext->alloc_x = NL_TRUE;
     
-    __nlCurrentContext->b = __NL_NEW_ARRAY(NLfloat, n) ;
-    __nlCurrentContext->alloc_b = NL_TRUE ;
+    __nlCurrentContext->b = __NL_NEW_ARRAY(NLfloat, n);
+    __nlCurrentContext->alloc_b = NL_TRUE;
 
-    __nlVariablesToVector() ;
+    __nlVariablesToVector();
 
-    __nlRowColumnConstruct(&__nlCurrentContext->af) ;
-    __nlCurrentContext->alloc_af = NL_TRUE ;
-    __nlRowColumnConstruct(&__nlCurrentContext->al) ;
-    __nlCurrentContext->alloc_al = NL_TRUE ;
-    __nlRowColumnConstruct(&__nlCurrentContext->xl) ;
-    __nlCurrentContext->alloc_xl = NL_TRUE ;
+    __nlRowColumnConstruct(&__nlCurrentContext->af);
+    __nlCurrentContext->alloc_af = NL_TRUE;
+    __nlRowColumnConstruct(&__nlCurrentContext->al);
+    __nlCurrentContext->alloc_al = NL_TRUE;
+    __nlRowColumnConstruct(&__nlCurrentContext->xl);
+    __nlCurrentContext->alloc_xl = NL_TRUE;
 
-    __nlCurrentContext->current_row = 0 ;
+    __nlCurrentContext->current_row = 0;
 }
 
 static void __nlEndMatrix() {
-    __nlTransition(__NL_STATE_MATRIX, __NL_STATE_MATRIX_CONSTRUCTED) ;    
+    __nlTransition(__NL_STATE_MATRIX, __NL_STATE_MATRIX_CONSTRUCTED);    
     
-    __nlRowColumnDestroy(&__nlCurrentContext->af) ;
-    __nlCurrentContext->alloc_af = NL_FALSE ;
-    __nlRowColumnDestroy(&__nlCurrentContext->al) ;
-    __nlCurrentContext->alloc_al = NL_FALSE ;
-    __nlRowColumnDestroy(&__nlCurrentContext->xl) ;
-    __nlCurrentContext->alloc_al = NL_FALSE ;
+    __nlRowColumnDestroy(&__nlCurrentContext->af);
+    __nlCurrentContext->alloc_af = NL_FALSE;
+    __nlRowColumnDestroy(&__nlCurrentContext->al);
+    __nlCurrentContext->alloc_al = NL_FALSE;
+    __nlRowColumnDestroy(&__nlCurrentContext->xl);
+    __nlCurrentContext->alloc_al = NL_FALSE;
     
+#if 0
     if(!__nlCurrentContext->least_squares) {
         __nl_assert(
             __nlCurrentContext->current_row == 
             __nlCurrentContext->n
-        ) ;
+        );
     }
+#endif
 }
 
 static void __nlBeginRow() {
-    __nlTransition(__NL_STATE_MATRIX, __NL_STATE_ROW) ;
-    __nlRowColumnZero(&__nlCurrentContext->af) ;
-    __nlRowColumnZero(&__nlCurrentContext->al) ;
-    __nlRowColumnZero(&__nlCurrentContext->xl) ;
+    __nlTransition(__NL_STATE_MATRIX, __NL_STATE_ROW);
+    __nlRowColumnZero(&__nlCurrentContext->af);
+    __nlRowColumnZero(&__nlCurrentContext->al);
+    __nlRowColumnZero(&__nlCurrentContext->xl);
 }
 
 static void __nlScaleRow(NLfloat s) {
-    __NLRowColumn*    af = &__nlCurrentContext->af ;
-    __NLRowColumn*    al = &__nlCurrentContext->al ;
-    NLuint nf            = af->size ;
-    NLuint nl            = al->size ;
-    NLuint i ;
+    __NLRowColumn*    af = &__nlCurrentContext->af;
+    __NLRowColumn*    al = &__nlCurrentContext->al;
+    NLuint nf            = af->size;
+    NLuint nl            = al->size;
+    NLuint i;
     for(i=0; i<nf; i++) {
-        af->coeff[i].value *= s ;
+        af->coeff[i].value *= s;
     }
     for(i=0; i<nl; i++) {
-        al->coeff[i].value *= s ;
+        al->coeff[i].value *= s;
     }
-    __nlCurrentContext->right_hand_side *= s ;
+    __nlCurrentContext->right_hand_side *= s;
 }
 
 static void __nlNormalizeRow(NLfloat weight) {
-    __NLRowColumn*    af = &__nlCurrentContext->af ;
-    __NLRowColumn*    al = &__nlCurrentContext->al ;
-    NLuint nf            = af->size ;
-    NLuint nl            = al->size ;
-    NLuint i ;
-    NLfloat norm = 0.0 ;
+    __NLRowColumn*    af = &__nlCurrentContext->af;
+    __NLRowColumn*    al = &__nlCurrentContext->al;
+    NLuint nf            = af->size;
+    NLuint nl            = al->size;
+    NLuint i;
+    NLfloat norm = 0.0;
     for(i=0; i<nf; i++) {
-        norm += af->coeff[i].value * af->coeff[i].value ;
+        norm += af->coeff[i].value * af->coeff[i].value;
     }
     for(i=0; i<nl; i++) {
-        norm += al->coeff[i].value * al->coeff[i].value ;
+        norm += al->coeff[i].value * al->coeff[i].value;
     }
-    norm = sqrt(norm) ;
-    __nlScaleRow(weight / norm) ;
+    norm = sqrt(norm);
+    __nlScaleRow(weight / norm);
 }
 
 static void __nlEndRow() {
-    __NLRowColumn*    af = &__nlCurrentContext->af ;
-    __NLRowColumn*    al = &__nlCurrentContext->al ;
-    __NLRowColumn*    xl = &__nlCurrentContext->xl ;
-    __NLSparseMatrix* M  = &__nlCurrentContext->M  ;
-    NLfloat* b        = __nlCurrentContext->b ;
-    NLuint nf          = af->size ;
-    NLuint nl          = al->size ;
-    NLuint current_row = __nlCurrentContext->current_row ;
-    NLuint i ;
-    NLuint j ;
-    NLfloat S ;
-    __nlTransition(__NL_STATE_ROW, __NL_STATE_MATRIX) ;
+    __NLRowColumn*    af = &__nlCurrentContext->af;
+    __NLRowColumn*    al = &__nlCurrentContext->al;
+    __NLRowColumn*    xl = &__nlCurrentContext->xl;
+    __NLSparseMatrix* M  = &__nlCurrentContext->M;
+    NLfloat* b        = __nlCurrentContext->b;
+    NLuint nf          = af->size;
+    NLuint nl          = al->size;
+    NLuint current_row = __nlCurrentContext->current_row;
+    NLuint i;
+    NLuint j;
+    NLfloat S;
+    __nlTransition(__NL_STATE_ROW, __NL_STATE_MATRIX);
 
     if(__nlCurrentContext->normalize_rows) {
-        __nlNormalizeRow(__nlCurrentContext->row_scaling) ;
+        __nlNormalizeRow(__nlCurrentContext->row_scaling);
     } else {
-        __nlScaleRow(__nlCurrentContext->row_scaling) ;
+        __nlScaleRow(__nlCurrentContext->row_scaling);
     }
 
     if(__nlCurrentContext->least_squares) {
@@ -911,59 +913,81 @@ static void __nlEndRow() {
                 __nlSparseMatrixAdd(
                     M, af->coeff[i].index, af->coeff[j].index,
                     af->coeff[i].value * af->coeff[j].value
-                ) ;
+                );
             }
         }
-        S = -__nlCurrentContext->right_hand_side ;
+        S = -__nlCurrentContext->right_hand_side;
         for(j=0; j<nl; j++) {
-            S += al->coeff[j].value * xl->coeff[j].value ;
+            S += al->coeff[j].value * xl->coeff[j].value;
         }
         for(i=0; i<nf; i++) {
-            b[ af->coeff[i].index ] -= af->coeff[i].value * S ;
+            b[ af->coeff[i].index ] -= af->coeff[i].value * S;
         }
     } else {
         for(i=0; i<nf; i++) {
             __nlSparseMatrixAdd(
                 M, current_row, af->coeff[i].index, af->coeff[i].value
-            ) ;
+            );
         }
-        b[current_row] = -__nlCurrentContext->right_hand_side ;
+        b[current_row] = -__nlCurrentContext->right_hand_side;
         for(i=0; i<nl; i++) {
-            b[current_row] -= al->coeff[i].value * xl->coeff[i].value ;
+            b[current_row] -= al->coeff[i].value * xl->coeff[i].value;
         }
     }
-    __nlCurrentContext->current_row++ ;
-    __nlCurrentContext->right_hand_side = 0.0 ;    
-    __nlCurrentContext->row_scaling     = 1.0 ;
+    __nlCurrentContext->current_row++;
+    __nlCurrentContext->right_hand_side = 0.0;    
+    __nlCurrentContext->row_scaling     = 1.0;
+}
+
+void nlMatrixAdd(NLuint row, NLuint col, NLfloat value)
+{
+    __NLSparseMatrix* M  = &__nlCurrentContext->M;
+    __nlCheckState(__NL_STATE_MATRIX);
+    __nl_range_assert(row, 0, __nlCurrentContext->n - 1);
+    __nl_range_assert(col, 0, __nlCurrentContext->nb_variables - 1);
+       __nl_assert(!__nlCurrentContext->least_squares);
+
+       __nlSparseMatrixAdd(M, row, col, value);
+}
+
+void nlRightHandSideAdd(NLuint index, NLfloat value)
+{
+    NLfloat* b = __nlCurrentContext->b;
+
+    __nlCheckState(__NL_STATE_MATRIX);
+    __nl_range_assert(index, 0, __nlCurrentContext->n - 1);
+       __nl_assert(!__nlCurrentContext->least_squares);
+
+       b[index] += value;
 }
 
 void nlCoefficient(NLuint index, NLfloat value) {
     __NLVariable* v;
        unsigned int zero= 0;
-    __nlCheckState(__NL_STATE_ROW) ;
-    __nl_range_assert(index, zero, __nlCurrentContext->nb_variables - 1) ;
-    v = &(__nlCurrentContext->variable[index]) ;
+    __nlCheckState(__NL_STATE_ROW);
+    __nl_range_assert(index, zero, __nlCurrentContext->nb_variables - 1);
+    v = &(__nlCurrentContext->variable[index]);
     if(v->locked) {
-        __nlRowColumnAppend(&(__nlCurrentContext->al), 0, value) ;
-        __nlRowColumnAppend(&(__nlCurrentContext->xl), 0, v->value) ;
+        __nlRowColumnAppend(&(__nlCurrentContext->al), 0, value);
+        __nlRowColumnAppend(&(__nlCurrentContext->xl), 0, v->value);
     } else {
-        __nlRowColumnAppend(&(__nlCurrentContext->af), v->index, value) ;
+        __nlRowColumnAppend(&(__nlCurrentContext->af), v->index, value);
     }
 }
 
 void nlBegin(NLenum prim) {
     switch(prim) {
     case NL_SYSTEM: {
-        __nlBeginSystem() ;
-    } break ;
+        __nlBeginSystem();
+    } break;
     case NL_MATRIX: {
-        __nlBeginMatrix() ;
-    } break ;
+        __nlBeginMatrix();
+    } break;
     case NL_ROW: {
-        __nlBeginRow() ;
-    } break ;
+        __nlBeginRow();
+    } break;
     default: {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
     }
 }
@@ -971,16 +995,16 @@ void nlBegin(NLenum prim) {
 void nlEnd(NLenum prim) {
     switch(prim) {
     case NL_SYSTEM: {
-        __nlEndSystem() ;
-    } break ;
+        __nlEndSystem();
+    } break;
     case NL_MATRIX: {
-        __nlEndMatrix() ;
-    } break ;
+        __nlEndMatrix();
+    } break;
     case NL_ROW: {
-        __nlEndRow() ;
-    } break ;
+        __nlEndRow();
+    } break;
     default: {
-        __nl_assert_not_reached ;
+        __nl_assert_not_reached;
     }
     }
 }
@@ -993,41 +1017,41 @@ void nlEnd(NLenum prim) {
 static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
 
     /* OpenNL Context */
-    __NLSparseMatrix* M  = &(__nlCurrentContext->M) ;
-    NLfloat* b          = __nlCurrentContext->b ;
-    NLfloat* x          = __nlCurrentContext->x ;
+    __NLSparseMatrix* M  = &(__nlCurrentContext->M);
+    NLfloat* b          = __nlCurrentContext->b;
+    NLfloat* x          = __nlCurrentContext->x;
 
     /* Compressed Row Storage matrix representation */
-    NLuint    n      = __nlCurrentContext->n ;
-    NLuint    nnz    = __nlSparseMatrixNNZ(M) ; /* Number of Non-Zero coeffs */
-    NLint*    xa     = __NL_NEW_ARRAY(NLint, n+1) ;
-    NLfloat* rhs    = __NL_NEW_ARRAY(NLfloat, n) ;
-    NLfloat* a      = __NL_NEW_ARRAY(NLfloat, nnz) ;
-    NLint*    asub   = __NL_NEW_ARRAY(NLint, nnz) ;
+    NLuint    n      = __nlCurrentContext->n;
+    NLuint    nnz    = __nlSparseMatrixNNZ(M); /* Number of Non-Zero coeffs */
+    NLint*    xa     = __NL_NEW_ARRAY(NLint, n+1);
+    NLfloat* rhs    = __NL_NEW_ARRAY(NLfloat, n);
+    NLfloat* a      = __NL_NEW_ARRAY(NLfloat, nnz);
+    NLint*    asub   = __NL_NEW_ARRAY(NLint, nnz);
 
     /* Permutation vector */
-    NLint*    perm_r  = __NL_NEW_ARRAY(NLint, n) ;
-    NLint*    perm    = __NL_NEW_ARRAY(NLint, n) ;
+    NLint*    perm_r  = __NL_NEW_ARRAY(NLint, n);
+    NLint*    perm    = __NL_NEW_ARRAY(NLint, n);
 
     /* SuperLU variables */
-    SuperMatrix A, B ; /* System       */
-    SuperMatrix L, U ; /* Inverse of A */
-    NLint info ;       /* status code  */
-    DNformat *vals = NULL ; /* access to result */
-    float *rvals  = NULL ; /* access to result */
+    SuperMatrix A, B; /* System       */
+    SuperMatrix L, U; /* Inverse of A */
+    NLint info;       /* status code  */
+    DNformat *vals = NULL; /* access to result */
+    float *rvals  = NULL; /* access to result */
 
     /* SuperLU options and stats */
-    superlu_options_t options ;
-    SuperLUStat_t     stat ;
+    superlu_options_t options;
+    SuperLUStat_t     stat;
 
 
     /* Temporary variables */
-    __NLRowColumn* Ri = NULL ;
-    NLuint         i,jj,count ;
+    __NLRowColumn* Ri = NULL;
+    NLuint         i,jj,count;
     
-    __nl_assert(!(M->storage & __NL_SYMMETRIC)) ;
-    __nl_assert(M->storage & __NL_ROWS) ;
-    __nl_assert(M->m == M->n) ;
+    __nl_assert(!(M->storage & __NL_SYMMETRIC));
+    __nl_assert(M->storage & __NL_ROWS);
+    __nl_assert(M->m == M->n);
     
     
     /*
@@ -1036,20 +1060,20 @@ static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
      * -------------------------------------------------------
      */
 
-    count = 0 ;
+    count = 0;
     for(i=0; i<n; i++) {
-        Ri = &(M->row[i]) ;
-        xa[i] = count ;
+        Ri = &(M->row[i]);
+        xa[i] = count;
         for(jj=0; jj<Ri->size; jj++) {
-            a[count]    = Ri->coeff[jj].value ;
-            asub[count] = Ri->coeff[jj].index ;
-            count++ ;
+            a[count]    = Ri->coeff[jj].value;
+            asub[count] = Ri->coeff[jj].index;
+            count++;
         }
     }
-    xa[n] = nnz ;
+    xa[n] = nnz;
 
     /* Save memory for SuperLU */
-    __nlSparseMatrixClear(M) ;
+    __nlSparseMatrixClear(M);
 
 
     /*
@@ -1079,15 +1103,15 @@ static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
      *           2 -> re-ordering for A^t+A
      *           3 -> approximate minimum degree ordering
      */
-    get_perm_c(do_perm ? 3 : 0, &A, perm) ;
+    get_perm_c(do_perm ? 3 : 0, &A, perm);
 
     /* Step 4: call SuperLU main routine
      * ---------------------------------
      */
 
-    set_default_options(&options) ;
-    options.ColPerm = MY_PERMC ;
-    StatInit(&stat) ;
+    set_default_options(&options);
+    options.ColPerm = MY_PERMC;
+    StatInit(&stat);
 
     sgssv(&options, &A, perm, perm_r, &L, &U, &B, &stat, &info);
 
@@ -1112,8 +1136,8 @@ static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
      * needs to be deallocated (the arrays have been allocated
      * by us).
      */
-    Destroy_SuperMatrix_Store(&A) ;
-    Destroy_SuperMatrix_Store(&B) ;
+    Destroy_SuperMatrix_Store(&A);
+    Destroy_SuperMatrix_Store(&B);
 
     
     /*
@@ -1123,14 +1147,16 @@ static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
     Destroy_SuperNode_Matrix(&L);
     Destroy_CompCol_Matrix(&U);
 
-    __NL_DELETE_ARRAY(xa) ;
-    __NL_DELETE_ARRAY(rhs) ;
-    __NL_DELETE_ARRAY(a) ;
-    __NL_DELETE_ARRAY(asub) ;
-    __NL_DELETE_ARRAY(perm_r) ;
-    __NL_DELETE_ARRAY(perm) ;
+    StatFree(&stat);
+
+    __NL_DELETE_ARRAY(xa);
+    __NL_DELETE_ARRAY(rhs);
+    __NL_DELETE_ARRAY(a);
+    __NL_DELETE_ARRAY(asub);
+    __NL_DELETE_ARRAY(perm_r);
+    __NL_DELETE_ARRAY(perm);
 
-    return (info == 0) ;
+    return (info == 0);
 }
 
 
@@ -1138,14 +1164,14 @@ static NLboolean __nlSolve_SUPERLU( NLboolean do_perm) {
 /* nlSolve() driver routine */
 
 NLboolean nlSolve(void) {
-    NLboolean result = NL_TRUE ;
+    NLboolean result = NL_TRUE;
 
-    __nlCheckState(__NL_STATE_SYSTEM_CONSTRUCTED) ;
-    result = __nlSolve_SUPERLU(NL_TRUE) ;
+    __nlCheckState(__NL_STATE_SYSTEM_CONSTRUCTED);
+    result = __nlSolve_SUPERLU(NL_TRUE);
 
-    __nlVectorToVariables() ;
-    __nlTransition(__NL_STATE_SYSTEM_CONSTRUCTED, __NL_STATE_SOLVED) ;
+    __nlVectorToVariables();
+    __nlTransition(__NL_STATE_SYSTEM_CONSTRUCTED, __NL_STATE_SOLVED);
 
-    return result ;
+    return result;
 }