From b85d91c3c7e338cbb6a5f98447276af15e3cb925 Mon Sep 17 00:00:00 2001
From: Fabian Pedregosa <fabian.pedregosa@inria.fr>
Date: Mon, 7 Jun 2010 16:18:26 +0200
Subject: [PATCH] Initial import of LAR algorithm.

This is done by binding minilearn library. It is still a work in
progress.

As cblas is needed by minilearn, a stripped down version of cblas
is shipped in case distutils does not find a suitable cblas
implementation to link with.

In linux systems, having atlas installed will be more than enough
to link against a decent cblas.
---
 scikits/learn/glm.py                      |   42 +
 scikits/learn/setup.py                    |   38 +-
 scikits/learn/src/cblas/ATL_dreftpsvLNN.c |   98 +
 scikits/learn/src/cblas/ATL_dreftpsvLNU.c |   98 +
 scikits/learn/src/cblas/ATL_dreftpsvLTN.c |   99 +
 scikits/learn/src/cblas/ATL_dreftpsvLTU.c |   99 +
 scikits/learn/src/cblas/ATL_dreftpsvUNN.c |   99 +
 scikits/learn/src/cblas/ATL_dreftpsvUNU.c |   99 +
 scikits/learn/src/cblas/ATL_dreftpsvUTN.c |   98 +
 scikits/learn/src/cblas/ATL_dreftpsvUTU.c |   98 +
 scikits/learn/src/cblas/ATL_dtpsv.c       |  211 +
 scikits/learn/src/cblas/atlas_enum.h      |   55 +
 scikits/learn/src/cblas/atlas_reflevel2.h |  791 ++++
 scikits/learn/src/cblas/atlas_reflvl2.h   | 3187 ++++++++++++++
 scikits/learn/src/cblas/atlas_refmisc.h   |  370 ++
 scikits/learn/src/cblas/cblas.h           |  596 +++
 scikits/learn/src/cblas/cblas_daxpy.c     |  159 +
 scikits/learn/src/cblas/cblas_ddot.c      |  135 +
 scikits/learn/src/cblas/cblas_dnrm2.c     |  206 +
 scikits/learn/src/cblas/cblas_dscal.c     |  183 +
 scikits/learn/src/cblas/cblas_dtpsv.c     |   83 +
 scikits/learn/src/cblas/cblas_errprn.c    |   50 +
 scikits/learn/src/cblas/cblas_xerbla.c    |   53 +
 scikits/learn/src/minilearn.pyx           |   25 +
 scikits/learn/src/minilearn/lars.c        |  240 ++
 scikits/learn/src/minilearn/minilearn.c   | 4752 +++++++++++++++++++++
 scikits/learn/src/minilearn/minilearn.h   |   20 +
 scikits/learn/src/minilearn/minilearn.pyx |   27 +
 scikits/learn/tests/test_glm.py           |   23 +
 29 files changed, 12028 insertions(+), 6 deletions(-)
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvLNN.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvLNU.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvLTN.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvLTU.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvUNN.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvUNU.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvUTN.c
 create mode 100644 scikits/learn/src/cblas/ATL_dreftpsvUTU.c
 create mode 100644 scikits/learn/src/cblas/ATL_dtpsv.c
 create mode 100644 scikits/learn/src/cblas/atlas_enum.h
 create mode 100644 scikits/learn/src/cblas/atlas_reflevel2.h
 create mode 100644 scikits/learn/src/cblas/atlas_reflvl2.h
 create mode 100644 scikits/learn/src/cblas/atlas_refmisc.h
 create mode 100644 scikits/learn/src/cblas/cblas.h
 create mode 100644 scikits/learn/src/cblas/cblas_daxpy.c
 create mode 100644 scikits/learn/src/cblas/cblas_ddot.c
 create mode 100644 scikits/learn/src/cblas/cblas_dnrm2.c
 create mode 100644 scikits/learn/src/cblas/cblas_dscal.c
 create mode 100644 scikits/learn/src/cblas/cblas_dtpsv.c
 create mode 100644 scikits/learn/src/cblas/cblas_errprn.c
 create mode 100644 scikits/learn/src/cblas/cblas_xerbla.c
 create mode 100644 scikits/learn/src/minilearn.pyx
 create mode 100644 scikits/learn/src/minilearn/lars.c
 create mode 100644 scikits/learn/src/minilearn/minilearn.c
 create mode 100644 scikits/learn/src/minilearn/minilearn.h
 create mode 100644 scikits/learn/src/minilearn/minilearn.pyx
 create mode 100644 scikits/learn/tests/test_glm.py

diff --git a/scikits/learn/glm.py b/scikits/learn/glm.py
index d0f3d8ea5a..051faee9f6 100644
--- a/scikits/learn/glm.py
+++ b/scikits/learn/glm.py
@@ -929,3 +929,45 @@ class ElasticNetPath(LinearModelPath):
     def __init__(self, rho=0.5, **kwargs):
         super(ElasticNetPath, self).__init__(**kwargs)
         self.rho = rho
+
+
+class LassoLARS (object):
+    """
+    Lasso using the LARS algorithm
+
+    As implemented in minilearn
+    """
+    def __init__(self):
+        self._cholesky = np.empty(0, dtype=np.float64)
+        self.coef_ = np.empty(0, dtype=np.float64)
+        self.ind_ = np.empty(0, dtype=np.int32)
+
+    def fit (self, X, Y, intercept=True, niter=None, normalize=True):
+        """
+        WARNING: Y will be overwritten
+
+        TODO: resize (not create) arrays
+        """
+        X = np.asanyarray(X, dtype=np.float64, order='C')
+        Y = np.asanyarray(Y, dtype=np.float64, order='C')
+
+        from . import minilearn
+
+        if niter is None:
+            niter = min(*X.shape) - 1
+
+        sum_k = niter * (niter + 1) /2
+        self._cholesky = np.zeros(sum_k, dtype=np.float64)
+        self.coef_ = np.zeros(sum_k, dtype=np.float64)
+        self.ind_ = np.zeros(niter, dtype=np.int32)
+
+        if normalize:
+            X = X - X.mean(0)
+            Y = Y - Y.mean(0)
+            self._norms = np.apply_along_axis (np.linalg.norm, 0, X)
+            X /= self._norms
+
+
+        minilearn.lars_fit_wrap(X, Y, self.coef_, self.ind_,
+                                self._cholesky, niter)
+        return self
diff --git a/scikits/learn/setup.py b/scikits/learn/setup.py
index 0dc95ad5bf..e052e1dad4 100644
--- a/scikits/learn/setup.py
+++ b/scikits/learn/setup.py
@@ -50,24 +50,50 @@ def configuration(parent_package='',top_path=None):
                          join('src', 'tron.cpp')]
 
     # we try to link agains system-wide blas
-    blas_info = get_info('blas_opt')
+    blas_info = get_info('blas_opt', 0)
+    blas_lib = blas_info.pop('libraries', [])
+    extra_compile_args = blas_info.pop('extra_compile_args', [])
+
     if not blas_info:
+        config.add_library('blas', blas_sources)
         warnings.warn(BlasNotFoundError.__doc__)
-        liblinear_sources.append(blas_sources)
 
     config.add_extension('liblinear',
                          sources=liblinear_sources,
-                         libraries = blas_info.pop('libraries', []),
+                         libraries = blas_lib,
                          include_dirs=['src',
-                                       numpy.get_include(),
-                                       blas_info.pop('include_dirs', [])],
+                                       numpy.get_include()],
                          depends=[join('src', 'linear.h'),
                                   join('src', 'tron.h'),
                                   join('src', 'blas', 'blas.h'),
                                   join('src', 'blas', 'blasp.h')],
-                         **blas_info)
+                         extra_compile_args=extra_compile_args)
     ## end liblinear module
 
+    # minilear needs cblas, fortran-compiled BLAS will not be sufficient
+    if not blas_info or (
+        ('NO_ATLAS_INFO', 1) in blas_info.get('define_macros', [])):
+        config.add_library('cblas',
+                           sources=[
+                               join('src', 'cblas', '*.c'),
+                               ]
+                           )
+
+    minilearn_sources = [
+        join('src', 'minilearn', 'lars.c'),
+        join('src', 'minilearn', 'minilearn.c')]
+
+    extra_compile_args += ['-std=c99', '-g']
+
+    config.add_extension('minilearn',
+                         sources=minilearn_sources,
+                         libraries = ['blas', 'cblas'],
+                         include_dirs=[join('src', 'minilearn'),
+                                       join('src', 'cblas'),
+                                       numpy.get_include()],
+                         extra_compile_args=extra_compile_args,
+                         )
+
     config.add_extension('BallTree',
                          sources=[join('src', 'BallTree.cpp')],
                          include_dirs=[numpy.get_include()]
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvLNN.c b/scikits/learn/src/cblas/ATL_dreftpsvLNN.c
new file mode 100644
index 0000000000..8d0e0ab06a
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvLNN.c
@@ -0,0 +1,98 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvLNN
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvLNN( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasLower, AtlasNoTrans, AtlasNonUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = 0, jaj = 0, jx  = 0; j < N; j++, jx += INCX )
+   {
+      X[jx] /= A[jaj]; t0 = X[jx];
+      for( i = j+1, iaij = jaj+1, ix = jx + INCX; i < N;
+           i++, iaij += 1, ix += INCX ) { X[ix] -= t0 * A[iaij]; }
+      jaj += lda; lda -= 1;
+   }
+/*
+ * End of ATL_dreftpsvLNN
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvLNU.c b/scikits/learn/src/cblas/ATL_dreftpsvLNU.c
new file mode 100644
index 0000000000..01974c1c75
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvLNU.c
@@ -0,0 +1,98 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvLNU
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvLNU( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasLower, AtlasNoTrans, AtlasUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = 0, jaj = 0, jx  = 0; j < N; j++, jx += INCX )
+   {
+      t0  = X[jx];
+      for( i = j+1,    iaij  = jaj+1, ix  = jx + INCX;
+           i < N; i++, iaij += 1,     ix += INCX ) { X[ix] -= t0 * A[iaij]; }
+      jaj += lda; lda -= 1;
+   }
+/*
+ * End of ATL_dreftpsvLNU
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvLTN.c b/scikits/learn/src/cblas/ATL_dreftpsvLTN.c
new file mode 100644
index 0000000000..636eed9cae
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvLTN.c
@@ -0,0 +1,99 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvLTN
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvLTN( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasLower, AtlasTrans, AtlasNonUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA - N + 1;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = N-1,     jaj = (LDA+1)*(N-1) - ( ((N-1)*N) >> 1 ), jx  = (N-1)*INCX;
+        j >= 0; j--,                                           jx -= INCX )
+   {
+      t0  = X[jx];
+      for( i = j+1,    iaij = jaj+1, ix  = jx + INCX;
+           i < N; i++, iaij += 1,    ix += INCX ) { t0 -= A[iaij] * X[ix]; }
+      t0 /= A[jaj]; X[jx] = t0; lda += 1; jaj -= lda;
+   }
+/*
+ * End of ATL_dreftpsvLTN
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvLTU.c b/scikits/learn/src/cblas/ATL_dreftpsvLTU.c
new file mode 100644
index 0000000000..9d564452c8
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvLTU.c
@@ -0,0 +1,99 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvLTU
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvLTU( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasLower, AtlasTrans, AtlasUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA - N + 1;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = N-1,     jaj = (LDA+1)*(N-1) - ( ((N-1)*N) >> 1 ), jx  = (N-1)*INCX;
+        j >= 0; j--,                                           jx -= INCX )
+   {
+      t0  = X[jx];
+      for( i = j+1,    iaij  = jaj+1, ix  = jx + INCX;
+           i < N; i++, iaij += 1,     ix += INCX ) { t0 -= A[iaij] * X[ix]; }
+      X[jx] = t0; lda += 1; jaj -= lda;
+   }
+/*
+ * End of ATL_dreftpsvLTU
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvUNN.c b/scikits/learn/src/cblas/ATL_dreftpsvUNN.c
new file mode 100644
index 0000000000..af3113b68e
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvUNN.c
@@ -0,0 +1,99 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvUNN
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvUNN( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasUpper, AtlasNoTrans, AtlasNonUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA + N - 1;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = N-1,     jaj = (((N-1)*(2*LDA+N-2)) >> 1), jx  = (N-1)*INCX;
+        j >= 0; j--,                                   jx -= INCX )
+   {
+      X[jx] /= A[j+jaj]; t0 = X[jx];
+      for( i = 0, iaij = jaj, ix = 0; i < j; i++, iaij += 1, ix += INCX )
+      { X[ix] -= t0 * A[iaij]; }
+      lda -= 1; jaj -= lda;
+   }
+/*
+ * End of ATL_dreftpsvUNN
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvUNU.c b/scikits/learn/src/cblas/ATL_dreftpsvUNU.c
new file mode 100644
index 0000000000..b50bfbf0e4
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvUNU.c
@@ -0,0 +1,99 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvUNU
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvUNU( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasUpper, AtlasNoTrans, AtlasUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA + N - 1;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = N-1,     jaj = (((N-1)*(2*LDA+N-2)) >> 1), jx  = (N-1)*INCX;
+        j >= 0; j--,                                   jx -= INCX )
+   {
+      t0 = X[jx];
+      for( i = 0, iaij = jaj, ix = 0; i < j; i++, iaij += 1, ix += INCX )
+      { X[ix] -= t0 * A[iaij]; }
+      lda -= 1; jaj -= lda;
+   }
+/*
+ * End of ATL_dreftpsvUNU
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvUTN.c b/scikits/learn/src/cblas/ATL_dreftpsvUTN.c
new file mode 100644
index 0000000000..1bac3ab098
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvUTN.c
@@ -0,0 +1,98 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvUTN
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvUTN( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasUpper, AtlasTrans, AtlasNonUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = 0, jaj = 0, jx = 0; j < N; j++, jx += INCX )
+   {
+      t0 = X[jx];
+      for( i = 0, iaij = jaj, ix = 0; i < j; i++, iaij += 1, ix += INCX )
+      { t0 -= A[iaij] * X[ix]; }
+      t0 /= A[iaij]; X[jx] = t0; jaj += lda; lda += 1;
+   }
+/*
+ * End of ATL_dreftpsvUTN
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dreftpsvUTU.c b/scikits/learn/src/cblas/ATL_dreftpsvUTU.c
new file mode 100644
index 0000000000..c70c8fec47
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dreftpsvUTU.c
@@ -0,0 +1,98 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+#include "atlas_reflvl2.h"
+#include "atlas_reflevel2.h"
+
+void ATL_dreftpsvUTU
+(
+   const int                  N,
+   const double               * A,
+   const int                  LDA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsvUTU( ... )
+ *
+ * <=>
+ *
+ * ATL_dreftpsv( AtlasUpper, AtlasTrans, AtlasUnit, ... )
+ *
+ * See ATL_dreftpsv for details.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            t0;
+   int                        i, iaij, ix, j, jaj, jx, lda = LDA;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   for( j = 0, jaj = 0, jx = 0; j < N; j++, jx += INCX )
+   {
+      t0 = X[jx];
+      for( i = 0, iaij = jaj, ix = 0; i < j; i++, iaij += 1, ix += INCX )
+      { t0 -= A[iaij] * X[ix]; }
+      X[jx] = t0; jaj += lda; lda += 1;
+   }
+/*
+ * End of ATL_dreftpsvUTU
+ */
+}
diff --git a/scikits/learn/src/cblas/ATL_dtpsv.c b/scikits/learn/src/cblas/ATL_dtpsv.c
new file mode 100644
index 0000000000..887f33f0da
--- /dev/null
+++ b/scikits/learn/src/cblas/ATL_dtpsv.c
@@ -0,0 +1,211 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+
+#include "atlas_refmisc.h"
+
+void ATL_dtpsv
+(
+   const enum ATLAS_UPLO      UPLO,
+   const enum ATLAS_TRANS     TRANS,
+   const enum ATLAS_DIAG      DIAG,
+   const int                  N,
+   const double               * A,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_dreftpsv solves one of the systems of equations
+ *
+ *    A * x = b,   or   A' * x = b,
+ *
+ * where b and x are n-element vectors and  A is an n by n unit, or non-
+ * unit, upper or lower triangular matrix, supplied in packed form.
+ *
+ * No test for  singularity  or  near-singularity  is included  in  this
+ * routine. Such tests must be performed before calling this routine.
+ *
+ * Arguments
+ * =========
+ *
+ * UPLO    (input)                       const enum ATLAS_UPLO
+ *         On entry, UPLO  specifies whether  the  matrix is an upper or
+ *         lower triangular matrix as follows:
+ *
+ *             UPLO = AtlasUpper   A is an upper triangular matrix.
+ *
+ *             UPLO = AtlasLower   A is a lower triangular matrix.
+ *
+ *         Unchanged on exit.
+ *
+ * TRANS   (input)                       const enum ATLAS_TRANS
+ *         On entry,  TRANS specifies the equations to be solved as fol-
+ *         lows:
+ *
+ *            TRANS = AtlasNoTrans     A  * x = b,
+ *
+ *            TRANS = AtlasConj        A  * x = b,
+ *
+ *            TRANS = AtlasTrans       A' * x = b,
+ *
+ *            TRANS = AtlasTrans       A' * x = b.
+ *
+ *         Unchanged on exit.
+ *
+ * DIAG    (input)                       const enum ATLAS_DIAG
+ *         On entry, DIAG specifies whether or not A is unit triangu-
+ *         lar as follows:
+ *
+ *            DIAG = AtlasUnit       A is assumed to be unit triangular,
+ *
+ *            DIAG = AtlasNonUnit    A is not assumed to be unit trian-
+ *                                   gular.
+ *
+ *         Unchanged on exit.
+ *
+ * N       (input)                       const int
+ *         On entry, N specifies the order of the matrix A. N must be at
+ *         least zero. Unchanged on exit.
+ *
+ * A       (input)                       const double *
+ *         On entry,  A  points  to an array of size equal to or greater
+ *         than   (( n*(n+1) ) / 2) * sizeof(   double  ).  Before entry
+ *         with UPLO = AtlasUpper, the array  A  must  contain the upper
+ *         triangular matrix packed sequentially, column by  column,  so
+ *         that A[ 0 ] contains a(0,0), A[ 1 ] and A[ 2 ] contain a(0,1)
+ *         and  a(1,1)  respectively,  and  so  on.  Before  entry  with
+ *         UPLO = AtlasLower, the array  A  must contain the  lower tri-
+ *         angular matrix packed sequentially, column by column, so that
+ *         A[ 0 ] contains a(0,0), A[ 1 ] and A[ 2 ] contain a(1,0)  and
+ *         a( 2, 0 ) respectively, and so on.
+ *
+ *         Note that when  DIAG = AtlasUnit,  the diagonal elements of A
+ *         are not referenced,  but are  assumed to be unity.  Unchanged
+ *         on exit.
+ *
+ * X       (input/output)                double *
+ *         On entry,  X  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof(   double  ),
+ *         that contains the vector x. Before entry, the incremented ar-
+ *         ray X must contain the n element right-hand side vector b. On
+ *         exit, X is overwritten with the solution vector x.
+ *
+ * INCX    (input)                       const int
+ *         On entry, INCX specifies the increment for the elements of X.
+ *         INCX must not be zero. Unchanged on exit.
+ *
+ * ---------------------------------------------------------------------
+ */
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   if( N == 0 ) return;
+
+   if( UPLO == AtlasUpper )
+   {
+      if( ( TRANS == AtlasNoTrans ) || ( TRANS == AtlasConj ) )
+      {
+         if( DIAG == AtlasNonUnit )
+         {
+            ATL_dreftpsvUNN( N,    A, 1,   X, INCX );
+         }
+         else
+         {
+            ATL_dreftpsvUNU( N,    A, 1,   X, INCX );
+         }
+      }
+      else
+      {
+         if( DIAG == AtlasNonUnit )
+         {
+            ATL_dreftpsvUTN( N,    A, 1,   X, INCX );
+         }
+         else
+         {
+            ATL_dreftpsvUTU( N,    A, 1,   X, INCX );
+         }
+      }
+   }
+   else
+   {
+      if( ( TRANS == AtlasNoTrans ) || ( TRANS == AtlasConj ) )
+      {
+         if( DIAG == AtlasNonUnit )
+         {
+            ATL_dreftpsvLNN( N,    A, N,   X, INCX );
+         }
+         else
+         {
+            ATL_dreftpsvLNU( N,    A, N,   X, INCX );
+         }
+      }
+      else
+      {
+         if( DIAG == AtlasNonUnit )
+         {
+            ATL_dreftpsvLTN( N,    A, N,   X, INCX );
+         }
+         else
+         {
+            ATL_dreftpsvLTU( N,    A, N,   X, INCX );
+         }
+      }
+   }
+/*
+ * End of ATL_dreftpsv
+ */
+}
diff --git a/scikits/learn/src/cblas/atlas_enum.h b/scikits/learn/src/cblas/atlas_enum.h
new file mode 100644
index 0000000000..1999eefc38
--- /dev/null
+++ b/scikits/learn/src/cblas/atlas_enum.h
@@ -0,0 +1,55 @@
+/*
+ *             Automatically Tuned Linear Algebra Software v3.6.0
+ *                    (C) Copyright 1997 R. Clint Whaley
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions, and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *   3. The name of the ATLAS group or the names of its contributers may
+ *      not be used to endorse or promote products derived from this
+ *      software without specific written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#ifndef ATLAS_ENUM_H
+   #define ATLAS_ENUM_H
+
+   #define CBLAS_ENUM_ONLY
+   #include "cblas.h"
+   #undef CBLAS_ENUM_ONLY
+
+   #define ATLAS_ORDER CBLAS_ORDER
+      #define AtlasRowMajor CblasRowMajor
+      #define AtlasColMajor CblasColMajor
+   #define ATLAS_TRANS CBLAS_TRANSPOSE
+      #define AtlasNoTrans CblasNoTrans
+      #define AtlasTrans CblasTrans
+      #define AtlasConjTrans CblasConjTrans
+   #define ATLAS_UPLO CBLAS_UPLO
+      #define AtlasUpper CblasUpper
+      #define AtlasLower CblasLower
+   #define ATLAS_DIAG CBLAS_DIAG
+      #define AtlasNonUnit CblasNonUnit
+      #define AtlasUnit CblasUnit
+   #define ATLAS_SIDE CBLAS_SIDE
+      #define AtlasLeft  CblasLeft
+      #define AtlasRight CblasRight
+
+#endif
+
diff --git a/scikits/learn/src/cblas/atlas_reflevel2.h b/scikits/learn/src/cblas/atlas_reflevel2.h
new file mode 100644
index 0000000000..8e82a3f3d7
--- /dev/null
+++ b/scikits/learn/src/cblas/atlas_reflevel2.h
@@ -0,0 +1,791 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+#ifndef ATLAS_REFLEVEL2_H
+#define ATLAS_REFLEVEL2_H
+
+#include "atlas_enum.h"
+/*
+ * =====================================================================
+ * Prototypes for Level 2 Reference ATLAS BLAS routines
+ * =====================================================================
+ */
+void       ATL_srefgbmv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpmv
+(
+  const enum ATLAS_UPLO,
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgemv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpr
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefger
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsbmv
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefspmv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefspr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  float *
+);
+
+void       ATL_srefspr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *
+);
+
+void       ATL_srefsymv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefsyr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsyr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_sreftpsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_sreftrmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_drefgbmv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpmv
+(
+  const enum ATLAS_UPLO,
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgemv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpr
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefger
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsbmv
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefspmv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefspr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  double *
+);
+
+void       ATL_drefspr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *
+);
+
+void       ATL_drefsymv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefsyr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsyr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_dreftpsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_dreftrmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_crefgbmv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmv
+(
+  const enum ATLAS_UPLO,
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgemv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgprc
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgpru
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgerc
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgeru
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhbmv
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhpmv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float *,
+  const float *,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhpr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  float *
+);
+
+void       ATL_crefhpr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *
+);
+
+void       ATL_crefhemv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefher
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefher2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_creftpsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_creftrmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_zrefgbmv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmv
+(
+  const enum ATLAS_UPLO,
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgemv
+(
+  const enum ATLAS_TRANS,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgprc
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgpru
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgerc
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgeru
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhbmv
+(
+  const enum ATLAS_UPLO,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhpmv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double *,
+  const double *,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhpr
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  double *
+);
+
+void       ATL_zrefhpr2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *
+);
+
+void       ATL_zrefhemv
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefher
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefher2
+(
+  const enum ATLAS_UPLO,
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zreftpsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zreftrmv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsv
+(
+  const enum ATLAS_UPLO,  const enum ATLAS_TRANS, const enum ATLAS_DIAG,
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+#endif
+/*
+ * End of atlas_reflevel2.h
+ */
diff --git a/scikits/learn/src/cblas/atlas_reflvl2.h b/scikits/learn/src/cblas/atlas_reflvl2.h
new file mode 100644
index 0000000000..e64f90d26b
--- /dev/null
+++ b/scikits/learn/src/cblas/atlas_reflvl2.h
@@ -0,0 +1,3187 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+#ifndef ATLAS_REFLVL2_H
+#define ATLAS_REFLVL2_H
+/*
+ * =====================================================================
+ * Prototypes for Level 2 Reference Internal ATLAS BLAS routines
+ * =====================================================================
+ */
+void       ATL_srefgbmvN
+(
+  const int,              const int,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgbmvT
+(
+  const int,              const int,
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpmvUN
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpmvUT
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpmvLN
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgpmvLT
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgemvN
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgemvT
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefgprL
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefgprU
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsbmvL
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefsbmvU
+(
+  const int,              const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefspmvL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefspmvU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefsprL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsprU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefspr2L
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefspr2U
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsymvL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefsymvU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  const float,
+  float *,                const int
+);
+
+void       ATL_srefsyrL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsyrU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsyr2L
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_srefsyr2U
+(
+  const int,
+  const float,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvLNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvLNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvLTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvLTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvUNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvUNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvUTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbmvUTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpmvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrmvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvLNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvLNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvLTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvLTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvUNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvUNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvUTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftbsvUTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftpsvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_sreftrsvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_drefgbmvN
+(
+  const int,              const int,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgbmvT
+(
+  const int,              const int,
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpmvUN
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpmvUT
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpmvLN
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgpmvLT
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgemvN
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgemvT
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefgprL
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefgprU
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsbmvL
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefsbmvU
+(
+  const int,              const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefspmvL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefspmvU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefsprL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsprU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefspr2L
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefspr2U
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsymvL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefsymvU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  const double,
+  double *,               const int
+);
+
+void       ATL_drefsyrL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsyrU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsyr2L
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_drefsyr2U
+(
+  const int,
+  const double,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvLNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvLNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvLTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvLTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvUNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvUNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvUTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbmvUTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpmvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrmvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvLNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvLNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvLTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvLTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvUNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvUNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvUTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftbsvUTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftpsvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_dreftrsvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_crefgbmvN
+(
+  const int,              const int,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgbmvT
+(
+  const int,              const int,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgbmvC
+(
+  const int,              const int,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgbmvH
+(
+  const int,              const int,
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvUN
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvUT
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvUC
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvUH
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvLN
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvLT
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvLC
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgpmvLH
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgemvN
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgemvT
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgemvC
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgemvH
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefgprcL
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgprcU
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgpruL
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefgpruU
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhbmvL
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhbmvU
+(
+  const int,              const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhpmvL
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhpmvU
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhprL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhprU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhpr2L
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhpr2U
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefhemvL
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefhemvU
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  const float *,
+  float *,                const int
+);
+
+void       ATL_crefherL
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefherU
+(
+  const int,
+  const float,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefher2L
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_crefher2U
+(
+  const int,
+  const float *,
+  const float *,          const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLCN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLCU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLHN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvLHU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUCN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUCU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUHN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbmvUHU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvLHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpmvUHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvLHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrmvUHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLCN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLCU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLHN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvLHU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUNN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUNU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUTN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUTU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUCN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUCU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUHN
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftbsvUHU
+(
+  const int,              const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvLHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftpsvUHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvLHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUNN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUNU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUTN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUTU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUCN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUCU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUHN
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_creftrsvUHU
+(
+  const int,
+  const float *,          const int,
+  float *,                const int
+);
+
+void       ATL_zrefgbmvN
+(
+  const int,              const int,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgbmvT
+(
+  const int,              const int,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgbmvC
+(
+  const int,              const int,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgbmvH
+(
+  const int,              const int,
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvUN
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvUT
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvUC
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvUH
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvLN
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvLT
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvLC
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgpmvLH
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgemvN
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgemvT
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgemvC
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgemvH
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefgprcL
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgprcU
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgpruL
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefgpruU
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhbmvL
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhbmvU
+(
+  const int,              const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhpmvL
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhpmvU
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhprL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhprU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhpr2L
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhpr2U
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefhemvL
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefhemvU
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  const double *,
+  double *,               const int
+);
+
+void       ATL_zrefherL
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefherU
+(
+  const int,
+  const double,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefher2L
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zrefher2U
+(
+  const int,
+  const double *,
+  const double *,         const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLCN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLCU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLHN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvLHU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUCN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUCU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUHN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbmvUHU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvLHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpmvUHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvLHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrmvUHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLCN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLCU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLHN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvLHU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUNN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUNU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUTN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUTU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUCN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUCU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUHN
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftbsvUHU
+(
+  const int,              const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvLHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftpsvUHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvLHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUNN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUNU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUTN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUTU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUCN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUCU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUHN
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+void       ATL_zreftrsvUHU
+(
+  const int,
+  const double *,         const int,
+  double *,               const int
+);
+
+#endif
+/*
+ * End of atlas_reflvl2.h
+ */
diff --git a/scikits/learn/src/cblas/atlas_refmisc.h b/scikits/learn/src/cblas/atlas_refmisc.h
new file mode 100644
index 0000000000..47d4ba980e
--- /dev/null
+++ b/scikits/learn/src/cblas/atlas_refmisc.h
@@ -0,0 +1,370 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+#ifndef ATL_REFMISC_H
+#define ATL_REFMISC_H
+/*
+ * =====================================================================
+ * Include files
+ * =====================================================================
+ */
+#include <math.h>
+#include "atlas_enum.h"
+/*
+ * =====================================================================
+ * #define macro constants
+ * =====================================================================
+ */
+#define    ATL_sNONE                     (-1.0f)
+#define    ATL_sNTWO                     (-2.0f)
+#define    ATL_sONE                      ( 1.0f)
+#define    ATL_sZERO                     ( 0.0f)
+
+#define    ATL_dNONE                     (-1.0)
+#define    ATL_dNTWO                     (-2.0)
+#define    ATL_dONE                      ( 1.0)
+#define    ATL_dZERO                     ( 0.0)
+/*
+ * =====================================================================
+ * # macro functions
+ * =====================================================================
+ */
+#define    Msabs( a_ ) ( ( (a_) < ATL_sZERO ) ? -(a_) : (a_) )
+
+#define    Mszero( a_r_, a_i_ )                                        \
+           ( ( (a_r_) == ATL_sZERO ) && ( (a_i_) == ATL_sZERO ) )
+
+#define    Msone( a_r_,  a_i_ )                                        \
+           ( ( (a_r_) == ATL_sONE  ) && ( (a_i_) == ATL_sZERO ) )
+
+#define    Msscl( a_r_, a_i_, c_r_, c_i_ )                             \
+           {                                                           \
+              register float tmp_r_, tmp_i_;                           \
+              tmp_r_ = (a_r_) * c_r_ - (a_i_) * c_i_;                  \
+              tmp_i_ = (a_r_) * c_i_ + (a_i_) * c_r_;                  \
+              c_r_   = tmp_r_;                                         \
+              c_i_   = tmp_i_;                                         \
+           }
+/*
+ * Msdiv performs complex division in real arithmetic
+ *    a_r_ + i * a_i_ = ( a_r_ + i * a_i_ ) / ( b_r_ + i * b_i_ );
+ * The algorithm is due to Robert L. Smith and can be found in D. Knuth,
+ * The art of Computer Programming, Vol.2, p.195
+ */
+#define    Msdiv( b_r_, b_i_, a_r_, a_i_ )                             \
+           {                                                           \
+              register float c_i_, c_r_, tmp1_, tmp2_;                 \
+              if( Msabs( b_i_ ) < Msabs( b_r_ ) )                      \
+              {                                                        \
+                 tmp1_ = (b_i_) / (b_r_);                              \
+                 tmp2_ = (b_r_) + (b_i_) * tmp1_;                      \
+                 c_r_  = ( (a_r_) + (a_i_) * tmp1_ ) / tmp2_;          \
+                 c_i_  = ( (a_i_) - (a_r_) * tmp1_ ) / tmp2_;          \
+              }                                                        \
+              else                                                     \
+              {                                                        \
+                 tmp1_ = (b_r_) / (b_i_);                              \
+                 tmp2_ = (b_i_) + (b_r_) * tmp1_;                      \
+                 c_r_  = (  (a_i_) + (a_r_) * tmp1_ ) / tmp2_;         \
+                 c_i_  = ( -(a_r_) + (a_i_) * tmp1_ ) / tmp2_;         \
+              }                                                        \
+              a_r_ = c_r_;                                             \
+              a_i_ = c_i_;                                             \
+           }
+
+#define    Mdabs( a_ ) ( ( (a_) < ATL_dZERO ) ? -(a_) : (a_) )
+
+#define    Mdzero( a_r_, a_i_ )                                        \
+           ( ( (a_r_) == ATL_dZERO ) && ( (a_i_) == ATL_dZERO ) )
+
+#define    Mdone( a_r_, a_i_ )                                         \
+           ( ( (a_r_) == ATL_dONE  ) && ( (a_i_) == ATL_dZERO ) )
+
+#define    Mdscl( a_r_, a_i_, c_r_, c_i_ )                             \
+           {                                                           \
+              register double tmp_r_, tmp_i_;                          \
+              tmp_r_ = (a_r_) * c_r_ - (a_i_) * c_i_;                  \
+              tmp_i_ = (a_r_) * c_i_ + (a_i_) * c_r_;                  \
+              c_r_   = tmp_r_;                                         \
+              c_i_   = tmp_i_;                                         \
+           }
+/*
+ * Mddiv performs complex division in real arithmetic
+ *    a_r_ + i * a_i_ = ( a_r_ + i * a_i_ ) / ( b_r_ + i * b_i_ );
+ * The algorithm is due to Robert L. Smith and can be found in D. Knuth,
+ * The art of Computer Programming, Vol.2, p.195
+ */
+#define    Mddiv( b_r_, b_i_, a_r_, a_i_ )                             \
+           {                                                           \
+              register double c_i_, c_r_, tmp1_, tmp2_;                \
+              if( Mdabs( b_i_ ) < Mdabs( b_r_ ) )                      \
+              {                                                        \
+                 tmp1_ = (b_i_) / (b_r_);                              \
+                 tmp2_ = (b_r_) + (b_i_) * tmp1_;                      \
+                 c_r_  = ( (a_r_) + (a_i_) * tmp1_ ) / tmp2_;          \
+                 c_i_  = ( (a_i_) - (a_r_) * tmp1_ ) / tmp2_;          \
+              }                                                        \
+              else                                                     \
+              {                                                        \
+                 tmp1_ = (b_r_) / (b_i_);                              \
+                 tmp2_ = (b_i_) + (b_r_) * tmp1_;                      \
+                 c_r_  = (  (a_i_) + (a_r_) * tmp1_ ) / tmp2_;         \
+                 c_i_  = ( -(a_r_) + (a_i_) * tmp1_ ) / tmp2_;         \
+              }                                                        \
+              a_r_ = c_r_;                                             \
+              a_i_ = c_i_;                                             \
+           }
+
+#define    Mmin( a_, b_ ) ( ( (a_) < (b_) ) ?  (a_) : (b_) )
+
+#define    Mmax( a_, b_ ) ( ( (a_) > (b_) ) ?  (a_) : (b_) )
+
+#define    Mmul( a_r_, a_i_, b_r_, b_i_, c_r_, c_i_ )                  \
+           {                                                           \
+              c_r_ = (a_r_) * (b_r_) - (a_i_) * (b_i_);                \
+              c_i_ = (a_r_) * (b_i_) + (a_i_) * (b_r_);                \
+           }
+
+#define    Mmla( a_r_, a_i_, b_r_, b_i_, c_r_, c_i_ )                  \
+           {                                                           \
+              c_r_ += (a_r_) * (b_r_) - (a_i_) * (b_i_);               \
+              c_i_ += (a_r_) * (b_i_) + (a_i_) * (b_r_);               \
+           }
+
+#define    Mmls( a_r_, a_i_, b_r_, b_i_, c_r_, c_i_ )                  \
+           {                                                           \
+              c_r_ -= (a_r_) * (b_r_) - (a_i_) * (b_i_);               \
+              c_i_ -= (a_r_) * (b_i_) + (a_i_) * (b_r_);               \
+           }
+
+#define    Mset( a_r_, a_i_, b_r_, b_i_ )                              \
+           {                                                           \
+              b_r_ = (a_r_);                                           \
+              b_i_ = (a_i_);                                           \
+           }
+
+#define    Mselscal( al_, a_ )                                         \
+           {                                                           \
+              if(      (al_) == ATL_sZERO ) { (a_)  = ATL_sZERO; }     \
+              else if( (al_) != ATL_sONE  ) { (a_) *= (al_);     }     \
+           }
+
+#define    Mdelscal( al_, a_ )                                         \
+           {                                                           \
+              if(      (al_) == ATL_dZERO ) { (a_)  = ATL_dZERO; }     \
+              else if( (al_) != ATL_dONE  ) { (a_) *= (al_);     }     \
+           }
+
+#define    Mcelscal( al_r_, al_i_, a_r_, a_i_ )                        \
+           {                                                           \
+              if( Mszero( (al_r_), (al_i_) ) )                         \
+              { (a_r_) = (a_i_) = ATL_sZERO; }                         \
+              else if( ! Msone( (al_r_), (al_i_) ) )                   \
+              { Msscl( (al_r_), (al_i_), (a_r_), (a_i_) ); }           \
+           }
+
+#define    Mzelscal( al_r_, al_i_, a_r_, a_i_ )                        \
+           {                                                           \
+              if( Mdzero( (al_r_), (al_i_) ) )                         \
+              { (a_r_) = (a_i_) = ATL_dZERO; }                         \
+              else if( ! Mdone( (al_r_), (al_i_) ) )                   \
+              { Mdscl( (al_r_), (al_i_), (a_r_), (a_i_) ); }           \
+           }
+
+#define    Msvscal( n_, al_, x_, incx_ )                               \
+           {                                                           \
+            int i_, ix_;                                               \
+            if(      (al_) == ATL_sZERO )                              \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx_) )   \
+             { (x_)[ix_] = ATL_sZERO; }                                \
+            }                                                          \
+            else if( (al_) != ATL_sONE )                               \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx_) )   \
+             { (x_)[ix_] *= (al_); }                                   \
+            }                                                          \
+           }
+
+#define    Mdvscal( n_, al_, x_, incx_ )                               \
+           {                                                           \
+            int i_, ix_;                                               \
+            if(      (al_) == ATL_dZERO )                              \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx_) )   \
+             { (x_)[ix_] = ATL_dZERO; }                                \
+            }                                                          \
+            else if( (al_) != ATL_dONE )                               \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx_) )   \
+             { (x_)[ix_] *= (al_); }                                   \
+            }                                                          \
+           }
+
+#define    Mcvscal( n_, al_, x_, incx_ )                               \
+           {                                                           \
+            int i_, ix_, incx2_ = ( 2 * (incx_) );                     \
+            if( Mszero( (al_)[0], (al_)[1] ) )                         \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx2_) )  \
+             { (x_)[ix_] = (x_)[ix_+1] = ATL_sZERO; }                  \
+            }                                                          \
+            else if( ! Msone( (al_)[0], (al_)[1] ) )                   \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx2_) )  \
+             { Msscl( (al_)[0], (al_)[1], (x_)[ix_], (x_)[ix_+1] ); }  \
+            }                                                          \
+           }
+
+#define    Mzvscal( n_, al_, x_, incx_ )                               \
+           {                                                           \
+            int i_, ix_, incx2_ = ( 2 * (incx_) );                     \
+            if( Mdzero( (al_)[0], (al_)[1] ) )                         \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx2_) )  \
+             { (x_)[ix_] = (x_)[ix_+1] = ATL_dZERO; }                  \
+            }                                                          \
+            else if( ! Mdone( (al_)[0], (al_)[1] ) )                   \
+            {                                                          \
+             for( i_ = 0, ix_ = 0; i_ < (n_); i_++, ix_ += (incx2_) )  \
+             { Mdscl( (al_)[0], (al_)[1], (x_)[ix_], (x_)[ix_+1] ); }  \
+            }                                                          \
+           }
+
+#define    Msgescal( m_, n_, al_, a_, lda_ )                           \
+           {                                                           \
+            int i_, iaij_, j_, jaj_;                                   \
+            if(      (al_) == ATL_sZERO )                              \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += (lda_) )  \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 1 ) \
+              { (a_)[iaij_] = ATL_sZERO; }                             \
+             }                                                         \
+            }                                                          \
+            else if( (al_) != ATL_sONE )                               \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += (lda_) )  \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 1 ) \
+              { (a_)[iaij_] *= (al_); }                                \
+             }                                                         \
+            }                                                          \
+           }
+
+#define    Mdgescal( m_, n_, al_, a_, lda_ )                           \
+           {                                                           \
+            int i_, iaij_, j_, jaj_;                                   \
+            if(      (al_) == ATL_dZERO )                              \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += (lda_) )  \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 1 ) \
+              { (a_)[iaij_] = ATL_dZERO; }                             \
+             }                                                         \
+            }                                                          \
+            else if( (al_) != ATL_dONE )                               \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += (lda_) )  \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 1 ) \
+              { (a_)[iaij_] *= (al_); }                                \
+             }                                                         \
+            }                                                          \
+           }
+
+#define    Mcgescal( m_, n_, al_, a_, lda_ )                           \
+           {                                                           \
+            int i_, iaij_, j_, jaj_, lda2_ = ( (lda_) << 1 );          \
+            if( Mszero( (al_)[0], (al_)[1] ) )                         \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += lda2_ )   \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 2 ) \
+              { (a_)[iaij_] = (a_)[iaij_+1] = ATL_sZERO; }             \
+             }                                                         \
+            }                                                          \
+            else if( ! Msone( (al_)[0], (al_)[1] ) )                   \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += lda2_ )   \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 2 ) \
+              {                                                        \
+              Msscl( (al_)[0], (al_)[1], (a_)[iaij_], (a_)[iaij_+1] ); \
+              }                                                        \
+             }                                                         \
+            }                                                          \
+           }
+
+#define    Mzgescal( m_, n_, al_, a_, lda_ )                           \
+           {                                                           \
+            int i_, iaij_, j_, jaj_, lda2_ = ( (lda_) << 1 );          \
+            if( Mdzero( (al_)[0], (al_)[1] ) )                         \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += lda2_ )   \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 2 ) \
+              { (a_)[iaij_] = (a_)[iaij_+1] = ATL_dZERO; }             \
+             }                                                         \
+            }                                                          \
+            else if( ! Mdone( (al_)[0], (al_)[1] ) )                   \
+            {                                                          \
+             for( j_ = 0, jaj_ = 0; j_ < (n_); j_++, jaj_ += lda2_ )   \
+             {                                                         \
+              for( i_ = 0, iaij_ = jaj_; i_ < (m_); i_++, iaij_ += 2 ) \
+              {                                                        \
+              Mdscl( (al_)[0], (al_)[1], (a_)[iaij_], (a_)[iaij_+1] ); \
+              }                                                        \
+             }                                                         \
+            }                                                          \
+           }
+
+#endif
+/*
+ * End of atlas_refmisc.h
+ */
diff --git a/scikits/learn/src/cblas/cblas.h b/scikits/learn/src/cblas/cblas.h
new file mode 100644
index 0000000000..4087ffb922
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas.h
@@ -0,0 +1,596 @@
+#ifndef CBLAS_H
+
+#ifndef CBLAS_ENUM_DEFINED_H
+   #define CBLAS_ENUM_DEFINED_H
+   enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102 };
+   enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113,
+                         AtlasConj=114};
+   enum CBLAS_UPLO  {CblasUpper=121, CblasLower=122};
+   enum CBLAS_DIAG  {CblasNonUnit=131, CblasUnit=132};
+   enum CBLAS_SIDE  {CblasLeft=141, CblasRight=142};
+#endif
+
+#ifndef CBLAS_ENUM_ONLY
+#define CBLAS_H
+#define CBLAS_INDEX int
+
+int cblas_errprn(int ierr, int info, char *form, ...);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 1 BLAS functions (complex are recast as routines)
+ * ===========================================================================
+ */
+float  cblas_sdsdot(const int N, const float alpha, const float *X,
+                    const int incX, const float *Y, const int incY);
+double cblas_dsdot(const int N, const float *X, const int incX, const float *Y,
+                   const int incY);
+float  cblas_sdot(const int N, const float  *X, const int incX,
+                  const float  *Y, const int incY);
+double cblas_ddot(const int N, const double *X, const int incX,
+                  const double *Y, const int incY);
+/*
+ * Functions having prefixes Z and C only
+ */
+void   cblas_cdotu_sub(const int N, const void *X, const int incX,
+                       const void *Y, const int incY, void *dotu);
+void   cblas_cdotc_sub(const int N, const void *X, const int incX,
+                       const void *Y, const int incY, void *dotc);
+
+void   cblas_zdotu_sub(const int N, const void *X, const int incX,
+                       const void *Y, const int incY, void *dotu);
+void   cblas_zdotc_sub(const int N, const void *X, const int incX,
+                       const void *Y, const int incY, void *dotc);
+
+
+/*
+ * Functions having prefixes S D SC DZ
+ */
+float  cblas_snrm2(const int N, const float *X, const int incX);
+float  cblas_sasum(const int N, const float *X, const int incX);
+
+double cblas_dnrm2(const int N, const double *X, const int incX);
+double cblas_dasum(const int N, const double *X, const int incX);
+
+float  cblas_scnrm2(const int N, const void *X, const int incX);
+float  cblas_scasum(const int N, const void *X, const int incX);
+
+double cblas_dznrm2(const int N, const void *X, const int incX);
+double cblas_dzasum(const int N, const void *X, const int incX);
+
+
+/*
+ * Functions having standard 4 prefixes (S D C Z)
+ */
+CBLAS_INDEX cblas_isamax(const int N, const float  *X, const int incX);
+CBLAS_INDEX cblas_idamax(const int N, const double *X, const int incX);
+CBLAS_INDEX cblas_icamax(const int N, const void   *X, const int incX);
+CBLAS_INDEX cblas_izamax(const int N, const void   *X, const int incX);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 1 BLAS routines
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (s, d, c, z)
+ */
+void cblas_sswap(const int N, float *X, const int incX,
+                 float *Y, const int incY);
+void cblas_scopy(const int N, const float *X, const int incX,
+                 float *Y, const int incY);
+void cblas_saxpy(const int N, const float alpha, const float *X,
+                 const int incX, float *Y, const int incY);
+void catlas_saxpby(const int N, const float alpha, const float *X,
+                  const int incX, const float beta, float *Y, const int incY);
+void catlas_sset
+   (const int N, const float alpha, float *X, const int incX);
+
+void cblas_dswap(const int N, double *X, const int incX,
+                 double *Y, const int incY);
+void cblas_dcopy(const int N, const double *X, const int incX,
+                 double *Y, const int incY);
+void cblas_daxpy(const int N, const double alpha, const double *X,
+                 const int incX, double *Y, const int incY);
+void catlas_daxpby(const int N, const double alpha, const double *X,
+                  const int incX, const double beta, double *Y, const int incY);
+void catlas_dset
+   (const int N, const double alpha, double *X, const int incX);
+
+void cblas_cswap(const int N, void *X, const int incX,
+                 void *Y, const int incY);
+void cblas_ccopy(const int N, const void *X, const int incX,
+                 void *Y, const int incY);
+void cblas_caxpy(const int N, const void *alpha, const void *X,
+                 const int incX, void *Y, const int incY);
+void catlas_caxpby(const int N, const void *alpha, const void *X,
+                  const int incX, const void *beta, void *Y, const int incY);
+void catlas_cset
+   (const int N, const void *alpha, void *X, const int incX);
+
+void cblas_zswap(const int N, void *X, const int incX,
+                 void *Y, const int incY);
+void cblas_zcopy(const int N, const void *X, const int incX,
+                 void *Y, const int incY);
+void cblas_zaxpy(const int N, const void *alpha, const void *X,
+                 const int incX, void *Y, const int incY);
+void catlas_zaxpby(const int N, const void *alpha, const void *X,
+                  const int incX, const void *beta, void *Y, const int incY);
+void catlas_zset
+   (const int N, const void *alpha, void *X, const int incX);
+
+
+/*
+ * Routines with S and D prefix only
+ */
+void cblas_srotg(float *a, float *b, float *c, float *s);
+void cblas_srotmg(float *d1, float *d2, float *b1, const float b2, float *P);
+void cblas_srot(const int N, float *X, const int incX,
+                float *Y, const int incY, const float c, const float s);
+void cblas_srotm(const int N, float *X, const int incX,
+                float *Y, const int incY, const float *P);
+
+void cblas_drotg(double *a, double *b, double *c, double *s);
+void cblas_drotmg(double *d1, double *d2, double *b1, const double b2, double *P);
+void cblas_drot(const int N, double *X, const int incX,
+                double *Y, const int incY, const double c, const double s);
+void cblas_drotm(const int N, double *X, const int incX,
+                double *Y, const int incY, const double *P);
+
+
+/*
+ * Routines with S D C Z CS and ZD prefixes
+ */
+void cblas_sscal(const int N, const float alpha, float *X, const int incX);
+void cblas_dscal(const int N, const double alpha, double *X, const int incX);
+void cblas_cscal(const int N, const void *alpha, void *X, const int incX);
+void cblas_zscal(const int N, const void *alpha, void *X, const int incX);
+void cblas_csscal(const int N, const float alpha, void *X, const int incX);
+void cblas_zdscal(const int N, const double alpha, void *X, const int incX);
+
+/*
+ * Extra reference routines provided by ATLAS, but not mandated by the standard
+ */
+void cblas_crotg(void *a, void *b, void *c, void *s);
+void cblas_zrotg(void *a, void *b, void *c, void *s);
+void cblas_csrot(const int N, void *X, const int incX, void *Y, const int incY,
+                 const float c, const float s);
+void cblas_zdrot(const int N, void *X, const int incX, void *Y, const int incY,
+                 const double c, const double s);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 2 BLAS
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+void cblas_sgemv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const float alpha, const float *A, const int lda,
+                 const float *X, const int incX, const float beta,
+                 float *Y, const int incY);
+void cblas_sgbmv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const int KL, const int KU, const float alpha,
+                 const float *A, const int lda, const float *X,
+                 const int incX, const float beta, float *Y, const int incY);
+void cblas_strmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const float *A, const int lda,
+                 float *X, const int incX);
+void cblas_stbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const float *A, const int lda,
+                 float *X, const int incX);
+void cblas_stpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const float *Ap, float *X, const int incX);
+void cblas_strsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const float *A, const int lda, float *X,
+                 const int incX);
+void cblas_stbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const float *A, const int lda,
+                 float *X, const int incX);
+void cblas_stpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const float *Ap, float *X, const int incX);
+
+void cblas_dgemv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const double alpha, const double *A, const int lda,
+                 const double *X, const int incX, const double beta,
+                 double *Y, const int incY);
+void cblas_dgbmv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const int KL, const int KU, const double alpha,
+                 const double *A, const int lda, const double *X,
+                 const int incX, const double beta, double *Y, const int incY);
+void cblas_dtrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const double *A, const int lda,
+                 double *X, const int incX);
+void cblas_dtbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const double *A, const int lda,
+                 double *X, const int incX);
+void cblas_dtpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const double *Ap, double *X, const int incX);
+void cblas_dtrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const double *A, const int lda, double *X,
+                 const int incX);
+void cblas_dtbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const double *A, const int lda,
+                 double *X, const int incX);
+void cblas_dtpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const double *Ap, double *X, const int incX);
+
+void cblas_cgemv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *X, const int incX, const void *beta,
+                 void *Y, const int incY);
+void cblas_cgbmv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const int KL, const int KU, const void *alpha,
+                 const void *A, const int lda, const void *X,
+                 const int incX, const void *beta, void *Y, const int incY);
+void cblas_ctrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ctbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ctpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *Ap, void *X, const int incX);
+void cblas_ctrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *A, const int lda, void *X,
+                 const int incX);
+void cblas_ctbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ctpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *Ap, void *X, const int incX);
+
+void cblas_zgemv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *X, const int incX, const void *beta,
+                 void *Y, const int incY);
+void cblas_zgbmv(const enum CBLAS_ORDER Order,
+                 const enum CBLAS_TRANSPOSE TransA, const int M, const int N,
+                 const int KL, const int KU, const void *alpha,
+                 const void *A, const int lda, const void *X,
+                 const int incX, const void *beta, void *Y, const int incY);
+void cblas_ztrmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ztbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ztpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *Ap, void *X, const int incX);
+void cblas_ztrsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *A, const int lda, void *X,
+                 const int incX);
+void cblas_ztbsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const int K, const void *A, const int lda,
+                 void *X, const int incX);
+void cblas_ztpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag,
+                 const int N, const void *Ap, void *X, const int incX);
+
+
+/*
+ * Routines with S and D prefixes only
+ */
+void cblas_ssymv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const float alpha, const float *A,
+                 const int lda, const float *X, const int incX,
+                 const float beta, float *Y, const int incY);
+void cblas_ssbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const int K, const float alpha, const float *A,
+                 const int lda, const float *X, const int incX,
+                 const float beta, float *Y, const int incY);
+void cblas_sspmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const float alpha, const float *Ap,
+                 const float *X, const int incX,
+                 const float beta, float *Y, const int incY);
+void cblas_sger(const enum CBLAS_ORDER Order, const int M, const int N,
+                const float alpha, const float *X, const int incX,
+                const float *Y, const int incY, float *A, const int lda);
+void cblas_ssyr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const float *X,
+                const int incX, float *A, const int lda);
+void cblas_sspr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const float *X,
+                const int incX, float *Ap);
+void cblas_ssyr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const float *X,
+                const int incX, const float *Y, const int incY, float *A,
+                const int lda);
+void cblas_sspr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const float *X,
+                const int incX, const float *Y, const int incY, float *A);
+
+void cblas_dsymv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const double alpha, const double *A,
+                 const int lda, const double *X, const int incX,
+                 const double beta, double *Y, const int incY);
+void cblas_dsbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const int K, const double alpha, const double *A,
+                 const int lda, const double *X, const int incX,
+                 const double beta, double *Y, const int incY);
+void cblas_dspmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const double alpha, const double *Ap,
+                 const double *X, const int incX,
+                 const double beta, double *Y, const int incY);
+void cblas_dger(const enum CBLAS_ORDER Order, const int M, const int N,
+                const double alpha, const double *X, const int incX,
+                const double *Y, const int incY, double *A, const int lda);
+void cblas_dsyr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const double *X,
+                const int incX, double *A, const int lda);
+void cblas_dspr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const double *X,
+                const int incX, double *Ap);
+void cblas_dsyr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const double *X,
+                const int incX, const double *Y, const int incY, double *A,
+                const int lda);
+void cblas_dspr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const double *X,
+                const int incX, const double *Y, const int incY, double *A);
+
+
+/*
+ * Routines with C and Z prefixes only
+ */
+void cblas_chemv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const void *alpha, const void *A,
+                 const int lda, const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_chbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const int K, const void *alpha, const void *A,
+                 const int lda, const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_chpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const void *alpha, const void *Ap,
+                 const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_cgeru(const enum CBLAS_ORDER Order, const int M, const int N,
+                 const void *alpha, const void *X, const int incX,
+                 const void *Y, const int incY, void *A, const int lda);
+void cblas_cgerc(const enum CBLAS_ORDER Order, const int M, const int N,
+                 const void *alpha, const void *X, const int incX,
+                 const void *Y, const int incY, void *A, const int lda);
+void cblas_cher(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const void *X, const int incX,
+                void *A, const int lda);
+void cblas_chpr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const float alpha, const void *X,
+                const int incX, void *A);
+void cblas_cher2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N,
+                const void *alpha, const void *X, const int incX,
+                const void *Y, const int incY, void *A, const int lda);
+void cblas_chpr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N,
+                const void *alpha, const void *X, const int incX,
+                const void *Y, const int incY, void *Ap);
+
+void cblas_zhemv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const void *alpha, const void *A,
+                 const int lda, const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_zhbmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const int K, const void *alpha, const void *A,
+                 const int lda, const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_zhpmv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const int N, const void *alpha, const void *Ap,
+                 const void *X, const int incX,
+                 const void *beta, void *Y, const int incY);
+void cblas_zgeru(const enum CBLAS_ORDER Order, const int M, const int N,
+                 const void *alpha, const void *X, const int incX,
+                 const void *Y, const int incY, void *A, const int lda);
+void cblas_zgerc(const enum CBLAS_ORDER Order, const int M, const int N,
+                 const void *alpha, const void *X, const int incX,
+                 const void *Y, const int incY, void *A, const int lda);
+void cblas_zher(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const void *X, const int incX,
+                void *A, const int lda);
+void cblas_zhpr(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                const int N, const double alpha, const void *X,
+                const int incX, void *A);
+void cblas_zher2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N,
+                const void *alpha, const void *X, const int incX,
+                const void *Y, const int incY, void *A, const int lda);
+void cblas_zhpr2(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const int N,
+                const void *alpha, const void *X, const int incX,
+                const void *Y, const int incY, void *Ap);
+
+/*
+ * ===========================================================================
+ * Prototypes for level 3 BLAS
+ * ===========================================================================
+ */
+
+/*
+ * Routines with standard 4 prefixes (S, D, C, Z)
+ */
+void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+                 const int K, const float alpha, const float *A,
+                 const int lda, const float *B, const int ldb,
+                 const float beta, float *C, const int ldc);
+void cblas_ssymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const float alpha, const float *A, const int lda,
+                 const float *B, const int ldb, const float beta,
+                 float *C, const int ldc);
+void cblas_ssyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const float alpha, const float *A, const int lda,
+                 const float beta, float *C, const int ldc);
+void cblas_ssyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const float alpha, const float *A, const int lda,
+                  const float *B, const int ldb, const float beta,
+                  float *C, const int ldc);
+void cblas_strmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const float alpha, const float *A, const int lda,
+                 float *B, const int ldb);
+void cblas_strsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const float alpha, const float *A, const int lda,
+                 float *B, const int ldb);
+
+void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+                 const int K, const double alpha, const double *A,
+                 const int lda, const double *B, const int ldb,
+                 const double beta, double *C, const int ldc);
+void cblas_dsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const double alpha, const double *A, const int lda,
+                 const double *B, const int ldb, const double beta,
+                 double *C, const int ldc);
+void cblas_dsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const double alpha, const double *A, const int lda,
+                 const double beta, double *C, const int ldc);
+void cblas_dsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const double alpha, const double *A, const int lda,
+                  const double *B, const int ldb, const double beta,
+                  double *C, const int ldc);
+void cblas_dtrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const double alpha, const double *A, const int lda,
+                 double *B, const int ldb);
+void cblas_dtrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const double alpha, const double *A, const int lda,
+                 double *B, const int ldb);
+
+void cblas_cgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+                 const int K, const void *alpha, const void *A,
+                 const int lda, const void *B, const int ldb,
+                 const void *beta, void *C, const int ldc);
+void cblas_csymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *B, const int ldb, const void *beta,
+                 void *C, const int ldc);
+void cblas_csyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const void *alpha, const void *A, const int lda,
+                 const void *beta, void *C, const int ldc);
+void cblas_csyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const void *alpha, const void *A, const int lda,
+                  const void *B, const int ldb, const void *beta,
+                  void *C, const int ldc);
+void cblas_ctrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 void *B, const int ldb);
+void cblas_ctrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 void *B, const int ldb);
+
+void cblas_zgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_TRANSPOSE TransB, const int M, const int N,
+                 const int K, const void *alpha, const void *A,
+                 const int lda, const void *B, const int ldb,
+                 const void *beta, void *C, const int ldc);
+void cblas_zsymm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *B, const int ldb, const void *beta,
+                 void *C, const int ldc);
+void cblas_zsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const void *alpha, const void *A, const int lda,
+                 const void *beta, void *C, const int ldc);
+void cblas_zsyr2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const void *alpha, const void *A, const int lda,
+                  const void *B, const int ldb, const void *beta,
+                  void *C, const int ldc);
+void cblas_ztrmm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 void *B, const int ldb);
+void cblas_ztrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA,
+                 const enum CBLAS_DIAG Diag, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 void *B, const int ldb);
+
+
+/*
+ * Routines with prefixes C and Z only
+ */
+void cblas_chemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *B, const int ldb, const void *beta,
+                 void *C, const int ldc);
+void cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const float alpha, const void *A, const int lda,
+                 const float beta, void *C, const int ldc);
+void cblas_cher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const void *alpha, const void *A, const int lda,
+                  const void *B, const int ldb, const float beta,
+                  void *C, const int ldc);
+void cblas_zhemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side,
+                 const enum CBLAS_UPLO Uplo, const int M, const int N,
+                 const void *alpha, const void *A, const int lda,
+                 const void *B, const int ldb, const void *beta,
+                 void *C, const int ldc);
+void cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                 const double alpha, const void *A, const int lda,
+                 const double beta, void *C, const int ldc);
+void cblas_zher2k(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                  const enum CBLAS_TRANSPOSE Trans, const int N, const int K,
+                  const void *alpha, const void *A, const int lda,
+                  const void *B, const int ldb, const double beta,
+                  void *C, const int ldc);
+
+int cblas_errprn(int ierr, int info, char *form, ...);
+
+#endif  /* end #ifdef CBLAS_ENUM_ONLY */
+#endif
diff --git a/scikits/learn/src/cblas/cblas_daxpy.c b/scikits/learn/src/cblas/cblas_daxpy.c
new file mode 100644
index 0000000000..dce744b291
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_daxpy.c
@@ -0,0 +1,159 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+
+void cblas_daxpy
+(
+   const int                  N,
+   const double               ALPHA,
+   const double               * X,
+   const int                  INCX,
+   double                     * Y,
+   const int                  INCY
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_drefaxpy performs the following operation:
+ *
+ *    y := y + alpha * x,
+ *
+ * where alpha is a scalar and x and y are two n-vectors.
+ *
+ * Arguments
+ * =========
+ *
+ * N       (input)                       const int
+ *         On entry, N specifies the length of the vector x. N  must  be
+ *         at least zero. Unchanged on exit.
+ *
+ * ALPHA   (input)                       const double
+ *         On entry, ALPHA specifies the scalar alpha.   When  ALPHA  is
+ *         supplied as zero, then the entries of the incremented array X
+ *         need not be set on input. Unchanged on exit.
+ *
+ * X       (input)                       const double *
+ *         On entry,  X  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof(   double  ),
+ *         that contains the vector x. Unchanged on exit.
+ *
+ * INCX    (input)                       const int
+ *         On entry, INCX specifies the increment for the elements of X.
+ *         INCX must not be zero. Unchanged on exit.
+ *
+ * Y       (input/output)                double *
+ *         On entry,  Y  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCY ) ) * sizeof(   double  ),
+ *         that contains the vector y.  On exit,  the entries of the in-
+ *         cremented array  Y are updated with the scaled entries of the
+ *         incremented array  X.
+ *
+ * INCY    (input)                       const int
+ *         On entry, INCY specifies the increment for the elements of Y.
+ *         INCY must not be zero. Unchanged on exit.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register const double      alpha = ALPHA;
+   register double            x0, x1, x2, x3, y0, y1, y2, y3;
+   double                     * StX;
+   register int               i;
+   int                        nu;
+   const int                  incX2 = 2 * INCX, incY2 = 2 * INCY,
+                              incX3 = 3 * INCX, incY3 = 3 * INCY,
+                              incX4 = 4 * INCX, incY4 = 4 * INCY;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   if( ( N > 0 ) && ( alpha != ATL_dZERO ) )
+   {
+      if( ( nu = ( N >> 2 ) << 2 ) != 0 )
+      {
+         StX = (double *)X + nu * INCX;
+
+         do
+         {
+            x0 = (*X);     y0 = (*Y);     x1 = X[INCX ]; y1 = Y[INCY ];
+            x2 = X[incX2]; y2 = Y[incY2]; x3 = X[incX3]; y3 = Y[incY3];
+
+            *Y       = y0 + alpha * x0; Y[INCY ] = y1 + alpha * x1;
+            Y[incY2] = y2 + alpha * x2; Y[incY3] = y3 + alpha * x3;
+
+            X  += incX4;
+            Y  += incY4;
+
+         } while( X != StX );
+      }
+
+      for( i = N - nu; i != 0; i-- )
+      {
+         x0  = (*X);
+         y0  = (*Y);
+
+         *Y  = y0 + alpha * x0;
+
+         X  += INCX;
+         Y  += INCY;
+      }
+   }
+/*
+ * End of ATL_drefaxpy
+ */
+}
diff --git a/scikits/learn/src/cblas/cblas_ddot.c b/scikits/learn/src/cblas/cblas_ddot.c
new file mode 100644
index 0000000000..7f2fd32db4
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_ddot.c
@@ -0,0 +1,135 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+
+double cblas_ddot
+(
+   const int                  N,
+   const double               * X,
+   const int                  INCX,
+   const double               * Y,
+   const int                  INCY
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_drefdot returns the dot product x^T * y of two n-vectors x and y.
+ *
+ * Arguments
+ * =========
+ *
+ * N       (input)                       const int
+ *         On entry, N specifies the length of the vector x. N  must  be
+ *         at least zero. Unchanged on exit.
+ *
+ * X       (input)                       const double *
+ *         On entry,  X  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof(   double  ),
+ *         that contains the vector x. Unchanged on exit.
+ *
+ * INCX    (input)                       const int
+ *         On entry, INCX specifies the increment for the elements of X.
+ *         INCX must not be zero. Unchanged on exit.
+ *
+ * Y       (input)                       const double *
+ *         On entry,  Y  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCY ) ) * sizeof(   double  ),
+ *         that contains the vector y. Unchanged on exit.
+ *
+ * INCY    (input)                       const int
+ *         On entry, INCY specifies the increment for the elements of Y.
+ *         INCY must not be zero. Unchanged on exit.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            dot = ATL_dZERO, x0, x1, x2, x3,
+                              y0, y1, y2, y3;
+   double                     * StX;
+   register int               i;
+   int                        nu;
+   const int                  incX2 = 2 * INCX, incY2 = 2 * INCY,
+                              incX3 = 3 * INCX, incY3 = 3 * INCY,
+                              incX4 = 4 * INCX, incY4 = 4 * INCY;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   if( N > 0 )
+   {
+      if( ( nu = ( N >> 2 ) << 2 ) != 0 )
+      {
+         StX = (double *)X + nu * INCX;
+
+         do
+         {
+            x0 = (*X);     y0 = (*Y);     x1 = X[INCX ]; y1 = Y[INCY ];
+            x2 = X[incX2]; y2 = Y[incY2]; x3 = X[incX3]; y3 = Y[incY3];
+            dot += x0 * y0; dot += x1 * y1; dot += x2 * y2; dot += x3 * y3;
+            X  += incX4; Y  += incY4;
+         } while( X != StX );
+      }
+
+      for( i = N - nu; i != 0; i-- )
+      {  x0 = (*X); y0 = (*Y); dot += x0 * y0; X += INCX; Y += INCY; }
+   }
+   return( dot );
+/*
+ * End of ATL_drefdot
+ */
+}
diff --git a/scikits/learn/src/cblas/cblas_dnrm2.c b/scikits/learn/src/cblas/cblas_dnrm2.c
new file mode 100644
index 0000000000..113faa5585
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_dnrm2.c
@@ -0,0 +1,206 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+
+double cblas_dnrm2
+(
+   const int                  N,
+   const double               * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_drefnrm2 returns the 2-norm of an n-vector x.
+ *
+ * Arguments
+ * =========
+ *
+ * N       (input)                       const int
+ *         On entry, N specifies the length of the vector x. N  must  be
+ *         at least zero. Unchanged on exit.
+ *
+ * X       (input)                       const double *
+ *         On entry,  X  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof(   double  ),
+ *         that contains the vector x. Unchanged on exit.
+ *
+ * INCX    (input)                       const int
+ *         On entry, INCX specifies the increment for the elements of X.
+ *         INCX must not be zero. Unchanged on exit.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+   register double            absxi, scale = ATL_dZERO,
+                              ssq = ATL_dONE, temp, x0, x1, x2, x3, x4,
+                              x5, x6, x7;
+   double                     * StX = (double *)(X) + N * INCX;
+   register int               i;
+   int                        n = (int)(N), nu;
+   const int                  incX2 = 2 * INCX, incX3 = 3 * INCX,
+                              incX4 = 4 * INCX, incX5 = 5 * INCX,
+                              incX6 = 6 * INCX, incX7 = 7 * INCX,
+                              incX8 = 8 * INCX;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   if(    ( N  < 1 ) || ( INCX < 1 ) ) return( ATL_dZERO );
+   else if( N == 1 )                   return( Mdabs( *X ) );
+
+   while( (X != StX)  && ( *X == ATL_dZERO ) ) { X += INCX; n--; }
+
+   if( X == StX ) return( ATL_dZERO );
+
+   if( ( nu = ( n >> 3 ) << 3 ) != 0 )
+   {
+      StX = (double *)X + nu * INCX;
+
+      do
+      {
+         x0 = (*X);     x4 = X[incX4]; x1 = X[INCX ]; x5 = X[incX5];
+         x2 = X[incX2]; x6 = X[incX6]; x3 = X[incX3]; x7 = X[incX7];
+
+         absxi = Mdabs( x0 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x4 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x1 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x5 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x2 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x6 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x3 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         absxi = Mdabs( x7 );
+         if( scale < absxi )
+         {
+            temp = scale / absxi; scale = absxi;
+            ssq  = ATL_dONE + ssq * ( temp * temp );
+         }
+         else { temp = absxi / scale; ssq += temp * temp; }
+
+         X  += incX8;
+
+      } while( X != StX );
+   }
+
+   for( i = n - nu; i != 0; i-- )
+   {
+      x0  = (*X);
+
+      absxi = Mdabs( x0 );
+      if( scale < absxi )
+      {
+         temp = scale / absxi; scale = absxi;
+         ssq  = ATL_dONE + ssq * ( temp * temp );
+      }
+      else { temp = absxi / scale; ssq += temp * temp; }
+
+      X  += INCX;
+   }
+   return( scale * sqrt( ssq ) );
+/*
+ * End of ATL_drefnrm2
+ */
+}
diff --git a/scikits/learn/src/cblas/cblas_dscal.c b/scikits/learn/src/cblas/cblas_dscal.c
new file mode 100644
index 0000000000..8d1e33b67b
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_dscal.c
@@ -0,0 +1,183 @@
+/* ---------------------------------------------------------------------
+ *
+ * -- Automatically Tuned Linear Algebra Software (ATLAS)
+ *    (C) Copyright 2000 All Rights Reserved
+ *
+ * -- ATLAS routine -- Version 3.2 -- December 25, 2000
+ *
+ * -- Suggestions,  comments,  bugs reports should be sent to the follo-
+ *    wing e-mail address: atlas@cs.utk.edu
+ *
+ * Author         : Antoine P. Petitet
+ * University of Tennessee - Innovative Computing Laboratory
+ * Knoxville TN, 37996-1301, USA.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * -- Copyright notice and Licensing terms:
+ *
+ *  Redistribution  and  use in  source and binary forms, with or without
+ *  modification, are  permitted provided  that the following  conditions
+ *  are met:
+ *
+ * 1. Redistributions  of  source  code  must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce  the above copyright
+ *    notice,  this list of conditions, and the  following disclaimer in
+ *    the documentation and/or other materials provided with the distri-
+ *    bution.
+ * 3. The name of the University,  the ATLAS group,  or the names of its
+ *    contributors  may not be used to endorse or promote products deri-
+ *    ved from this software without specific written permission.
+ *
+ * -- Disclaimer:
+ *
+ * THIS  SOFTWARE  IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,  INCLUDING,  BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  INDIRECT, INCIDENTAL, SPE-
+ * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO,  PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO-
+ * RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (IN-
+ * CLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * Include files
+ */
+#include "atlas_refmisc.h"
+
+void cblas_dscal
+(
+   const int                  N,
+   const double               ALPHA,
+   double                     * X,
+   const int                  INCX
+)
+{
+/*
+ * Purpose
+ * =======
+ *
+ * ATL_drefscal performs the following operation:
+ *
+ *    x := alpha * x,
+ *
+ * where alpha is a scalar and x is an n-vector.
+ *
+ * Arguments
+ * =========
+ *
+ * N       (input)                       const int
+ *         On entry, N specifies the length of the vector x. N  must  be
+ *         at least zero. Unchanged on exit.
+ *
+ * ALPHA   (input)                       const double
+ *         On entry, ALPHA specifies the scalar alpha.   When  ALPHA  is
+ *         supplied as zero, then the entries of the incremented array X
+ *         need not be set on input. Unchanged on exit.
+ *
+ * X       (input/output)                double *
+ *         On entry,  X  points to the  first entry to be accessed of an
+ *         incremented array of size equal to or greater than
+ *            ( 1 + ( n - 1 ) * abs( INCX ) ) * sizeof(   double  ),
+ *         that contains the vector x.  On exit,  the entries of the in-
+ *         cremented array X are mutiplied by alpha.
+ *
+ * INCX    (input)                       const int
+ *         On entry, INCX specifies the increment for the elements of X.
+ *         INCX must not be zero. Unchanged on exit.
+ *
+ * ---------------------------------------------------------------------
+ */
+/*
+ * .. Local Variables ..
+ */
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   register double            x0, x1, x2, x3, x4, x5, x6, x7;
+   register const double      alpha = ALPHA;
+   double                     * StX;
+   register int               i;
+   int                        nu;
+   const int                  incX2 = 2 * INCX, incX3 = 3 * INCX,
+                              incX4 = 4 * INCX, incX5 = 5 * INCX,
+                              incX6 = 6 * INCX, incX7 = 7 * INCX,
+                              incX8 = 8 * INCX;
+/* ..
+ * .. Executable Statements ..
+ *
+ */
+   if( ( N > 0 ) && ( alpha != ATL_dONE ) )
+   {
+      if( alpha == ATL_dZERO )
+      {
+         if( ( nu = ( N >> 3 ) << 3 ) != 0 )
+         {
+            StX = (double *)X + nu * INCX;
+
+            do
+            {
+               (*X)     = ATL_dZERO; X[incX4] = ATL_dZERO;
+               X[INCX ] = ATL_dZERO; X[incX5] = ATL_dZERO;
+               X[incX2] = ATL_dZERO; X[incX6] = ATL_dZERO;
+               X[incX3] = ATL_dZERO; X[incX7] = ATL_dZERO;
+
+               X  += incX8;
+
+            } while( X != StX );
+         }
+
+         for( i = N - nu; i != 0; i-- )
+         {
+            *X = ATL_dZERO;
+            X += INCX;
+         }
+      }
+      else
+      {
+         if( ( nu = ( N >> 3 ) << 3 ) != 0 )
+         {
+            StX = (double *)X + nu * INCX;
+
+            do
+            {
+               x0 = (*X);     x4 = X[incX4];
+               x1 = X[INCX ]; x5 = X[incX5];
+               x2 = X[incX2]; x6 = X[incX6];
+               x3 = X[incX3]; x7 = X[incX7];
+
+               x0 *= alpha;   x4 *= alpha;
+               x1 *= alpha;   x5 *= alpha;
+               x2 *= alpha;   x6 *= alpha;
+               x3 *= alpha;   x7 *= alpha;
+
+               (*X)     = x0; X[incX4] = x4;
+               X[INCX ] = x1; X[incX5] = x5;
+               X[incX2] = x2; X[incX6] = x6;
+               X[incX3] = x3; X[incX7] = x7;
+
+               X  += incX8;
+
+            } while( X != StX );
+         }
+
+         for( i = N - nu; i != 0; i-- )
+         {
+            x0  = (*X);
+            x0 *= alpha;
+            *X  = x0;
+            X  += INCX;
+         }
+      }
+   }
+/*
+ * End of ATL_drefscal
+ */
+}
diff --git a/scikits/learn/src/cblas/cblas_dtpsv.c b/scikits/learn/src/cblas/cblas_dtpsv.c
new file mode 100644
index 0000000000..9fb871ccee
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_dtpsv.c
@@ -0,0 +1,83 @@
+/*
+ *             Automatically Tuned Linear Algebra Software v3.6.0
+ *                    (C) Copyright 1999 R. Clint Whaley
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions, and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *   3. The name of the ATLAS group or the names of its contributers may
+ *      not be used to endorse or promote products derived from this
+ *      software without specific written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#define DREAL
+#include "atlas_refmisc.h"
+#include "cblas.h"
+#ifdef ATL_USEPTHREADS
+   #include "atlas_ptalias2.h"
+#endif
+#include "atlas_reflevel2.h"
+
+void cblas_dtpsv(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo,
+                 const enum CBLAS_TRANSPOSE TA, const enum CBLAS_DIAG Diag,
+                 const int N, const double *A, double *X, const int incX)
+{
+   int info = 2000;
+   enum CBLAS_UPLO uplo;
+   enum CBLAS_TRANSPOSE ta;
+   #define x X
+
+#ifndef NoCblasErrorChecks
+   if (Order != CblasColMajor && Order != CblasRowMajor)
+      info = cblas_errprn(1, info, "Order must be %d or %d, but is set to %d",
+                          CblasRowMajor, CblasColMajor, Order);
+   if (Uplo != CblasUpper && Uplo != CblasLower)
+      info = cblas_errprn(2, info, "UPLO must be %d or %d, but is set to %d",
+                          CblasUpper, CblasLower, Uplo);
+   if (TA != CblasNoTrans && TA != CblasTrans && TA != CblasConjTrans)
+      info = cblas_errprn(3, info,
+                          "TransA must be %d, %d or %d, but is set to %d",
+                          CblasNoTrans, CblasTrans, CblasConjTrans, TA);
+   if (Diag != CblasUnit && Diag != CblasNonUnit)
+      info = cblas_errprn(4, info, "DIAG must be %d or %d, but is set to %d",
+                          CblasUnit, CblasNonUnit, Diag);
+
+   if (N < 0) info = cblas_errprn(5, info,
+                        "N cannot be less than zero; is set to %d.", N);
+   if (!incX) info = cblas_errprn(8, info,
+                                  "incX cannot be zero; is set to %d.", incX);
+   if (info != 2000)
+   {
+      cblas_xerbla(info, "cblas_dtpsv", "");
+      return;
+   }
+#endif
+   if (incX < 0) x += (1-N)*incX;
+   if (Order == CblasColMajor)
+      ATL_dtpsv(Uplo, TA, Diag, N, A, x, incX);
+   else
+   {
+      uplo = ( (Uplo == CblasUpper) ? CblasLower : CblasUpper );
+      if (TA == CblasNoTrans) ta = CblasTrans;
+      else ta = CblasNoTrans;
+      ATL_dtpsv(uplo, ta, Diag, N, A, x, incX);
+   }
+}
diff --git a/scikits/learn/src/cblas/cblas_errprn.c b/scikits/learn/src/cblas/cblas_errprn.c
new file mode 100644
index 0000000000..3aa0cbb4d5
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_errprn.c
@@ -0,0 +1,50 @@
+/*
+ *             Automatically Tuned Linear Algebra Software v3.6.0
+ *                    (C) Copyright 1999 R. Clint Whaley
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions, and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *   3. The name of the ATLAS group or the names of its contributers may
+ *      not be used to endorse or promote products derived from this
+ *      software without specific written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include "atlas_refmisc.h"
+#ifdef ATL_USEPTHREADS
+   #include "atlas_ptalias3.h"
+#endif
+#include "cblas.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+int cblas_errprn(int ierr, int info, char *form, ...)
+{
+   va_list argptr;
+
+   va_start(argptr, form);
+#ifdef GCCWIN
+   vprintf(form, argptr);
+#else
+   vfprintf(stderr, form, argptr);
+#endif
+   va_end(argptr);
+   return(Mmin(ierr,info));
+}
diff --git a/scikits/learn/src/cblas/cblas_xerbla.c b/scikits/learn/src/cblas/cblas_xerbla.c
new file mode 100644
index 0000000000..7b68d1cff8
--- /dev/null
+++ b/scikits/learn/src/cblas/cblas_xerbla.c
@@ -0,0 +1,53 @@
+/*
+ *             Automatically Tuned Linear Algebra Software v3.6.0
+ *                    (C) Copyright 1999 R. Clint Whaley
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions, and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *   3. The name of the ATLAS group or the names of its contributers may
+ *      not be used to endorse or promote products derived from this
+ *      software without specific written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include "atlas_refmisc.h"
+#ifdef ATL_USEPTHREADS
+   #include "atlas_ptalias3.h"
+#endif
+#include "cblas.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+void cblas_xerbla(int p, char *rout, char *form, ...)
+{
+   va_list argptr;
+
+   va_start(argptr, form);
+#ifdef GCCWIN
+   if (p) printf("Parameter %d to routine %s was incorrect\n", p, rout);
+   vprintf(form, argptr);
+#else
+   if (p)
+      fprintf(stderr, "Parameter %d to routine %s was incorrect\n", p, rout);
+   vfprintf(stderr, form, argptr);
+#endif
+   va_end(argptr);
+   exit(-1);
+}
diff --git a/scikits/learn/src/minilearn.pyx b/scikits/learn/src/minilearn.pyx
new file mode 100644
index 0000000000..6c476e92e8
--- /dev/null
+++ b/scikits/learn/src/minilearn.pyx
@@ -0,0 +1,25 @@
+"""
+Wrapper for minilearn
+http://fabianp.github.com/minilearn/
+"""
+
+import numpy as np
+cimport numpy as np
+
+cdef extern from "minilearn.h":
+    void lars_fit (int, int, double *, double *, double *, int *, double *, int)
+    int RowMajorStrg
+
+def lars_fit_wrap (np.ndarray[np.float64_t, ndim=2, mode='c'] X,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] res,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] beta,
+                   np.ndarray[np.int32_t,   ndim=1, mode='c'] ind,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] chol,
+                   np.npy_intp niter):
+    """
+    res will be rewritten with the residual at output
+    """
+    lars_fit (<int> X.shape[1], <int> X.shape[0], <double *> X.data,
+              <double *> res.data, <double *> beta.data, <int *>
+              ind.data, <double *> chol.data, <int> niter)
+
diff --git a/scikits/learn/src/minilearn/lars.c b/scikits/learn/src/minilearn/lars.c
new file mode 100644
index 0000000000..3a3b2147b1
--- /dev/null
+++ b/scikits/learn/src/minilearn/lars.c
@@ -0,0 +1,240 @@
+/*
+ * Least-angle regression (LARS) is a regression algorithm for
+ * high-dimensional data, developed by Bradley Efron, Trevor Hastie,
+ * Iain Johnstone and Robert Tibshirani.
+ *
+ * The advantages of LARS are:
+ *
+ * - It is computationally just as fast as forward selection and has
+ *   the same order of complexity as an ordinary least squares.
+ *
+ * - It produces a full piecewise linear solution path, which is
+ *   useful in cross-validation or similar attempts to tune the model.
+ *
+ * - If two variables are almost equally correlated with the response,
+ *   then their coefficients should increase at approximately the same
+ *   rate. The algorithm thus behaves as intuition would expect, and
+ *   also is more stable.
+ *
+ * - It is easily modified to produce solutions for other estimators,
+ *   like the Lasso. We implement lasso in method lars_lasso_TODO
+ *
+ * - It is effective in contexts where p >> n (IE, when the number of
+ *   dimensions is significantly greater than the number of points)
+ *
+ * The disadvantages of the LARS method include:
+ *
+ * - Because LARS is based upon an iterative refitting of the
+ *   residuals, it would appear to be especially sensitive to the
+ *   effects of noise. This problem is discussed in detail by Weisberg
+ *   in the discussion section of the Efron et al. (2004) Annals of
+ *   Statistics article.
+ * 
+ *
+ * Dependencies
+ * ------------
+ * cblas
+ * 
+ * Author
+ * ------
+ * Fabian Pedregosa <fabian.pedregosa@inria.fr>.
+ *
+ * License
+ * -------
+ * Public Domain.
+ *
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <float.h>
+#include <cblas.h>
+#include "minilearn.h"
+
+/* 
+ * Doubly linked list structure, we will use this to iterate over
+ * indices.
+ */
+struct dllist {
+    double *ptr;
+    double cov; /* current covariance */
+    struct dllist *next;
+    struct dllist *prev;
+};
+
+
+/*
+ * Fit LARS algorithm.
+ *
+ * Parameters
+ * ----------
+ * predictors are expected to be normalized
+ *
+ *  X is (features, nsamples), b is (nsamples,1) 
+ *
+ * beta is the returned array with the parameters of the regression
+ * problem.
+ * 
+ * b will be modified to store the current residual.
+ *
+ * L will hold the cholesky decomposition.
+ * 
+ * TODO
+ * ----
+ * The case when two vectors have equal correlation.
+ *
+ * Notes
+ * -----
+ * Most iterations need only be done with indices in the active set
+ * (or in its complement), this limits the use of BLAS leves 2, 3.
+ *
+ * TODO
+ * ----
+ * Consider swapping columns/vector in the problem formulation, it
+ * should make vector multiplication faster.
+ *
+ */
+void lars_fit(int nfeatures, int nsamples, double *X, double *res, 
+              double *beta, int *ind, double *L, int niter)
+{
+    /* temp variables */
+    /* TODO: pass uu by reference */
+    double *uu  = (double *) calloc(nsamples, sizeof(double));
+
+    double *v, *dir, C, temp, gamma=0, tgamma, aj, Aa = 0;
+    int i, k, sum_k=0;
+
+    struct dllist *active_set, *head, *cur, *top_active;
+    struct dllist *pmax=NULL; /* current working variable */
+
+    active_set = (struct dllist *) malloc((nfeatures+1) * sizeof(struct dllist));
+
+    /* create index list as a circular doubly linked list */
+    for (i=0; i<=nfeatures; ++i) {
+        active_set[i].ptr = X + i;
+        active_set[i].next = active_set + i + 1;
+        active_set[i].prev = active_set + i - 1;
+    }
+
+    head = active_set + nfeatures;
+    head->next = active_set;
+    active_set->prev = head;
+
+    /* set sentinels */
+    top_active = NULL;
+    head->ptr = NULL;
+
+    /* main loop, we iterate over the user-suplied number of iterations */
+    for (k=0; k < niter; ++k) {
+
+        sum_k = k * (k+1) / 2;
+        v = L + sum_k;
+        dir = beta + sum_k;
+
+        /* 
+         * Update residual.
+         */
+        cblas_daxpy (nsamples, -gamma, uu, 1, res, 1);
+
+        /* calculate covariances (c_hat), and get maximum covariance (C_hat)*/
+        for (pmax=head->next, cur=head->next; cur->ptr; cur=cur->next) {
+            cur->cov = cblas_ddot (nsamples, cur->ptr, nfeatures, res, 1);
+            pmax = (fabs(cur->cov) > fabs(pmax->cov)) ? cur : pmax;
+        }
+
+        /* remove it from the unused set */
+        pmax->prev->next = pmax->next;
+        pmax->next->prev = pmax->prev;
+
+        /* push pmax into the active set */
+        pmax->prev = top_active;
+        top_active = pmax;
+
+        /* 
+         * Compute the least-squares direction of the coefficients.
+         */
+        temp = pmax->cov;
+
+        for (i=k, cur=top_active; cur; cur=cur->prev, --i) {
+            /*
+             * To update the cholesky decomposition, we need to compute
+             *
+             *                    v   = Xa' * cur
+             *                    dir = Xa' * res
+             *
+             * where res is the current residual and cur is the last
+             * vector to enter the active set.
+             *
+             * Covariances in the active set are kept tied and decreasing.
+             */
+            v[i] = cblas_ddot (nsamples, cur->ptr, nfeatures, 
+                               pmax->ptr, nfeatures);
+
+            temp = copysign(temp, cur->cov);
+            dir[i] = temp;
+        }
+
+        /*
+         * Compute least squares solution by the method of normal equations
+         * (Golub & Van Loan, 1996)
+         * 
+         * Update the cholesky decomposition of (Xa * Xa')
+         *
+         *          ( L   0 )
+         *   L  ->  (       )  , where L * w = v , z = ||u||
+         *          ( w   z )
+         *
+         * and u is the last vector added to the active set.
+         *
+         */
+        cblas_dtpsv (CblasRowMajor, CblasLower, CblasTrans, CblasNonUnit, 
+                     k, L, v, 1);
+
+        v[k] = sqrt(1 - cblas_ddot(k, v, 1, v, 1));
+
+        cblas_dtpsv (CblasRowMajor, CblasLower, CblasNoTrans, CblasNonUnit,
+                     k + 1, L, dir, 1);
+
+        cblas_dtpsv (CblasRowMajor, CblasLower, CblasTrans, CblasNonUnit,
+                     k + 1, L, dir, 1);
+
+        /* 
+         * Update uu with the current direction 
+         * uu = Xa' * dir
+         */
+        cblas_dscal (nfeatures, 0., uu, 1);
+        for (i=k, cur = top_active; cur; cur = cur->prev, --i)
+            cblas_daxpy (nsamples, dir[i], cur->ptr, nfeatures, uu, 1);
+        Aa = fabs (cblas_ddot (nsamples, top_active->ptr, nfeatures, uu, 1));
+        C  = fabs (pmax->cov);
+
+        /*
+         * Compute gamma.
+         */
+        gamma = DBL_MAX;
+        for (cur = head->next; cur->ptr; cur = cur->next) {
+            aj = cblas_ddot (nsamples, cur->ptr, nfeatures, uu, 1);
+
+            if (cur->cov > 0)
+                tgamma = (C - cur->cov) / (Aa - aj);
+            else
+                tgamma = (C + cur->cov) / (Aa + aj);
+
+            gamma = fmin(tgamma, gamma);
+        }
+
+	/* regularization for degenerate gamma = 0 case */
+	gamma += DBL_EPSILON;
+
+        /* 
+         * Set up return values.
+         * TODO: we should iterate over used_indices (for Lasso variant).
+         */
+        cblas_daxpy (k, 1./gamma, dir-k, 1, dir, 1);
+        cblas_dscal (k + 1, gamma, dir, 1);
+        ind[k] = (pmax->ptr - X);
+    }
+ 
+    free (active_set);
+    free (uu);
+}
diff --git a/scikits/learn/src/minilearn/minilearn.c b/scikits/learn/src/minilearn/minilearn.c
new file mode 100644
index 0000000000..48a6f2f623
--- /dev/null
+++ b/scikits/learn/src/minilearn/minilearn.c
@@ -0,0 +1,4752 @@
+/* Generated by Cython 0.12 on Tue Jun  8 15:14:04 2010 */
+
+#define PY_SSIZE_T_CLEAN
+#include "Python.h"
+#include "structmember.h"
+#ifndef Py_PYTHON_H
+    #error Python headers needed to compile C extensions, please install development version of Python.
+#else
+#ifndef PY_LONG_LONG
+  #define PY_LONG_LONG LONG_LONG
+#endif
+#ifndef DL_EXPORT
+  #define DL_EXPORT(t) t
+#endif
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
+  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#endif
+#if PY_VERSION_HEX < 0x02050000
+  typedef int Py_ssize_t;
+  #define PY_SSIZE_T_MAX INT_MAX
+  #define PY_SSIZE_T_MIN INT_MIN
+  #define PY_FORMAT_SIZE_T ""
+  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
+  #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)
+  #define PyNumber_Index(o)    PyNumber_Int(o)
+  #define PyIndex_Check(o)     PyNumber_Check(o)
+#endif
+#if PY_VERSION_HEX < 0x02060000
+  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
+  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
+  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
+  #define PyVarObject_HEAD_INIT(type, size) \
+          PyObject_HEAD_INIT(type) size,
+  #define PyType_Modified(t)
+
+  typedef struct {
+       void *buf;
+       PyObject *obj;
+       Py_ssize_t len;
+       Py_ssize_t itemsize;
+       int readonly;
+       int ndim;
+       char *format;
+       Py_ssize_t *shape;
+       Py_ssize_t *strides;
+       Py_ssize_t *suboffsets;
+       void *internal;
+  } Py_buffer;
+
+  #define PyBUF_SIMPLE 0
+  #define PyBUF_WRITABLE 0x0001
+  #define PyBUF_FORMAT 0x0004
+  #define PyBUF_ND 0x0008
+  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
+  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
+  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
+  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
+  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
+
+#endif
+#if PY_MAJOR_VERSION < 3
+  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
+#else
+  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define Py_TPFLAGS_CHECKTYPES 0
+  #define Py_TPFLAGS_HAVE_INDEX 0
+#endif
+#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
+  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define PyBaseString_Type            PyUnicode_Type
+  #define PyString_Type                PyUnicode_Type
+  #define PyString_CheckExact          PyUnicode_CheckExact
+#else
+  #define PyBytes_Type                 PyString_Type
+  #define PyBytes_CheckExact           PyString_CheckExact
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define PyInt_Type                   PyLong_Type
+  #define PyInt_Check(op)              PyLong_Check(op)
+  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
+  #define PyInt_FromString             PyLong_FromString
+  #define PyInt_FromUnicode            PyLong_FromUnicode
+  #define PyInt_FromLong               PyLong_FromLong
+  #define PyInt_FromSize_t             PyLong_FromSize_t
+  #define PyInt_FromSsize_t            PyLong_FromSsize_t
+  #define PyInt_AsLong                 PyLong_AsLong
+  #define PyInt_AS_LONG                PyLong_AS_LONG
+  #define PyInt_AsSsize_t              PyLong_AsSsize_t
+  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
+  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
+#else
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+#endif
+#if PY_MAJOR_VERSION >= 3
+  #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
+#endif
+#if !defined(WIN32) && !defined(MS_WINDOWS)
+  #ifndef __stdcall
+    #define __stdcall
+  #endif
+  #ifndef __cdecl
+    #define __cdecl
+  #endif
+  #ifndef __fastcall
+    #define __fastcall
+  #endif
+#else
+  #define _USE_MATH_DEFINES
+#endif
+#if PY_VERSION_HEX < 0x02050000
+  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
+  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
+  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
+#else
+  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
+  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
+  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
+#endif
+#if PY_VERSION_HEX < 0x02050000
+  #define __Pyx_NAMESTR(n) ((char *)(n))
+  #define __Pyx_DOCSTR(n)  ((char *)(n))
+#else
+  #define __Pyx_NAMESTR(n) (n)
+  #define __Pyx_DOCSTR(n)  (n)
+#endif
+#ifdef __cplusplus
+#define __PYX_EXTERN_C extern "C"
+#else
+#define __PYX_EXTERN_C extern
+#endif
+#include <math.h>
+#define __PYX_HAVE_API__minilearn
+#include "stdlib.h"
+#include "stdio.h"
+#include "numpy/arrayobject.h"
+#include "numpy/ufuncobject.h"
+#include "minilearn.h"
+
+#ifdef __GNUC__
+#define INLINE __inline__
+#elif _WIN32
+#define INLINE __inline
+#else
+#define INLINE 
+#endif
+
+typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
+
+
+/* Type Conversion Predeclarations */
+
+#if PY_MAJOR_VERSION < 3
+#define __Pyx_PyBytes_FromString          PyString_FromString
+#define __Pyx_PyBytes_FromStringAndSize   PyString_FromStringAndSize
+#define __Pyx_PyBytes_AsString            PyString_AsString
+#else
+#define __Pyx_PyBytes_FromString          PyBytes_FromString
+#define __Pyx_PyBytes_FromStringAndSize   PyBytes_FromStringAndSize
+#define __Pyx_PyBytes_AsString            PyBytes_AsString
+#endif
+
+#define __Pyx_PyBytes_FromUString(s)      __Pyx_PyBytes_FromString((char*)s)
+#define __Pyx_PyBytes_AsUString(s)        ((unsigned char*) __Pyx_PyBytes_AsString(s))
+
+#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
+static INLINE int __Pyx_PyObject_IsTrue(PyObject*);
+static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
+
+#if !defined(T_PYSSIZET)
+#if PY_VERSION_HEX < 0x02050000
+#define T_PYSSIZET T_INT
+#elif !defined(T_LONGLONG)
+#define T_PYSSIZET \
+        ((sizeof(Py_ssize_t) == sizeof(int))  ? T_INT  : \
+        ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1))
+#else
+#define T_PYSSIZET \
+        ((sizeof(Py_ssize_t) == sizeof(int))          ? T_INT      : \
+        ((sizeof(Py_ssize_t) == sizeof(long))         ? T_LONG     : \
+        ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))
+#endif
+#endif
+
+
+#if !defined(T_ULONGLONG)
+#define __Pyx_T_UNSIGNED_INT(x) \
+        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
+        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
+        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
+        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : -1))))
+#else
+#define __Pyx_T_UNSIGNED_INT(x) \
+        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
+        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
+        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
+        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : \
+        ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
+#endif
+#if !defined(T_LONGLONG)
+#define __Pyx_T_SIGNED_INT(x) \
+        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
+        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
+        ((sizeof(x) == sizeof(int))   ? T_INT : \
+        ((sizeof(x) == sizeof(long))  ? T_LONG : -1))))
+#else
+#define __Pyx_T_SIGNED_INT(x) \
+        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
+        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
+        ((sizeof(x) == sizeof(int))   ? T_INT : \
+        ((sizeof(x) == sizeof(long))  ? T_LONG : \
+        ((sizeof(x) == sizeof(PY_LONG_LONG))   ? T_LONGLONG : -1)))))
+#endif
+
+#define __Pyx_T_FLOATING(x) \
+        ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
+        ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
+
+#if !defined(T_SIZET)
+#if !defined(T_ULONGLONG)
+#define T_SIZET \
+        ((sizeof(size_t) == sizeof(unsigned int))  ? T_UINT  : \
+        ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1))
+#else
+#define T_SIZET \
+        ((sizeof(size_t) == sizeof(unsigned int))          ? T_UINT      : \
+        ((sizeof(size_t) == sizeof(unsigned long))         ? T_ULONG     : \
+        ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))
+#endif
+#endif
+
+static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
+static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
+
+#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
+
+
+#ifdef __GNUC__
+/* Test for GCC > 2.95 */
+#if __GNUC__ > 2 ||               (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) 
+#define likely(x)   __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#else /* __GNUC__ > 2 ... */
+#define likely(x)   (x)
+#define unlikely(x) (x)
+#endif /* __GNUC__ > 2 ... */
+#else /* __GNUC__ */
+#define likely(x)   (x)
+#define unlikely(x) (x)
+#endif /* __GNUC__ */
+    
+static PyObject *__pyx_m;
+static PyObject *__pyx_b;
+static PyObject *__pyx_empty_tuple;
+static PyObject *__pyx_empty_bytes;
+static int __pyx_lineno;
+static int __pyx_clineno = 0;
+static const char * __pyx_cfilenm= __FILE__;
+static const char *__pyx_filename;
+static const char **__pyx_f;
+
+
+#if !defined(CYTHON_CCOMPLEX)
+  #if defined(__cplusplus)
+    #define CYTHON_CCOMPLEX 1
+  #elif defined(_Complex_I)
+    #define CYTHON_CCOMPLEX 1
+  #else
+    #define CYTHON_CCOMPLEX 0
+  #endif
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    #include <complex>
+  #else
+    #include <complex.h>
+  #endif
+#endif
+
+typedef npy_int8 __pyx_t_5numpy_int8_t;
+
+typedef npy_int16 __pyx_t_5numpy_int16_t;
+
+typedef npy_int32 __pyx_t_5numpy_int32_t;
+
+typedef npy_int64 __pyx_t_5numpy_int64_t;
+
+typedef npy_uint8 __pyx_t_5numpy_uint8_t;
+
+typedef npy_uint16 __pyx_t_5numpy_uint16_t;
+
+typedef npy_uint32 __pyx_t_5numpy_uint32_t;
+
+typedef npy_uint64 __pyx_t_5numpy_uint64_t;
+
+typedef npy_float32 __pyx_t_5numpy_float32_t;
+
+typedef npy_float64 __pyx_t_5numpy_float64_t;
+
+typedef npy_long __pyx_t_5numpy_int_t;
+
+typedef npy_longlong __pyx_t_5numpy_long_t;
+
+typedef npy_intp __pyx_t_5numpy_intp_t;
+
+typedef npy_uintp __pyx_t_5numpy_uintp_t;
+
+typedef npy_ulong __pyx_t_5numpy_uint_t;
+
+typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+
+typedef npy_double __pyx_t_5numpy_float_t;
+
+typedef npy_double __pyx_t_5numpy_double_t;
+
+typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    typedef ::std::complex< float > __pyx_t_float_complex;
+  #else
+    typedef float _Complex __pyx_t_float_complex;
+  #endif
+#else
+    typedef struct { float real, imag; } __pyx_t_float_complex;
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    typedef ::std::complex< double > __pyx_t_double_complex;
+  #else
+    typedef double _Complex __pyx_t_double_complex;
+  #endif
+#else
+    typedef struct { double real, imag; } __pyx_t_double_complex;
+#endif
+
+/* Type declarations */
+
+typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
+
+typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
+
+typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
+
+typedef npy_cdouble __pyx_t_5numpy_complex_t;
+
+#ifndef CYTHON_REFNANNY
+  #define CYTHON_REFNANNY 0
+#endif
+
+#if CYTHON_REFNANNY
+  typedef struct {
+    void (*INCREF)(void*, PyObject*, int);
+    void (*DECREF)(void*, PyObject*, int);
+    void (*GOTREF)(void*, PyObject*, int);
+    void (*GIVEREF)(void*, PyObject*, int);
+    void* (*SetupContext)(const char*, int, const char*);
+    void (*FinishContext)(void**);
+  } __Pyx_RefNannyAPIStruct;
+  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
+  static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {
+    PyObject *m = NULL, *p = NULL;
+    void *r = NULL;
+    m = PyImport_ImportModule((char *)modname);
+    if (!m) goto end;
+    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
+    if (!p) goto end;
+    r = PyLong_AsVoidPtr(p);
+  end:
+    Py_XDECREF(p);
+    Py_XDECREF(m);
+    return (__Pyx_RefNannyAPIStruct *)r;
+  }
+  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+  #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)
+#else
+  #define __Pyx_RefNannySetupContext(name)
+  #define __Pyx_RefNannyFinishContext()
+  #define __Pyx_INCREF(r) Py_INCREF(r)
+  #define __Pyx_DECREF(r) Py_DECREF(r)
+  #define __Pyx_GOTREF(r)
+  #define __Pyx_GIVEREF(r)
+  #define __Pyx_XDECREF(r) Py_XDECREF(r)
+#endif /* CYTHON_REFNANNY */
+#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
+#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)
+
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name, PyObject* kw_name); /*proto*/
+
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
+
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+
+/* Run-time type information about structs used with buffers */
+struct __Pyx_StructField_;
+
+typedef struct {
+  const char* name; /* for error messages only */
+  struct __Pyx_StructField_* fields;
+  size_t size;     /* sizeof(type) */
+  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
+} __Pyx_TypeInfo;
+
+typedef struct __Pyx_StructField_ {
+  __Pyx_TypeInfo* type;
+  const char* name;
+  size_t offset;
+} __Pyx_StructField;
+
+typedef struct {
+  __Pyx_StructField* field;
+  size_t parent_offset;
+} __Pyx_BufFmt_StackElem;
+
+
+static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
+static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
+
+static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+
+static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
+
+static INLINE void __Pyx_RaiseTooManyValuesError(void);
+
+static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
+static int __Pyx_EndUnpack(PyObject *); /*proto*/
+
+static INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
+
+static INLINE void __Pyx_RaiseNoneNotIterableError(void);
+
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
+
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact); /*proto*/
+#if PY_MAJOR_VERSION < 3
+static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
+static void __Pyx_ReleaseBuffer(Py_buffer *view);
+#else
+#define __Pyx_GetBuffer PyObject_GetBuffer
+#define __Pyx_ReleaseBuffer PyBuffer_Release
+#endif
+
+Py_ssize_t __Pyx_zeros[] = {0, 0};
+Py_ssize_t __Pyx_minusones[] = {-1, -1};
+
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    #define __Pyx_CREAL(z) ((z).real())
+    #define __Pyx_CIMAG(z) ((z).imag())
+  #else
+    #define __Pyx_CREAL(z) (__real__(z))
+    #define __Pyx_CIMAG(z) (__imag__(z))
+  #endif
+#else
+    #define __Pyx_CREAL(z) ((z).real)
+    #define __Pyx_CIMAG(z) ((z).imag)
+#endif
+
+#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX
+    #define __Pyx_SET_CREAL(z,x) ((z).real(x))
+    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
+#else
+    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
+    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);
+  #else
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);
+  #endif
+#else
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);
+#endif
+
+#if CYTHON_CCOMPLEX
+    #define __Pyx_c_eqf(a, b)   ((a)==(b))
+    #define __Pyx_c_sumf(a, b)  ((a)+(b))
+    #define __Pyx_c_difff(a, b) ((a)-(b))
+    #define __Pyx_c_prodf(a, b) ((a)*(b))
+    #define __Pyx_c_quotf(a, b) ((a)/(b))
+    #define __Pyx_c_negf(a)     (-(a))
+  #ifdef __cplusplus
+    #define __Pyx_c_is_zerof(z) ((z)==(float)0)
+    #define __Pyx_c_conjf(z)    (::std::conj(z))
+    /*#define __Pyx_c_absf(z)     (::std::abs(z))*/
+  #else
+    #define __Pyx_c_is_zerof(z) ((z)==0)
+    #define __Pyx_c_conjf(z)    (conjf(z))
+    /*#define __Pyx_c_absf(z)     (cabsf(z))*/
+ #endif
+#else
+    static INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);
+    static INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);
+    static INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);
+    /*static INLINE float __Pyx_c_absf(__pyx_t_float_complex);*/
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);
+  #else
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);
+  #endif
+#else
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);
+#endif
+
+#if CYTHON_CCOMPLEX
+    #define __Pyx_c_eq(a, b)   ((a)==(b))
+    #define __Pyx_c_sum(a, b)  ((a)+(b))
+    #define __Pyx_c_diff(a, b) ((a)-(b))
+    #define __Pyx_c_prod(a, b) ((a)*(b))
+    #define __Pyx_c_quot(a, b) ((a)/(b))
+    #define __Pyx_c_neg(a)     (-(a))
+  #ifdef __cplusplus
+    #define __Pyx_c_is_zero(z) ((z)==(double)0)
+    #define __Pyx_c_conj(z)    (::std::conj(z))
+    /*#define __Pyx_c_abs(z)     (::std::abs(z))*/
+  #else
+    #define __Pyx_c_is_zero(z) ((z)==0)
+    #define __Pyx_c_conj(z)    (conj(z))
+    /*#define __Pyx_c_abs(z)     (cabs(z))*/
+ #endif
+#else
+    static INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);
+    static INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);
+    static INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);
+    /*static INLINE double __Pyx_c_abs(__pyx_t_double_complex);*/
+#endif
+
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+
+static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
+
+static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
+
+static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
+
+static INLINE char __Pyx_PyInt_AsChar(PyObject *);
+
+static INLINE short __Pyx_PyInt_AsShort(PyObject *);
+
+static INLINE int __Pyx_PyInt_AsInt(PyObject *);
+
+static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
+
+static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
+
+static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
+
+static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
+
+static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
+
+static INLINE long __Pyx_PyInt_AsLong(PyObject *);
+
+static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
+
+static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
+
+static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
+
+static INLINE npy_intp __Pyx_PyInt_from_py_npy_intp(PyObject *);
+
+static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size);  /*proto*/
+
+static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
+
+static void __Pyx_AddTraceback(const char *funcname); /*proto*/
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+/* Module declarations from python_buffer */
+
+/* Module declarations from python_ref */
+
+/* Module declarations from stdlib */
+
+/* Module declarations from stdio */
+
+/* Module declarations from numpy */
+
+/* Module declarations from numpy */
+
+static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
+static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
+static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
+static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
+static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
+static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
+static INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/
+static INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/
+/* Module declarations from minilearn */
+
+__PYX_EXTERN_C int RowMajorStrg;
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "numpy.float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), 'R' };
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "numpy.int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), 'I' };
+#define __Pyx_MODULE_NAME "minilearn"
+int __pyx_module_is_main_minilearn = 0;
+
+/* Implementation of minilearn */
+static PyObject *__pyx_builtin_ValueError;
+static PyObject *__pyx_builtin_range;
+static PyObject *__pyx_builtin_RuntimeError;
+static char __pyx_k_1[] = "ndarray is not C contiguous";
+static char __pyx_k_2[] = "ndarray is not Fortran contiguous";
+static char __pyx_k_3[] = "Non-native byte order not supported";
+static char __pyx_k_4[] = "unknown dtype code in numpy.pxd (%d)";
+static char __pyx_k_5[] = "Format string allocated too short, see comment in numpy.pxd";
+static char __pyx_k_6[] = "Format string allocated too short.";
+static char __pyx_k_7[] = "\nWrapper for minilearn\nhttp://fabianp.github.com/minilearn/\n";
+static char __pyx_k_8[] = "lars_fit_wrap (line 15)";
+static char __pyx_k__B[] = "B";
+static char __pyx_k__H[] = "H";
+static char __pyx_k__I[] = "I";
+static char __pyx_k__L[] = "L";
+static char __pyx_k__O[] = "O";
+static char __pyx_k__Q[] = "Q";
+static char __pyx_k__X[] = "X";
+static char __pyx_k__b[] = "b";
+static char __pyx_k__d[] = "d";
+static char __pyx_k__f[] = "f";
+static char __pyx_k__g[] = "g";
+static char __pyx_k__h[] = "h";
+static char __pyx_k__i[] = "i";
+static char __pyx_k__l[] = "l";
+static char __pyx_k__q[] = "q";
+static char __pyx_k__Zd[] = "Zd";
+static char __pyx_k__Zf[] = "Zf";
+static char __pyx_k__Zg[] = "Zg";
+static char __pyx_k__np[] = "np";
+static char __pyx_k__buf[] = "buf";
+static char __pyx_k__ind[] = "ind";
+static char __pyx_k__obj[] = "obj";
+static char __pyx_k__res[] = "res";
+static char __pyx_k__base[] = "base";
+static char __pyx_k__beta[] = "beta";
+static char __pyx_k__chol[] = "chol";
+static char __pyx_k__data[] = "data";
+static char __pyx_k__ndim[] = "ndim";
+static char __pyx_k__descr[] = "descr";
+static char __pyx_k__names[] = "names";
+static char __pyx_k__niter[] = "niter";
+static char __pyx_k__numpy[] = "numpy";
+static char __pyx_k__range[] = "range";
+static char __pyx_k__shape[] = "shape";
+static char __pyx_k__fields[] = "fields";
+static char __pyx_k__format[] = "format";
+static char __pyx_k__strides[] = "strides";
+static char __pyx_k____main__[] = "__main__";
+static char __pyx_k____test__[] = "__test__";
+static char __pyx_k__itemsize[] = "itemsize";
+static char __pyx_k__readonly[] = "readonly";
+static char __pyx_k__type_num[] = "type_num";
+static char __pyx_k__byteorder[] = "byteorder";
+static char __pyx_k__ValueError[] = "ValueError";
+static char __pyx_k__suboffsets[] = "suboffsets";
+static char __pyx_k__RuntimeError[] = "RuntimeError";
+static char __pyx_k__lars_fit_wrap[] = "lars_fit_wrap";
+static PyObject *__pyx_kp_u_1;
+static PyObject *__pyx_kp_u_2;
+static PyObject *__pyx_kp_u_3;
+static PyObject *__pyx_kp_u_4;
+static PyObject *__pyx_kp_u_5;
+static PyObject *__pyx_kp_u_6;
+static PyObject *__pyx_kp_u_8;
+static PyObject *__pyx_n_s__RuntimeError;
+static PyObject *__pyx_n_s__ValueError;
+static PyObject *__pyx_n_s__X;
+static PyObject *__pyx_n_s____main__;
+static PyObject *__pyx_n_s____test__;
+static PyObject *__pyx_n_s__base;
+static PyObject *__pyx_n_s__beta;
+static PyObject *__pyx_n_s__buf;
+static PyObject *__pyx_n_s__byteorder;
+static PyObject *__pyx_n_s__chol;
+static PyObject *__pyx_n_s__data;
+static PyObject *__pyx_n_s__descr;
+static PyObject *__pyx_n_s__fields;
+static PyObject *__pyx_n_s__format;
+static PyObject *__pyx_n_s__ind;
+static PyObject *__pyx_n_s__itemsize;
+static PyObject *__pyx_n_s__lars_fit_wrap;
+static PyObject *__pyx_n_s__names;
+static PyObject *__pyx_n_s__ndim;
+static PyObject *__pyx_n_s__niter;
+static PyObject *__pyx_n_s__np;
+static PyObject *__pyx_n_s__numpy;
+static PyObject *__pyx_n_s__obj;
+static PyObject *__pyx_n_s__range;
+static PyObject *__pyx_n_s__readonly;
+static PyObject *__pyx_n_s__res;
+static PyObject *__pyx_n_s__shape;
+static PyObject *__pyx_n_s__strides;
+static PyObject *__pyx_n_s__suboffsets;
+static PyObject *__pyx_n_s__type_num;
+static PyObject *__pyx_int_15;
+
+/* "/volatile/fabian/dev/scikit-learn/scikits/learn/src/minilearn/minilearn.pyx":15
+ * 
+ * 
+ * def lars_fit_wrap (np.ndarray[np.float64_t, ndim=2, mode='c'] X,             # <<<<<<<<<<<<<<
+ *                    np.ndarray[np.float64_t, ndim=1, mode='c'] res,
+ *                    np.ndarray[np.float64_t, ndim=1, mode='c'] beta,
+ */
+
+static PyObject *__pyx_pf_9minilearn_lars_fit_wrap(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_9minilearn_lars_fit_wrap[] = "\n    res will be rewritten with the residual at output\n    ";
+static PyObject *__pyx_pf_9minilearn_lars_fit_wrap(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyArrayObject *__pyx_v_X = 0;
+  PyArrayObject *__pyx_v_res = 0;
+  PyArrayObject *__pyx_v_beta = 0;
+  PyArrayObject *__pyx_v_ind = 0;
+  PyArrayObject *__pyx_v_chol = 0;
+  npy_intp __pyx_v_niter;
+  Py_buffer __pyx_bstruct_res;
+  Py_ssize_t __pyx_bstride_0_res = 0;
+  Py_ssize_t __pyx_bshape_0_res = 0;
+  Py_buffer __pyx_bstruct_chol;
+  Py_ssize_t __pyx_bstride_0_chol = 0;
+  Py_ssize_t __pyx_bshape_0_chol = 0;
+  Py_buffer __pyx_bstruct_beta;
+  Py_ssize_t __pyx_bstride_0_beta = 0;
+  Py_ssize_t __pyx_bshape_0_beta = 0;
+  Py_buffer __pyx_bstruct_ind;
+  Py_ssize_t __pyx_bstride_0_ind = 0;
+  Py_ssize_t __pyx_bshape_0_ind = 0;
+  Py_buffer __pyx_bstruct_X;
+  Py_ssize_t __pyx_bstride_0_X = 0;
+  Py_ssize_t __pyx_bstride_1_X = 0;
+  Py_ssize_t __pyx_bshape_0_X = 0;
+  Py_ssize_t __pyx_bshape_1_X = 0;
+  PyObject *__pyx_r = NULL;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__X,&__pyx_n_s__res,&__pyx_n_s__beta,&__pyx_n_s__ind,&__pyx_n_s__chol,&__pyx_n_s__niter,0};
+  __Pyx_RefNannySetupContext("lars_fit_wrap");
+  __pyx_self = __pyx_self;
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
+    PyObject* values[6] = {0,0,0,0,0,0};
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+      case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+      case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+      case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__res);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  2:
+      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__beta);
+      if (likely(values[2])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  3:
+      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ind);
+      if (likely(values[3])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  4:
+      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__chol);
+      if (likely(values[4])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  5:
+      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__niter);
+      if (likely(values[5])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "lars_fit_wrap") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    }
+    __pyx_v_X = ((PyArrayObject *)values[0]);
+    __pyx_v_res = ((PyArrayObject *)values[1]);
+    __pyx_v_beta = ((PyArrayObject *)values[2]);
+    __pyx_v_ind = ((PyArrayObject *)values[3]);
+    __pyx_v_chol = ((PyArrayObject *)values[4]);
+    __pyx_v_niter = __Pyx_PyInt_from_py_npy_intp(values[5]); if (unlikely((__pyx_v_niter == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_X = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 0));
+    __pyx_v_res = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 1));
+    __pyx_v_beta = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 2));
+    __pyx_v_ind = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 3));
+    __pyx_v_chol = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 4));
+    __pyx_v_niter = __Pyx_PyInt_from_py_npy_intp(PyTuple_GET_ITEM(__pyx_args, 5)); if (unlikely((__pyx_v_niter == (npy_intp)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("lars_fit_wrap", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("minilearn.lars_fit_wrap");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __pyx_bstruct_X.buf = NULL;
+  __pyx_bstruct_res.buf = NULL;
+  __pyx_bstruct_beta.buf = NULL;
+  __pyx_bstruct_ind.buf = NULL;
+  __pyx_bstruct_chol.buf = NULL;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_res), __pyx_ptype_5numpy_ndarray, 1, "res", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_beta), __pyx_ptype_5numpy_ndarray, 1, "beta", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_ind), __pyx_ptype_5numpy_ndarray, 1, "ind", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_chol), __pyx_ptype_5numpy_ndarray, 1, "chol", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_X = __pyx_bstruct_X.strides[0]; __pyx_bstride_1_X = __pyx_bstruct_X.strides[1];
+  __pyx_bshape_0_X = __pyx_bstruct_X.shape[0]; __pyx_bshape_1_X = __pyx_bstruct_X.shape[1];
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_res, (PyObject*)__pyx_v_res, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_res = __pyx_bstruct_res.strides[0];
+  __pyx_bshape_0_res = __pyx_bstruct_res.shape[0];
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_beta, (PyObject*)__pyx_v_beta, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_beta = __pyx_bstruct_beta.strides[0];
+  __pyx_bshape_0_beta = __pyx_bstruct_beta.shape[0];
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_ind, (PyObject*)__pyx_v_ind, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_ind = __pyx_bstruct_ind.strides[0];
+  __pyx_bshape_0_ind = __pyx_bstruct_ind.shape[0];
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_chol, (PyObject*)__pyx_v_chol, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_chol = __pyx_bstruct_chol.strides[0];
+  __pyx_bshape_0_chol = __pyx_bstruct_chol.shape[0];
+
+  /* "/volatile/fabian/dev/scikit-learn/scikits/learn/src/minilearn/minilearn.pyx":26
+ *     lars_fit (<int> X.shape[1], <int> X.shape[0], <double *> X.data,
+ *               <double *> res.data, <double *> beta.data, <int *>
+ *               ind.data, <double *> chol.data, <int> niter)             # <<<<<<<<<<<<<<
+ * 
+ */
+  lars_fit(((int)(__pyx_v_X->dimensions[1])), ((int)(__pyx_v_X->dimensions[0])), ((double *)__pyx_v_X->data), ((double *)__pyx_v_res->data), ((double *)__pyx_v_beta->data), ((int *)__pyx_v_ind->data), ((double *)__pyx_v_chol->data), ((int)__pyx_v_niter));
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
+    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_res);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_chol);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_beta);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_ind);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
+  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
+  __Pyx_AddTraceback("minilearn.lars_fit_wrap");
+  __pyx_r = NULL;
+  goto __pyx_L2;
+  __pyx_L0:;
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_res);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_chol);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_beta);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_ind);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
+  __pyx_L2:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":187
+ *         # experimental exception made for __getbuffer__ and __releasebuffer__
+ *         # -- the details of this may change.
+ *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
+ *             # This implementation of getbuffer is geared towards Cython
+ *             # requirements, and does not yet fullfill the PEP.
+ */
+
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_v_copy_shape;
+  int __pyx_v_i;
+  int __pyx_v_ndim;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  int __pyx_v_t;
+  char *__pyx_v_f;
+  PyArray_Descr *__pyx_v_descr = 0;
+  int __pyx_v_offset;
+  int __pyx_v_hasfields;
+  int __pyx_r;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  char *__pyx_t_9;
+  __Pyx_RefNannySetupContext("__getbuffer__");
+  if (__pyx_v_info == NULL) return 0;
+  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(__pyx_v_info->obj);
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":193
+ *             # of flags
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":194
+ *             cdef int copy_shape, i, ndim
+ *             cdef int endian_detector = 1
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ * 
+ *             ndim = PyArray_NDIM(self)
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":196
+ *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ * 
+ *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":198
+ *             ndim = PyArray_NDIM(self)
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 copy_shape = 1
+ *             else:
+ */
+  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":199
+ * 
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 copy_shape = 1             # <<<<<<<<<<<<<<
+ *             else:
+ *                 copy_shape = 0
+ */
+    __pyx_v_copy_shape = 1;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":201
+ *                 copy_shape = 1
+ *             else:
+ *                 copy_shape = 0             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ */
+    __pyx_v_copy_shape = 0;
+  }
+  __pyx_L5:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":203
+ *                 copy_shape = 0
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ */
+  __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":204
+ * 
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ */
+    __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
+    __pyx_t_3 = __pyx_t_2;
+  } else {
+    __pyx_t_3 = __pyx_t_1;
+  }
+  if (__pyx_t_3) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":205
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ */
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_1));
+    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_1));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_1));
+    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":207
+ *                 raise ValueError(u"ndarray is not C contiguous")
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ */
+  __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
+  if (__pyx_t_3) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":208
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ */
+    __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
+    __pyx_t_2 = __pyx_t_1;
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+  }
+  if (__pyx_t_2) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":209
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             info.buf = PyArray_DATA(self)
+ */
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_2));
+    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_2));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_2));
+    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L7;
+  }
+  __pyx_L7:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":211
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ * 
+ *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
+ *             info.ndim = ndim
+ *             if copy_shape:
+ */
+  __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":212
+ * 
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim             # <<<<<<<<<<<<<<
+ *             if copy_shape:
+ *                 # Allocate new buffer for strides and shape info. This is allocated
+ */
+  __pyx_v_info->ndim = __pyx_v_ndim;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":213
+ *             info.buf = PyArray_DATA(self)
+ *             info.ndim = ndim
+ *             if copy_shape:             # <<<<<<<<<<<<<<
+ *                 # Allocate new buffer for strides and shape info. This is allocated
+ *                 # as one block, strides first.
+ */
+  __pyx_t_6 = __pyx_v_copy_shape;
+  if (__pyx_t_6) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":216
+ *                 # Allocate new buffer for strides and shape info. This is allocated
+ *                 # as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":217
+ *                 # as one block, strides first.
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
+ *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ */
+    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":218
+ *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):             # <<<<<<<<<<<<<<
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ */
+    __pyx_t_6 = __pyx_v_ndim;
+    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
+      __pyx_v_i = __pyx_t_7;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":219
+ *                 info.shape = info.strides + ndim
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ */
+      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":220
+ *                 for i in range(ndim):
+ *                     info.strides[i] = PyArray_STRIDES(self)[i]
+ *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ */
+      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
+    }
+    goto __pyx_L8;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":222
+ *                     info.shape[i] = PyArray_DIMS(self)[i]
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ */
+    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":223
+ *             else:
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ */
+    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self)));
+  }
+  __pyx_L8:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":224
+ *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ */
+  __pyx_v_info->suboffsets = NULL;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":225
+ *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
+ *             info.readonly = not PyArray_ISWRITEABLE(self)
+ * 
+ */
+  __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":226
+ *             info.suboffsets = NULL
+ *             info.itemsize = PyArray_ITEMSIZE(self)
+ *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
+ * 
+ *             cdef int t
+ */
+  __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":229
+ * 
+ *             cdef int t
+ *             cdef char* f = NULL             # <<<<<<<<<<<<<<
+ *             cdef dtype descr = self.descr
+ *             cdef list stack
+ */
+  __pyx_v_f = NULL;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":230
+ *             cdef int t
+ *             cdef char* f = NULL
+ *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
+ *             cdef list stack
+ *             cdef int offset
+ */
+  __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
+  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":234
+ *             cdef int offset
+ * 
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields and not copy_shape:
+ */
+  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":236
+ *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
+ * 
+ *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
+ *                 # do not call releasebuffer
+ *                 info.obj = None
+ */
+  __pyx_t_2 = (!__pyx_v_hasfields);
+  if (__pyx_t_2) {
+    __pyx_t_3 = (!__pyx_v_copy_shape);
+    __pyx_t_1 = __pyx_t_3;
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+  }
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":238
+ *             if not hasfields and not copy_shape:
+ *                 # do not call releasebuffer
+ *                 info.obj = None             # <<<<<<<<<<<<<<
+ *             else:
+ *                 # need to call releasebuffer
+ */
+    __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = Py_None;
+    goto __pyx_L11;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":241
+ *             else:
+ *                 # need to call releasebuffer
+ *                 info.obj = self             # <<<<<<<<<<<<<<
+ * 
+ *             if not hasfields:
+ */
+    __Pyx_INCREF(__pyx_v_self);
+    __Pyx_GIVEREF(__pyx_v_self);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = __pyx_v_self;
+  }
+  __pyx_L11:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":243
+ *                 info.obj = self
+ * 
+ *             if not hasfields:             # <<<<<<<<<<<<<<
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == '>' and little_endian) or
+ */
+  __pyx_t_1 = (!__pyx_v_hasfields);
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":244
+ * 
+ *             if not hasfields:
+ *                 t = descr.type_num             # <<<<<<<<<<<<<<
+ *                 if ((descr.byteorder == '>' and little_endian) or
+ *                     (descr.byteorder == '<' and not little_endian)):
+ */
+    __pyx_v_t = __pyx_v_descr->type_num;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":245
+ *             if not hasfields:
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
+ *                     (descr.byteorder == '<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
+    if (__pyx_t_1) {
+      __pyx_t_2 = __pyx_v_little_endian;
+    } else {
+      __pyx_t_2 = __pyx_t_1;
+    }
+    if (!__pyx_t_2) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":246
+ *                 t = descr.type_num
+ *                 if ((descr.byteorder == '>' and little_endian) or
+ *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ */
+      __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
+      if (__pyx_t_1) {
+        __pyx_t_3 = (!__pyx_v_little_endian);
+        __pyx_t_8 = __pyx_t_3;
+      } else {
+        __pyx_t_8 = __pyx_t_1;
+      }
+      __pyx_t_1 = __pyx_t_8;
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+    }
+    if (__pyx_t_1) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":247
+ *                 if ((descr.byteorder == '>' and little_endian) or
+ *                     (descr.byteorder == '<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ */
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_3));
+      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_3));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_3));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_Raise(__pyx_t_5, 0, 0);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L13;
+    }
+    __pyx_L13:;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":248
+ *                     (descr.byteorder == '<' and not little_endian)):
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__b;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":249
+ *                     raise ValueError(u"Non-native byte order not supported")
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__B;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":250
+ *                 if   t == NPY_BYTE:        f = "b"
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__h;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":251
+ *                 elif t == NPY_UBYTE:       f = "B"
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__H;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":252
+ *                 elif t == NPY_SHORT:       f = "h"
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_INT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__i;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":253
+ *                 elif t == NPY_USHORT:      f = "H"
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_UINT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__I;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":254
+ *                 elif t == NPY_INT:         f = "i"
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_LONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__l;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":255
+ *                 elif t == NPY_UINT:        f = "I"
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__L;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":256
+ *                 elif t == NPY_LONG:        f = "l"
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__q;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":257
+ *                 elif t == NPY_ULONG:       f = "L"
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Q;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":258
+ *                 elif t == NPY_LONGLONG:    f = "q"
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__f;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":259
+ *                 elif t == NPY_ULONGLONG:   f = "Q"
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__d;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":260
+ *                 elif t == NPY_FLOAT:       f = "f"
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__g;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":261
+ *                 elif t == NPY_DOUBLE:      f = "d"
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zf;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":262
+ *                 elif t == NPY_LONGDOUBLE:  f = "g"
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zd;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":263
+ *                 elif t == NPY_CFLOAT:      f = "Zf"
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zg;
+      goto __pyx_L14;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":264
+ *                 elif t == NPY_CDOUBLE:     f = "Zd"
+ *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
+ *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+    __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__O;
+      goto __pyx_L14;
+    }
+    /*else*/ {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":266
+ *                 elif t == NPY_OBJECT:      f = "O"
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                 info.format = f
+ *                 return
+ */
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_4), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_4 = 0;
+      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_4, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_L14:;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":267
+ *                 else:
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f             # <<<<<<<<<<<<<<
+ *                 return
+ *             else:
+ */
+    __pyx_v_info->format = __pyx_v_f;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":268
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 info.format = f
+ *                 return             # <<<<<<<<<<<<<<
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ */
+    __pyx_r = 0;
+    goto __pyx_L0;
+    goto __pyx_L12;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":270
+ *                 return
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
+ *                 info.format[0] = '^' # Native data types, manual alignment
+ *                 offset = 0
+ */
+    __pyx_v_info->format = ((char *)malloc(255));
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":271
+ *             else:
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
+ *                 offset = 0
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ */
+    (__pyx_v_info->format[0]) = '^';
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":272
+ *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)
+ *                 info.format[0] = '^' # Native data types, manual alignment
+ *                 offset = 0             # <<<<<<<<<<<<<<
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ *                                       info.format + _buffer_format_string_len,
+ */
+    __pyx_v_offset = 0;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":275
+ *                 f = _util_dtypestring(descr, info.format + 1,
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)             # <<<<<<<<<<<<<<
+ *                 f[0] = 0 # Terminate format string
+ * 
+ */
+    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_9;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":276
+ *                                       info.format + _buffer_format_string_len,
+ *                                       &offset)
+ *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ */
+    (__pyx_v_f[0]) = 0;
+  }
+  __pyx_L12:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
+  __pyx_r = -1;
+  __Pyx_GOTREF(__pyx_v_info->obj);
+  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
+  goto __pyx_L2;
+  __pyx_L0:;
+  if (__pyx_v_info->obj == Py_None) {
+    __Pyx_GOTREF(Py_None);
+    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
+  }
+  __pyx_L2:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":278
+ *                 f[0] = 0 # Terminate format string
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ */
+
+static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
+static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("__releasebuffer__");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":279
+ * 
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ */
+  __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":280
+ *         def __releasebuffer__(ndarray self, Py_buffer* info):
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)
+ */
+    free(__pyx_v_info->format);
+    goto __pyx_L5;
+  }
+  __pyx_L5:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":281
+ *             if PyArray_HASFIELDS(self):
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
+ *                 stdlib.free(info.strides)
+ *                 # info.shape was stored after info.strides in the same block
+ */
+  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":282
+ *                 stdlib.free(info.format)
+ *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
+ *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
+ *                 # info.shape was stored after info.strides in the same block
+ * 
+ */
+    free(__pyx_v_info->strides);
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":755
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1");
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":756
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):
+ *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":758
+ *     return PyArray_MultiIterNew(1, <void*>a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2");
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":759
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":761
+ *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3");
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":762
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":764
+ *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4");
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":765
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":767
+ *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5");
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":768
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":770
+ *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
+ *     # Recursive utility function used in __getbuffer__ to get format
+ *     # string. The new location in the format string is returned.
+ */
+
+static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
+  PyArray_Descr *__pyx_v_child;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  PyObject *__pyx_v_fields;
+  PyObject *__pyx_v_childname;
+  PyObject *__pyx_v_new_offset;
+  PyObject *__pyx_v_t;
+  char *__pyx_r;
+  Py_ssize_t __pyx_t_1;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  int __pyx_t_8;
+  int __pyx_t_9;
+  char *__pyx_t_10;
+  __Pyx_RefNannySetupContext("_util_dtypestring");
+  __Pyx_INCREF((PyObject *)__pyx_v_descr);
+  __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);
+  __pyx_v_fields = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
+  __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":777
+ *     cdef int delta_offset
+ *     cdef tuple i
+ *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)
+ *     cdef tuple fields
+ */
+  __pyx_v_endian_detector = 1;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":778
+ *     cdef tuple i
+ *     cdef int endian_detector = 1
+ *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ *     cdef tuple fields
+ * 
+ */
+  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":781
+ *     cdef tuple fields
+ * 
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
+ */
+  if (likely(((PyObject *)__pyx_v_descr->names) != Py_None)) {
+    __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);
+  } else {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  for (;;) {
+    if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    __Pyx_DECREF(__pyx_v_childname);
+    __pyx_v_childname = __pyx_t_3;
+    __pyx_t_3 = 0;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":782
+ * 
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
+ *         child, new_offset = fields
+ * 
+ */
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(((PyObject *)__pyx_v_fields));
+    __pyx_v_fields = ((PyObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":783
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields             # <<<<<<<<<<<<<<
+ * 
+ *         if (end - f) - (new_offset - offset[0]) < 15:
+ */
+    if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {
+      PyObject* tuple = ((PyObject *)__pyx_v_fields);
+      __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);
+      __Pyx_DECREF(((PyObject *)__pyx_v_child));
+      __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_v_new_offset);
+      __pyx_v_new_offset = __pyx_t_4;
+      __pyx_t_4 = 0;
+    } else {
+      __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":785
+ *         child, new_offset = fields
+ * 
+ *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ */
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (__pyx_t_6) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":786
+ * 
+ *         if (end - f) - (new_offset - offset[0]) < 15:
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+ * 
+ *         if ((child.byteorder == '>' and little_endian) or
+ */
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_5));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
+      __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_3, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L5;
+    }
+    __pyx_L5:;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":788
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ * 
+ *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
+ *             (child.byteorder == '<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")
+ */
+    __pyx_t_6 = (__pyx_v_child->byteorder == '>');
+    if (__pyx_t_6) {
+      __pyx_t_7 = __pyx_v_little_endian;
+    } else {
+      __pyx_t_7 = __pyx_t_6;
+    }
+    if (!__pyx_t_7) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":789
+ * 
+ *         if ((child.byteorder == '>' and little_endian) or
+ *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
+ *             raise ValueError(u"Non-native byte order not supported")
+ *             # One could encode it in the format string and have Cython
+ */
+      __pyx_t_6 = (__pyx_v_child->byteorder == '<');
+      if (__pyx_t_6) {
+        __pyx_t_8 = (!__pyx_v_little_endian);
+        __pyx_t_9 = __pyx_t_8;
+      } else {
+        __pyx_t_9 = __pyx_t_6;
+      }
+      __pyx_t_6 = __pyx_t_9;
+    } else {
+      __pyx_t_6 = __pyx_t_7;
+    }
+    if (__pyx_t_6) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":790
+ *         if ((child.byteorder == '>' and little_endian) or
+ *             (child.byteorder == '<' and not little_endian)):
+ *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *             # One could encode it in the format string and have Cython
+ *             # complain instead, BUT: < and > in format strings also imply
+ */
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_3));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_3));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_5, 0, 0);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L6;
+    }
+    __pyx_L6:;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":800
+ * 
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ */
+    while (1) {
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (!__pyx_t_6) break;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":801
+ *         # Output padding bytes
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
+ *             f += 1
+ *             offset[0] += 1
+ */
+      (__pyx_v_f[0]) = 120;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":802
+ *         while offset[0] < new_offset:
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1             # <<<<<<<<<<<<<<
+ *             offset[0] += 1
+ * 
+ */
+      __pyx_v_f += 1;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":803
+ *             f[0] = 120 # "x"; pad byte
+ *             f += 1
+ *             offset[0] += 1             # <<<<<<<<<<<<<<
+ * 
+ *         offset[0] += child.itemsize
+ */
+      (__pyx_v_offset[0]) += 1;
+    }
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":805
+ *             offset[0] += 1
+ * 
+ *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ */
+    (__pyx_v_offset[0]) += __pyx_v_child->elsize;
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":807
+ *         offset[0] += child.itemsize
+ * 
+ *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
+ *             t = child.type_num
+ *             if end - f < 5:
+ */
+    __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));
+    if (__pyx_t_6) {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":808
+ * 
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num             # <<<<<<<<<<<<<<
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ */
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_v_t);
+      __pyx_v_t = __pyx_t_3;
+      __pyx_t_3 = 0;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":809
+ *         if not PyDataType_HASFIELDS(child):
+ *             t = child.type_num
+ *             if end - f < 5:             # <<<<<<<<<<<<<<
+ *                 raise RuntimeError(u"Format string allocated too short.")
+ * 
+ */
+      __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);
+      if (__pyx_t_6) {
+
+        /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":810
+ *             t = child.type_num
+ *             if end - f < 5:
+ *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ */
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
+        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_6));
+        __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
+        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_Raise(__pyx_t_5, 0, 0);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        goto __pyx_L10;
+      }
+      __pyx_L10:;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":813
+ * 
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 98;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":814
+ *             # Until ticket #99 is fixed, use integers to avoid warnings
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 66;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":815
+ *             if   t == NPY_BYTE:        f[0] =  98 #"b"
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 104;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":816
+ *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 72;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":817
+ *             elif t == NPY_SHORT:       f[0] = 104 #"h"
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 105;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":818
+ *             elif t == NPY_USHORT:      f[0] =  72 #"H"
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 73;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":819
+ *             elif t == NPY_INT:         f[0] = 105 #"i"
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 108;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":820
+ *             elif t == NPY_UINT:        f[0] =  73 #"I"
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 76;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":821
+ *             elif t == NPY_LONG:        f[0] = 108 #"l"
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 113;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":822
+ *             elif t == NPY_ULONG:       f[0] = 76  #"L"
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 81;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":823
+ *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 102;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":824
+ *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 100;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":825
+ *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 103;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":826
+ *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 102;
+        __pyx_v_f += 1;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":827
+ *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 100;
+        __pyx_v_f += 1;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":828
+ *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ */
+      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 90;
+        (__pyx_v_f[1]) = 103;
+        __pyx_v_f += 1;
+        goto __pyx_L11;
+      }
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":829
+ *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
+ *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ */
+      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
+        (__pyx_v_f[0]) = 79;
+        goto __pyx_L11;
+      }
+      /*else*/ {
+
+        /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":831
+ *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *             f += 1
+ *         else:
+ */
+        __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_4), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_Raise(__pyx_t_3, 0, 0);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      }
+      __pyx_L11:;
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":832
+ *             else:
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *             f += 1             # <<<<<<<<<<<<<<
+ *         else:
+ *             # Cython ignores struct boundary information ("T{...}"),
+ */
+      __pyx_v_f += 1;
+      goto __pyx_L9;
+    }
+    /*else*/ {
+
+      /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":836
+ *             # Cython ignores struct boundary information ("T{...}"),
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
+ *     return f
+ * 
+ */
+      __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_f = __pyx_t_10;
+    }
+    __pyx_L9:;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":837
+ *             # so don't output it
+ *             f = _util_dtypestring(child, f, end, offset)
+ *     return f             # <<<<<<<<<<<<<<
+ * 
+ * 
+ */
+  __pyx_r = __pyx_v_f;
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("numpy._util_dtypestring");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_child);
+  __Pyx_DECREF(__pyx_v_fields);
+  __Pyx_DECREF(__pyx_v_childname);
+  __Pyx_DECREF(__pyx_v_new_offset);
+  __Pyx_DECREF(__pyx_v_t);
+  __Pyx_DECREF((PyObject *)__pyx_v_descr);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":952
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+static INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
+  PyObject *__pyx_v_baseptr;
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("set_array_base");
+  __Pyx_INCREF((PyObject *)__pyx_v_arr);
+  __Pyx_INCREF(__pyx_v_base);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":954
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *      cdef PyObject* baseptr
+ *      if base is None:             # <<<<<<<<<<<<<<
+ *          baseptr = NULL
+ *      else:
+ */
+  __pyx_t_1 = (__pyx_v_base == Py_None);
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":955
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ *          baseptr = NULL             # <<<<<<<<<<<<<<
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ */
+    __pyx_v_baseptr = NULL;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":957
+ *          baseptr = NULL
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ */
+    Py_INCREF(__pyx_v_base);
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":958
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr
+ */
+    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
+  }
+  __pyx_L3:;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":959
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
+ *      arr.base = baseptr
+ * 
+ */
+  Py_XDECREF(__pyx_v_arr->base);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":960
+ *          baseptr = <PyObject*>base
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ */
+  __pyx_v_arr->base = __pyx_v_baseptr;
+
+  __Pyx_DECREF((PyObject *)__pyx_v_arr);
+  __Pyx_DECREF(__pyx_v_base);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":962
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+static INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("get_array_base");
+  __Pyx_INCREF((PyObject *)__pyx_v_arr);
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":963
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     else:
+ */
+  __pyx_t_1 = (__pyx_v_arr->base == NULL);
+  if (__pyx_t_1) {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":964
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:
+ *         return None             # <<<<<<<<<<<<<<
+ *     else:
+ *         return <object>arr.base
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_None);
+    __pyx_r = Py_None;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/numpy.pxd":966
+ *         return None
+ *     else:
+ *         return <object>arr.base             # <<<<<<<<<<<<<<
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
+    __pyx_r = ((PyObject *)__pyx_v_arr->base);
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_arr);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+static struct PyMethodDef __pyx_methods[] = {
+  {__Pyx_NAMESTR("lars_fit_wrap"), (PyCFunction)__pyx_pf_9minilearn_lars_fit_wrap, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_9minilearn_lars_fit_wrap)},
+  {0, 0, 0, 0}
+};
+
+static void __pyx_init_filenames(void); /*proto*/
+
+#if PY_MAJOR_VERSION >= 3
+static struct PyModuleDef __pyx_moduledef = {
+    PyModuleDef_HEAD_INIT,
+    __Pyx_NAMESTR("minilearn"),
+    __Pyx_DOCSTR(__pyx_k_7), /* m_doc */
+    -1, /* m_size */
+    __pyx_methods /* m_methods */,
+    NULL, /* m_reload */
+    NULL, /* m_traverse */
+    NULL, /* m_clear */
+    NULL /* m_free */
+};
+#endif
+
+static __Pyx_StringTabEntry __pyx_string_tab[] = {
+  {&__pyx_kp_u_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 1, 0, 0},
+  {&__pyx_kp_u_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 1, 0, 0},
+  {&__pyx_kp_u_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 1, 0, 0},
+  {&__pyx_kp_u_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 1, 0, 0},
+  {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0},
+  {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},
+  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},
+  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},
+  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},
+  {&__pyx_n_s__X, __pyx_k__X, sizeof(__pyx_k__X), 0, 0, 1, 1},
+  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
+  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
+  {&__pyx_n_s__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1},
+  {&__pyx_n_s__beta, __pyx_k__beta, sizeof(__pyx_k__beta), 0, 0, 1, 1},
+  {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1},
+  {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1},
+  {&__pyx_n_s__chol, __pyx_k__chol, sizeof(__pyx_k__chol), 0, 0, 1, 1},
+  {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1},
+  {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1},
+  {&__pyx_n_s__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 0, 0, 1, 1},
+  {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1},
+  {&__pyx_n_s__ind, __pyx_k__ind, sizeof(__pyx_k__ind), 0, 0, 1, 1},
+  {&__pyx_n_s__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1},
+  {&__pyx_n_s__lars_fit_wrap, __pyx_k__lars_fit_wrap, sizeof(__pyx_k__lars_fit_wrap), 0, 0, 1, 1},
+  {&__pyx_n_s__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1},
+  {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1},
+  {&__pyx_n_s__niter, __pyx_k__niter, sizeof(__pyx_k__niter), 0, 0, 1, 1},
+  {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},
+  {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},
+  {&__pyx_n_s__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 0, 0, 1, 1},
+  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},
+  {&__pyx_n_s__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1},
+  {&__pyx_n_s__res, __pyx_k__res, sizeof(__pyx_k__res), 0, 0, 1, 1},
+  {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},
+  {&__pyx_n_s__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1},
+  {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1},
+  {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 0, 0, 1, 1},
+  {0, 0, 0, 0, 0, 0, 0}
+};
+static int __Pyx_InitCachedBuiltins(void) {
+  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  return 0;
+  __pyx_L1_error:;
+  return -1;
+}
+
+static int __Pyx_InitGlobals(void) {
+  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  return 0;
+  __pyx_L1_error:;
+  return -1;
+}
+
+#if PY_MAJOR_VERSION < 3
+PyMODINIT_FUNC initminilearn(void); /*proto*/
+PyMODINIT_FUNC initminilearn(void)
+#else
+PyMODINIT_FUNC PyInit_minilearn(void); /*proto*/
+PyMODINIT_FUNC PyInit_minilearn(void)
+#endif
+{
+  PyObject *__pyx_t_1 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  #if CYTHON_REFNANNY
+  void* __pyx_refnanny = NULL;
+  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
+  if (!__Pyx_RefNanny) {
+      PyErr_Clear();
+      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
+      if (!__Pyx_RefNanny)
+          Py_FatalError("failed to import 'refnanny' module");
+  }
+  __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_minilearn(void)", __LINE__, __FILE__);
+  #endif
+  __pyx_init_filenames();
+  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if PY_MAJOR_VERSION < 3
+  __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #else
+  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
+  /*--- Library function declarations ---*/
+  /*--- Threads initialization code ---*/
+  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
+  #ifdef WITH_THREAD /* Python build with threading support? */
+  PyEval_InitThreads();
+  #endif
+  #endif
+  /*--- Module creation code ---*/
+  #if PY_MAJOR_VERSION < 3
+  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("minilearn"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_7), 0, PYTHON_API_VERSION);
+  #else
+  __pyx_m = PyModule_Create(&__pyx_moduledef);
+  #endif
+  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  #if PY_MAJOR_VERSION < 3
+  Py_INCREF(__pyx_m);
+  #endif
+  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
+  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  /*--- Initialize various global constants etc. ---*/
+  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__pyx_module_is_main_minilearn) {
+    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  }
+  /*--- Builtin init code ---*/
+  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  /*--- Global init code ---*/
+  /*--- Function export code ---*/
+  /*--- Type init code ---*/
+  /*--- Type import code ---*/
+  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr)); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject)); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject)); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject)); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject)); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  /*--- Function import code ---*/
+  /*--- Execution code ---*/
+
+  /* "/volatile/fabian/dev/scikit-learn/scikits/learn/src/minilearn/minilearn.pyx":6
+ * """
+ * 
+ * import numpy as np             # <<<<<<<<<<<<<<
+ * cimport numpy as np
+ * 
+ */
+  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
+  /* "/volatile/fabian/dev/scikit-learn/scikits/learn/src/minilearn/minilearn.pyx":1
+ * """             # <<<<<<<<<<<<<<
+ * Wrapper for minilearn
+ * http://fabianp.github.com/minilearn/
+ */
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_2 = PyObject_GetAttr(__pyx_m, __pyx_n_s__lars_fit_wrap); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_2, "__doc__");
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_kp_u_8), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+
+  /* "/usr/lib/python2.5/site-packages/Cython-0.12-py2.5-linux-i686.egg/Cython/Includes/stdlib.pxd":2
+ * 
+ * cdef extern from "stdlib.h" nogil:             # <<<<<<<<<<<<<<
+ *     void free(void *ptr)
+ *     void *malloc(size_t size)
+ */
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  if (__pyx_m) {
+    __Pyx_AddTraceback("init minilearn");
+    Py_DECREF(__pyx_m); __pyx_m = 0;
+  } else if (!PyErr_Occurred()) {
+    PyErr_SetString(PyExc_ImportError, "init minilearn");
+  }
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  #if PY_MAJOR_VERSION < 3
+  return;
+  #else
+  return __pyx_m;
+  #endif
+}
+
+static const char *__pyx_filenames[] = {
+  "minilearn.pyx",
+  "numpy.pxd",
+};
+
+/* Runtime support code */
+
+static void __pyx_init_filenames(void) {
+  __pyx_f = __pyx_filenames;
+}
+
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name,
+    PyObject* kw_name)
+{
+    PyErr_Format(PyExc_TypeError,
+        #if PY_MAJOR_VERSION >= 3
+        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
+        #else
+        "%s() got multiple values for keyword argument '%s'", func_name,
+        PyString_AS_STRING(kw_name));
+        #endif
+}
+
+static void __Pyx_RaiseArgtupleInvalid(
+    const char* func_name,
+    int exact,
+    Py_ssize_t num_min,
+    Py_ssize_t num_max,
+    Py_ssize_t num_found)
+{
+    Py_ssize_t num_expected;
+    const char *number, *more_or_less;
+
+    if (num_found < num_min) {
+        num_expected = num_min;
+        more_or_less = "at least";
+    } else {
+        num_expected = num_max;
+        more_or_less = "at most";
+    }
+    if (exact) {
+        more_or_less = "exactly";
+    }
+    number = (num_expected == 1) ? "" : "s";
+    PyErr_Format(PyExc_TypeError,
+        #if PY_VERSION_HEX < 0x02050000
+            "%s() takes %s %d positional argument%s (%d given)",
+        #else
+            "%s() takes %s %zd positional argument%s (%zd given)",
+        #endif
+        func_name, more_or_less, num_expected, number, num_found);
+}
+
+static int __Pyx_ParseOptionalKeywords(
+    PyObject *kwds,
+    PyObject **argnames[],
+    PyObject *kwds2,
+    PyObject *values[],
+    Py_ssize_t num_pos_args,
+    const char* function_name)
+{
+    PyObject *key = 0, *value = 0;
+    Py_ssize_t pos = 0;
+    PyObject*** name;
+    PyObject*** first_kw_arg = argnames + num_pos_args;
+
+    while (PyDict_Next(kwds, &pos, &key, &value)) {
+        name = first_kw_arg;
+        while (*name && (**name != key)) name++;
+        if (*name) {
+            values[name-argnames] = value;
+        } else {
+            #if PY_MAJOR_VERSION < 3
+            if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) {
+            #else
+            if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) {
+            #endif
+                goto invalid_keyword_type;
+            } else {
+                for (name = first_kw_arg; *name; name++) {
+                    #if PY_MAJOR_VERSION >= 3
+                    if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                        PyUnicode_Compare(**name, key) == 0) break;
+                    #else
+                    if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                        _PyString_Eq(**name, key)) break;
+                    #endif
+                }
+                if (*name) {
+                    values[name-argnames] = value;
+                } else {
+                    /* unexpected keyword found */
+                    for (name=argnames; name != first_kw_arg; name++) {
+                        if (**name == key) goto arg_passed_twice;
+                        #if PY_MAJOR_VERSION >= 3
+                        if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) &&
+                            PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice;
+                        #else
+                        if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) &&
+                            _PyString_Eq(**name, key)) goto arg_passed_twice;
+                        #endif
+                    }
+                    if (kwds2) {
+                        if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
+                    } else {
+                        goto invalid_keyword;
+                    }
+                }
+            }
+        }
+    }
+    return 0;
+arg_passed_twice:
+    __Pyx_RaiseDoubleKeywordsError(function_name, **name);
+    goto bad;
+invalid_keyword_type:
+    PyErr_Format(PyExc_TypeError,
+        "%s() keywords must be strings", function_name);
+    goto bad;
+invalid_keyword:
+    PyErr_Format(PyExc_TypeError,
+    #if PY_MAJOR_VERSION < 3
+        "%s() got an unexpected keyword argument '%s'",
+        function_name, PyString_AsString(key));
+    #else
+        "%s() got an unexpected keyword argument '%U'",
+        function_name, key);
+    #endif
+bad:
+    return -1;
+}
+
+static INLINE int __Pyx_IsLittleEndian(void) {
+  unsigned int n = 1;
+  return *(unsigned char*)(&n) != 0;
+}
+
+typedef struct {
+  __Pyx_StructField root;
+  __Pyx_BufFmt_StackElem* head;
+  size_t fmt_offset;
+  int new_count, enc_count;
+  int is_complex;
+  char enc_type;
+  char packmode;
+} __Pyx_BufFmt_Context;
+
+static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
+                              __Pyx_BufFmt_StackElem* stack,
+                              __Pyx_TypeInfo* type) {
+  stack[0].field = &ctx->root;
+  stack[0].parent_offset = 0;
+  ctx->root.type = type;
+  ctx->root.name = "buffer dtype";
+  ctx->root.offset = 0;
+  ctx->head = stack;
+  ctx->head->field = &ctx->root;
+  ctx->fmt_offset = 0;
+  ctx->head->parent_offset = 0;
+  ctx->packmode = '@';
+  ctx->new_count = 1;
+  ctx->enc_count = 0;
+  ctx->enc_type = 0;
+  ctx->is_complex = 0;
+  while (type->typegroup == 'S') {
+    ++ctx->head;
+    ctx->head->field = type->fields;
+    ctx->head->parent_offset = 0;
+    type = type->fields->type;
+  }
+}
+
+static int __Pyx_BufFmt_ParseNumber(const char** ts) {
+    int count;
+    const char* t = *ts;
+    if (*t < '0' || *t > '9') {
+      return -1;
+    } else {
+        count = *t++ - '0';
+        while (*t >= '0' && *t < '9') {
+            count *= 10;
+            count += *t++ - '0';
+        }
+    }
+    *ts = t;
+    return count;
+}
+
+static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) {
+  char msg[] = {ch, 0};
+  PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%s'", msg);
+}
+
+static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) {
+  switch (ch) {
+    case 'b': return "'char'";
+    case 'B': return "'unsigned char'";
+    case 'h': return "'short'";
+    case 'H': return "'unsigned short'";
+    case 'i': return "'int'";
+    case 'I': return "'unsigned int'";
+    case 'l': return "'long'";
+    case 'L': return "'unsigned long'";
+    case 'q': return "'long long'";
+    case 'Q': return "'unsigned long long'";
+    case 'f': return (is_complex ? "'complex float'" : "'float'");
+    case 'd': return (is_complex ? "'complex double'" : "'double'");
+    case 'g': return (is_complex ? "'complex long double'" : "'long double'");
+    case 'T': return "a struct";
+    case 'O': return "Python object";
+    case 'P': return "a pointer";
+    case 0: return "end";
+    default: return "unparseable format string";
+  }
+}
+
+static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) {
+  switch (ch) {
+    case '?': case 'c': case 'b': case 'B': return 1;
+    case 'h': case 'H': return 2;
+    case 'i': case 'I': case 'l': case 'L': return 4;
+    case 'q': case 'Q': return 8;
+    case 'f': return (is_complex ? 8 : 4);
+    case 'd': return (is_complex ? 16 : 8);
+    case 'g': {
+      PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g')..");
+      return 0;
+    }
+    case 'O': case 'P': return sizeof(void*);
+    default:
+      __Pyx_BufFmt_RaiseUnexpectedChar(ch);
+      return 0;
+    }
+}
+
+static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) {
+  switch (ch) {
+    case 'c': case 'b': case 'B': return 1;
+    case 'h': case 'H': return sizeof(short);
+    case 'i': case 'I': return sizeof(int);
+    case 'l': case 'L': return sizeof(long);
+    #ifdef HAVE_LONG_LONG
+    case 'q': case 'Q': return sizeof(PY_LONG_LONG);
+    #endif
+    case 'f': return sizeof(float) * (is_complex ? 2 : 1);
+    case 'd': return sizeof(double) * (is_complex ? 2 : 1);
+    case 'g': return sizeof(long double) * (is_complex ? 2 : 1);
+    case 'O': case 'P': return sizeof(void*);
+    default: {
+      __Pyx_BufFmt_RaiseUnexpectedChar(ch);
+      return 0;
+    }    
+  }
+}
+
+typedef struct { char c; short x; } __Pyx_st_short;
+typedef struct { char c; int x; } __Pyx_st_int;
+typedef struct { char c; long x; } __Pyx_st_long;
+typedef struct { char c; float x; } __Pyx_st_float;
+typedef struct { char c; double x; } __Pyx_st_double;
+typedef struct { char c; long double x; } __Pyx_st_longdouble;
+typedef struct { char c; void *x; } __Pyx_st_void_p;
+#ifdef HAVE_LONG_LONG
+typedef struct { char c; PY_LONG_LONG x; } __Pyx_s_long_long;
+#endif
+
+static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) {
+  switch (ch) {
+    case '?': case 'c': case 'b': case 'B': return 1;
+    case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short);
+    case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int);
+    case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long);
+#ifdef HAVE_LONG_LONG
+    case 'q': case 'Q': return sizeof(__Pyx_s_long_long) - sizeof(PY_LONG_LONG);
+#endif
+    case 'f': return sizeof(__Pyx_st_float) - sizeof(float);
+    case 'd': return sizeof(__Pyx_st_double) - sizeof(double);
+    case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double);
+    case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*);
+    default:
+      __Pyx_BufFmt_RaiseUnexpectedChar(ch);
+      return 0;
+    }
+}
+
+static size_t __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {
+  switch (ch) {
+    case 'c': case 'b': case 'h': case 'i': case 'l': case 'q': return 'I';
+    case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U';
+    case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R');
+    case 'O': return 'O';
+    case 'P': return 'P';
+    default: {
+      __Pyx_BufFmt_RaiseUnexpectedChar(ch);
+      return 0;
+    }    
+  }
+}
+
+static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {
+  if (ctx->head == NULL || ctx->head->field == &ctx->root) {
+    const char* expected;
+    const char* quote;
+    if (ctx->head == NULL) {
+      expected = "end";
+      quote = "";
+    } else {
+      expected = ctx->head->field->type->name;
+      quote = "'";
+    }
+    PyErr_Format(PyExc_ValueError,
+                 "Buffer dtype mismatch, expected %s%s%s but got %s",
+                 quote, expected, quote,
+                 __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex));
+  } else {
+    __Pyx_StructField* field = ctx->head->field;
+    __Pyx_StructField* parent = (ctx->head - 1)->field;
+    PyErr_Format(PyExc_ValueError,
+                 "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'",
+                 field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex),
+                 parent->type->name, field->name);
+  }
+}
+
+static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) {
+  char group;
+  size_t size, offset;
+  if (ctx->enc_type == 0) return 0;
+  group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex);
+  do {
+    __Pyx_StructField* field = ctx->head->field;
+    __Pyx_TypeInfo* type = field->type;
+  
+    if (ctx->packmode == '@' || ctx->packmode == '^') {
+      size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex);
+    } else {
+      size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex);
+    }
+    if (ctx->packmode == '@') {
+      int align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex);
+      int align_mod_offset;
+      if (align_at == 0) return -1;
+      align_mod_offset = ctx->fmt_offset % align_at;
+      if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset;
+    }
+
+    if (type->size != size || type->typegroup != group) {
+      if (type->typegroup == 'C' && type->fields != NULL) {
+        /* special case -- treat as struct rather than complex number */
+        size_t parent_offset = ctx->head->parent_offset + field->offset;
+        ++ctx->head;
+        ctx->head->field = type->fields;
+        ctx->head->parent_offset = parent_offset;
+        continue;
+      }
+    
+      __Pyx_BufFmt_RaiseExpected(ctx);
+      return -1;
+    }
+
+    offset = ctx->head->parent_offset + field->offset;
+    if (ctx->fmt_offset != offset) {
+      PyErr_Format(PyExc_ValueError,
+                   "Buffer dtype mismatch; next field is at offset %"PY_FORMAT_SIZE_T"d "
+                   "but %"PY_FORMAT_SIZE_T"d expected", ctx->fmt_offset, offset);
+      return -1;
+    }
+
+    ctx->fmt_offset += size;
+  
+    --ctx->enc_count; /* Consume from buffer string */
+
+    /* Done checking, move to next field, pushing or popping struct stack if needed */
+    while (1) {
+      if (field == &ctx->root) {
+        ctx->head = NULL;
+        if (ctx->enc_count != 0) {
+          __Pyx_BufFmt_RaiseExpected(ctx);
+          return -1;
+        }
+        break; /* breaks both loops as ctx->enc_count == 0 */
+      }
+      ctx->head->field = ++field;
+      if (field->type == NULL) {
+        --ctx->head;
+        field = ctx->head->field;
+        continue;
+      } else if (field->type->typegroup == 'S') {
+        size_t parent_offset = ctx->head->parent_offset + field->offset;
+        if (field->type->fields->type == NULL) continue; /* empty struct */
+        field = field->type->fields;
+        ++ctx->head;
+        ctx->head->field = field;
+        ctx->head->parent_offset = parent_offset;
+        break;
+      } else {
+        break;
+      }
+    }
+  } while (ctx->enc_count);
+  ctx->enc_type = 0;
+  ctx->is_complex = 0;
+  return 0;    
+}
+
+static int __Pyx_BufFmt_FirstPack(__Pyx_BufFmt_Context* ctx) {
+  if (ctx->enc_type != 0 || ctx->packmode != '@') {
+    PyErr_SetString(PyExc_ValueError, "Buffer packing mode currently only allowed at beginning of format string (this is a defect)");
+    return -1;
+  }
+  return 0;
+}
+
+static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) {
+  int got_Z = 0;
+  while (1) {
+    switch(*ts) {
+      case 0:
+        if (ctx->enc_type != 0 && ctx->head == NULL) {
+          __Pyx_BufFmt_RaiseExpected(ctx);
+          return NULL;
+        }
+        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;
+        if (ctx->head != NULL) {
+          __Pyx_BufFmt_RaiseExpected(ctx);
+          return NULL;
+        }
+        return ts;
+      case ' ':
+      case 10:
+      case 13:
+        ++ts;
+        break;
+      case '<':
+        if (!__Pyx_IsLittleEndian()) {
+          PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler");
+          return NULL;
+        }
+        if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL;
+        ctx->packmode = '=';
+        ++ts;
+        break;
+      case '>':
+      case '!':
+        if (__Pyx_IsLittleEndian()) {
+          PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler");
+          return NULL;
+        }
+        if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL;
+        ctx->packmode = '=';
+        ++ts;
+        break;
+      case '=':
+      case '@':
+      case '^':
+        if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL;
+        ctx->packmode = *ts++;
+        break;
+      case 'T': /* substruct */
+        {
+          int i;
+          const char* ts_after_sub;
+          int struct_count = ctx->new_count;
+          ctx->new_count = 1;
+          ++ts;
+          if (*ts != '{') {
+            PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'");
+            return NULL;
+          }
+          ++ts;
+          ts_after_sub = ts;
+          for (i = 0; i != struct_count; ++i) {
+            ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts);
+            if (!ts_after_sub) return NULL;
+          }
+          ts = ts_after_sub;
+        }
+        break;
+      case '}': /* end of substruct; either repeat or move on */
+        ++ts;
+        return ts;
+      case 'x':
+        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;
+        ctx->fmt_offset += ctx->new_count;
+        ctx->new_count = 1;
+        ctx->enc_count = 0;
+        ctx->enc_type = 0;
+        ++ts;
+        break;
+      case 'Z':
+        got_Z = 1;
+        ++ts;
+        if (*ts != 'f' && *ts != 'd' && *ts != 'g') {
+          __Pyx_BufFmt_RaiseUnexpectedChar('Z');
+          return NULL;
+        }        /* fall through */
+      case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I':
+      case 'l': case 'L': case 'q': case 'Q':
+      case 'f': case 'd': case 'g':
+      case 'O':
+        if (ctx->enc_type == *ts && got_Z == ctx->is_complex) {
+          /* Continue pooling same type */
+          ctx->enc_count += ctx->new_count;
+        } else {
+          /* New type */
+          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;
+          ctx->enc_count = ctx->new_count;
+          ctx->enc_type = *ts;
+          ctx->is_complex = got_Z;
+        }
+        ++ts;
+        ctx->new_count = 1;
+        got_Z = 0;
+        break;
+      default:
+        {
+          ctx->new_count = __Pyx_BufFmt_ParseNumber(&ts);
+          if (ctx->new_count == -1) { /* First char was not a digit */
+            char msg[2] = { *ts, 0 };
+            PyErr_Format(PyExc_ValueError,
+                         "Does not understand character buffer dtype format string ('%s')", msg);
+            return NULL;
+          }
+        }
+      
+    }
+  }
+}
+
+static INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
+  buf->buf = NULL;
+  buf->obj = NULL;
+  buf->strides = __Pyx_zeros;
+  buf->shape = __Pyx_zeros;
+  buf->suboffsets = __Pyx_minusones;
+}
+
+static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) {
+  if (obj == Py_None) {
+    __Pyx_ZeroBuffer(buf);
+    return 0;
+  }
+  buf->buf = NULL;
+  if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail;
+  if (buf->ndim != nd) {
+    PyErr_Format(PyExc_ValueError,
+                 "Buffer has wrong number of dimensions (expected %d, got %d)",
+                 nd, buf->ndim);
+    goto fail;
+  }
+  if (!cast) {
+    __Pyx_BufFmt_Context ctx;
+    __Pyx_BufFmt_Init(&ctx, stack, dtype);
+    if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail;
+  }
+  if ((unsigned)buf->itemsize != dtype->size) {
+    PyErr_Format(PyExc_ValueError,
+      "Item size of buffer (%"PY_FORMAT_SIZE_T"d byte%s) does not match size of '%s' (%"PY_FORMAT_SIZE_T"d byte%s)",
+      buf->itemsize, (buf->itemsize > 1) ? "s" : "",
+      dtype->name,
+      dtype->size, (dtype->size > 1) ? "s" : "");
+    goto fail;
+  }
+  if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones;
+  return 0;
+fail:;
+  __Pyx_ZeroBuffer(buf);
+  return -1;
+}
+
+static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
+  if (info->buf == NULL) return;
+  if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL;
+  __Pyx_ReleaseBuffer(info);
+}
+
+static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    PyThreadState *tstate = PyThreadState_GET();
+
+    tmp_type = tstate->curexc_type;
+    tmp_value = tstate->curexc_value;
+    tmp_tb = tstate->curexc_traceback;
+    tstate->curexc_type = type;
+    tstate->curexc_value = value;
+    tstate->curexc_traceback = tb;
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+}
+
+static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+    PyThreadState *tstate = PyThreadState_GET();
+    *type = tstate->curexc_type;
+    *value = tstate->curexc_value;
+    *tb = tstate->curexc_traceback;
+
+    tstate->curexc_type = 0;
+    tstate->curexc_value = 0;
+    tstate->curexc_traceback = 0;
+}
+
+
+static INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+    PyErr_Format(PyExc_ValueError,
+        #if PY_VERSION_HEX < 0x02050000
+                 "need more than %d value%s to unpack", (int)index,
+        #else
+                 "need more than %zd value%s to unpack", index,
+        #endif
+                 (index == 1) ? "" : "s");
+}
+
+static INLINE void __Pyx_RaiseTooManyValuesError(void) {
+    PyErr_SetString(PyExc_ValueError, "too many values to unpack");
+}
+
+static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
+    PyObject *item;
+    if (!(item = PyIter_Next(iter))) {
+        if (!PyErr_Occurred()) {
+            __Pyx_RaiseNeedMoreValuesError(index);
+        }
+    }
+    return item;
+}
+
+static int __Pyx_EndUnpack(PyObject *iter) {
+    PyObject *item;
+    if ((item = PyIter_Next(iter))) {
+        Py_DECREF(item);
+        __Pyx_RaiseTooManyValuesError();
+        return -1;
+    }
+    else if (!PyErr_Occurred())
+        return 0;
+    else
+        return -1;
+}
+
+static INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    if (unlikely(!type)) {
+        PyErr_Format(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (likely(PyObject_TypeCheck(obj, type)))
+        return 1;
+    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
+                 Py_TYPE(obj)->tp_name, type->tp_name);
+    return 0;
+}
+
+static INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError();
+    }
+}
+
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact)
+{
+    if (!type) {
+        PyErr_Format(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (none_allowed && obj == Py_None) return 1;
+    else if (exact) {
+        if (Py_TYPE(obj) == type) return 1;
+    }
+    else {
+        if (PyObject_TypeCheck(obj, type)) return 1;
+    }
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%s' has incorrect type (expected %s, got %s)",
+        name, type->tp_name, Py_TYPE(obj)->tp_name);
+    return 0;
+}
+
+#if PY_MAJOR_VERSION < 3
+static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
+  #if PY_VERSION_HEX >= 0x02060000
+  if (Py_TYPE(obj)->tp_flags & Py_TPFLAGS_HAVE_NEWBUFFER)
+      return PyObject_GetBuffer(obj, view, flags);
+  #endif
+  if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pf_5numpy_7ndarray___getbuffer__(obj, view, flags);
+  else {
+  PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name);
+  return -1;
+    }
+}
+
+static void __Pyx_ReleaseBuffer(Py_buffer *view) {
+  PyObject* obj = view->obj;
+  if (obj) {
+if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray___releasebuffer__(obj, view);
+    Py_DECREF(obj);
+    view->obj = NULL;
+  }
+}
+
+#endif
+
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
+    PyObject *__import__ = 0;
+    PyObject *empty_list = 0;
+    PyObject *module = 0;
+    PyObject *global_dict = 0;
+    PyObject *empty_dict = 0;
+    PyObject *list;
+    __import__ = __Pyx_GetAttrString(__pyx_b, "__import__");
+    if (!__import__)
+        goto bad;
+    if (from_list)
+        list = from_list;
+    else {
+        empty_list = PyList_New(0);
+        if (!empty_list)
+            goto bad;
+        list = empty_list;
+    }
+    global_dict = PyModule_GetDict(__pyx_m);
+    if (!global_dict)
+        goto bad;
+    empty_dict = PyDict_New();
+    if (!empty_dict)
+        goto bad;
+    module = PyObject_CallFunctionObjArgs(__import__,
+        name, global_dict, empty_dict, list, NULL);
+bad:
+    Py_XDECREF(empty_list);
+    Py_XDECREF(__import__);
+    Py_XDECREF(empty_dict);
+    return module;
+}
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      return ::std::complex< float >(x, y);
+    }
+  #else
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      return x + y*(__pyx_t_float_complex)_Complex_I;
+    }
+  #endif
+#else
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      __pyx_t_float_complex z;
+       z.real = x;
+       z.imag = y;
+       return z;
+    }
+#endif
+
+#if CYTHON_CCOMPLEX
+#else
+    static INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+       return (a.real == b.real) && (a.imag == b.imag);
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        float denom = b.real * b.real + b.imag * b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {
+        __pyx_t_float_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+    static INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {
+       return (a.real == 0) && (a.imag == 0);
+    }
+    static INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {
+        __pyx_t_float_complex z;
+        z.real =  a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+/*
+    static INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {
+#if HAVE_HYPOT
+        return hypotf(z.real, z.imag);
+#else
+        return sqrtf(z.real*z.real + z.imag*z.imag);
+#endif
+    }
+*/
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      return ::std::complex< double >(x, y);
+    }
+  #else
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      return x + y*(__pyx_t_double_complex)_Complex_I;
+    }
+  #endif
+#else
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      __pyx_t_double_complex z;
+       z.real = x;
+       z.imag = y;
+       return z;
+    }
+#endif
+
+#if CYTHON_CCOMPLEX
+#else
+    static INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+       return (a.real == b.real) && (a.imag == b.imag);
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        double denom = b.real * b.real + b.imag * b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {
+        __pyx_t_double_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+    static INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {
+       return (a.real == 0) && (a.imag == 0);
+    }
+    static INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {
+        __pyx_t_double_complex z;
+        z.real =  a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+/*
+    static INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {
+#if HAVE_HYPOT
+        return hypot(z.real, z.imag);
+#else
+        return sqrt(z.real*z.real + z.imag*z.imag);
+#endif
+    }
+*/
+#endif
+
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
+    PyObject *result;
+    result = PyObject_GetAttr(dict, name);
+    if (!result)
+        PyErr_SetObject(PyExc_NameError, name);
+    return result;
+}
+
+#if PY_MAJOR_VERSION < 3
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
+    Py_XINCREF(type);
+    Py_XINCREF(value);
+    Py_XINCREF(tb);
+    /* First, check the traceback argument, replacing None with NULL. */
+    if (tb == Py_None) {
+        Py_DECREF(tb);
+        tb = 0;
+    }
+    else if (tb != NULL && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto raise_error;
+    }
+    /* Next, replace a missing value with None */
+    if (value == NULL) {
+        value = Py_None;
+        Py_INCREF(value);
+    }
+    #if PY_VERSION_HEX < 0x02050000
+    if (!PyClass_Check(type))
+    #else
+    if (!PyType_Check(type))
+    #endif
+    {
+        /* Raising an instance.  The value should be a dummy. */
+        if (value != Py_None) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto raise_error;
+        }
+        /* Normalize to raise <class>, <instance> */
+        Py_DECREF(value);
+        value = type;
+        #if PY_VERSION_HEX < 0x02050000
+            if (PyInstance_Check(type)) {
+                type = (PyObject*) ((PyInstanceObject*)type)->in_class;
+                Py_INCREF(type);
+            }
+            else {
+                type = 0;
+                PyErr_SetString(PyExc_TypeError,
+                    "raise: exception must be an old-style class or instance");
+                goto raise_error;
+            }
+        #else
+            type = (PyObject*) Py_TYPE(type);
+            Py_INCREF(type);
+            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
+                PyErr_SetString(PyExc_TypeError,
+                    "raise: exception class must be a subclass of BaseException");
+                goto raise_error;
+            }
+        #endif
+    }
+
+    __Pyx_ErrRestore(type, value, tb);
+    return;
+raise_error:
+    Py_XDECREF(value);
+    Py_XDECREF(type);
+    Py_XDECREF(tb);
+    return;
+}
+
+#else /* Python 3+ */
+
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
+    if (tb == Py_None) {
+        tb = 0;
+    } else if (tb && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto bad;
+    }
+    if (value == Py_None)
+        value = 0;
+
+    if (PyExceptionInstance_Check(type)) {
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto bad;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(value);
+    } else if (!PyExceptionClass_Check(type)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: exception class must be a subclass of BaseException");
+        goto bad;
+    }
+
+    PyErr_SetObject(type, value);
+
+    if (tb) {
+        PyThreadState *tstate = PyThreadState_GET();
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
+    }
+
+bad:
+    return;
+}
+#endif
+
+static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
+    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(unsigned char) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(unsigned char)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned char" :
+                    "value too large to convert to unsigned char");
+            }
+            return (unsigned char)-1;
+        }
+        return (unsigned char)val;
+    }
+    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
+}
+
+static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
+    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(unsigned short) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(unsigned short)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned short" :
+                    "value too large to convert to unsigned short");
+            }
+            return (unsigned short)-1;
+        }
+        return (unsigned short)val;
+    }
+    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
+}
+
+static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
+    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(unsigned int) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(unsigned int)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned int" :
+                    "value too large to convert to unsigned int");
+            }
+            return (unsigned int)-1;
+        }
+        return (unsigned int)val;
+    }
+    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
+}
+
+static INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
+    const char neg_one = (char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(char) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(char)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to char" :
+                    "value too large to convert to char");
+            }
+            return (char)-1;
+        }
+        return (char)val;
+    }
+    return (char)__Pyx_PyInt_AsLong(x);
+}
+
+static INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
+    const short neg_one = (short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(short) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(short)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to short" :
+                    "value too large to convert to short");
+            }
+            return (short)-1;
+        }
+        return (short)val;
+    }
+    return (short)__Pyx_PyInt_AsLong(x);
+}
+
+static INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
+    const int neg_one = (int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(int) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(int)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to int" :
+                    "value too large to convert to int");
+            }
+            return (int)-1;
+        }
+        return (int)val;
+    }
+    return (int)__Pyx_PyInt_AsLong(x);
+}
+
+static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
+    const signed char neg_one = (signed char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(signed char) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(signed char)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed char" :
+                    "value too large to convert to signed char");
+            }
+            return (signed char)-1;
+        }
+        return (signed char)val;
+    }
+    return (signed char)__Pyx_PyInt_AsSignedLong(x);
+}
+
+static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
+    const signed short neg_one = (signed short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(signed short) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(signed short)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed short" :
+                    "value too large to convert to signed short");
+            }
+            return (signed short)-1;
+        }
+        return (signed short)val;
+    }
+    return (signed short)__Pyx_PyInt_AsSignedLong(x);
+}
+
+static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
+    const signed int neg_one = (signed int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(signed int) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(signed int)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed int" :
+                    "value too large to convert to signed int");
+            }
+            return (signed int)-1;
+        }
+        return (signed int)val;
+    }
+    return (signed int)__Pyx_PyInt_AsSignedLong(x);
+}
+
+static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
+    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to unsigned long");
+            return (unsigned long)-1;
+        }
+        return (unsigned long)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to unsigned long");
+                return (unsigned long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
+        }
+    } else {
+        unsigned long val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (unsigned long)-1;
+        val = __Pyx_PyInt_AsUnsignedLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
+    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to unsigned PY_LONG_LONG");
+            return (unsigned PY_LONG_LONG)-1;
+        }
+        return (unsigned PY_LONG_LONG)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to unsigned PY_LONG_LONG");
+                return (unsigned PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
+        }
+    } else {
+        unsigned PY_LONG_LONG val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (unsigned PY_LONG_LONG)-1;
+        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
+    const long neg_one = (long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to long");
+            return (long)-1;
+        }
+        return (long)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to long");
+                return (long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
+        }
+    } else {
+        long val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (long)-1;
+        val = __Pyx_PyInt_AsLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
+    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to PY_LONG_LONG");
+            return (PY_LONG_LONG)-1;
+        }
+        return (PY_LONG_LONG)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to PY_LONG_LONG");
+                return (PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
+        }
+    } else {
+        PY_LONG_LONG val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (PY_LONG_LONG)-1;
+        val = __Pyx_PyInt_AsLongLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
+    const signed long neg_one = (signed long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to signed long");
+            return (signed long)-1;
+        }
+        return (signed long)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to signed long");
+                return (signed long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
+        }
+    } else {
+        signed long val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (signed long)-1;
+        val = __Pyx_PyInt_AsSignedLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
+    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+#if PY_VERSION_HEX < 0x03000000
+    if (likely(PyInt_Check(x))) {
+        long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to signed PY_LONG_LONG");
+            return (signed PY_LONG_LONG)-1;
+        }
+        return (signed PY_LONG_LONG)val;
+    } else
+#endif
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to signed PY_LONG_LONG");
+                return (signed PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
+        }
+    } else {
+        signed PY_LONG_LONG val;
+        PyObject *tmp = __Pyx_PyNumber_Int(x);
+        if (!tmp) return (signed PY_LONG_LONG)-1;
+        val = __Pyx_PyInt_AsSignedLongLong(tmp);
+        Py_DECREF(tmp);
+        return val;
+    }
+}
+
+static INLINE npy_intp __Pyx_PyInt_from_py_npy_intp(PyObject* x) {
+    const npy_intp neg_one = (npy_intp)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(npy_intp) == sizeof(char)) {
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedChar(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedChar(x);
+    } else if (sizeof(npy_intp) == sizeof(short)) {
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedShort(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedShort(x);
+    } else if (sizeof(npy_intp) == sizeof(int)) {
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedInt(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedInt(x);
+    } else if (sizeof(npy_intp) == sizeof(long)) {
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedLong(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedLong(x);
+    } else if (sizeof(npy_intp) == sizeof(PY_LONG_LONG)) {
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedLongLong(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedLongLong(x);
+#if 0
+    } else if (sizeof(npy_intp) > sizeof(short) &&
+               sizeof(npy_intp) < sizeof(int)) { /*  __int32 ILP64 ? */
+        if (is_unsigned)
+            return (npy_intp)__Pyx_PyInt_AsUnsignedInt(x);
+        else
+            return (npy_intp)__Pyx_PyInt_AsSignedInt(x);
+#endif
+    }
+    PyErr_SetString(PyExc_TypeError, "npy_intp");
+    return (npy_intp)-1;
+}
+
+#ifndef __PYX_HAVE_RT_ImportType
+#define __PYX_HAVE_RT_ImportType
+static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,
+    long size)
+{
+    PyObject *py_module = 0;
+    PyObject *result = 0;
+    PyObject *py_name = 0;
+
+    py_module = __Pyx_ImportModule(module_name);
+    if (!py_module)
+        goto bad;
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(class_name);
+    #else
+    py_name = PyUnicode_FromString(class_name);
+    #endif
+    if (!py_name)
+        goto bad;
+    result = PyObject_GetAttr(py_module, py_name);
+    Py_DECREF(py_name);
+    py_name = 0;
+    Py_DECREF(py_module);
+    py_module = 0;
+    if (!result)
+        goto bad;
+    if (!PyType_Check(result)) {
+        PyErr_Format(PyExc_TypeError, 
+            "%s.%s is not a type object",
+            module_name, class_name);
+        goto bad;
+    }
+    if (((PyTypeObject *)result)->tp_basicsize != size) {
+        PyErr_Format(PyExc_ValueError, 
+            "%s.%s does not appear to be the correct type object",
+            module_name, class_name);
+        goto bad;
+    }
+    return (PyTypeObject *)result;
+bad:
+    Py_XDECREF(py_module);
+    Py_XDECREF(result);
+    return 0;
+}
+#endif
+
+#ifndef __PYX_HAVE_RT_ImportModule
+#define __PYX_HAVE_RT_ImportModule
+static PyObject *__Pyx_ImportModule(const char *name) {
+    PyObject *py_name = 0;
+    PyObject *py_module = 0;
+
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(name);
+    #else
+    py_name = PyUnicode_FromString(name);
+    #endif
+    if (!py_name)
+        goto bad;
+    py_module = PyImport_Import(py_name);
+    Py_DECREF(py_name);
+    return py_module;
+bad:
+    Py_XDECREF(py_name);
+    return 0;
+}
+#endif
+
+#include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+
+static void __Pyx_AddTraceback(const char *funcname) {
+    PyObject *py_srcfile = 0;
+    PyObject *py_funcname = 0;
+    PyObject *py_globals = 0;
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+
+    #if PY_MAJOR_VERSION < 3
+    py_srcfile = PyString_FromString(__pyx_filename);
+    #else
+    py_srcfile = PyUnicode_FromString(__pyx_filename);
+    #endif
+    if (!py_srcfile) goto bad;
+    if (__pyx_clineno) {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        #else
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno);
+        #endif
+    }
+    else {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromString(funcname);
+        #else
+        py_funcname = PyUnicode_FromString(funcname);
+        #endif
+    }
+    if (!py_funcname) goto bad;
+    py_globals = PyModule_GetDict(__pyx_m);
+    if (!py_globals) goto bad;
+    py_code = PyCode_New(
+        0,            /*int argcount,*/
+        #if PY_MAJOR_VERSION >= 3
+        0,            /*int kwonlyargcount,*/
+        #endif
+        0,            /*int nlocals,*/
+        0,            /*int stacksize,*/
+        0,            /*int flags,*/
+        __pyx_empty_bytes, /*PyObject *code,*/
+        __pyx_empty_tuple,  /*PyObject *consts,*/
+        __pyx_empty_tuple,  /*PyObject *names,*/
+        __pyx_empty_tuple,  /*PyObject *varnames,*/
+        __pyx_empty_tuple,  /*PyObject *freevars,*/
+        __pyx_empty_tuple,  /*PyObject *cellvars,*/
+        py_srcfile,   /*PyObject *filename,*/
+        py_funcname,  /*PyObject *name,*/
+        __pyx_lineno,   /*int firstlineno,*/
+        __pyx_empty_bytes  /*PyObject *lnotab*/
+    );
+    if (!py_code) goto bad;
+    py_frame = PyFrame_New(
+        PyThreadState_GET(), /*PyThreadState *tstate,*/
+        py_code,             /*PyCodeObject *code,*/
+        py_globals,          /*PyObject *globals,*/
+        0                    /*PyObject *locals*/
+    );
+    if (!py_frame) goto bad;
+    py_frame->f_lineno = __pyx_lineno;
+    PyTraceBack_Here(py_frame);
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    Py_XDECREF(py_code);
+    Py_XDECREF(py_frame);
+}
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
+    while (t->p) {
+        #if PY_MAJOR_VERSION < 3
+        if (t->is_unicode) {
+            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
+        } else if (t->intern) {
+            *t->p = PyString_InternFromString(t->s);
+        } else {
+            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
+        }
+        #else  /* Python 3+ has unicode identifiers */
+        if (t->is_unicode | t->is_str) {
+            if (t->intern) {
+                *t->p = PyUnicode_InternFromString(t->s);
+            } else if (t->encoding) {
+                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
+            } else {
+                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
+            }
+        } else {
+            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
+        }
+        #endif
+        if (!*t->p)
+            return -1;
+        ++t;
+    }
+    return 0;
+}
+
+/* Type Conversion Functions */
+
+static INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
+   if (x == Py_True) return 1;
+   else if ((x == Py_False) | (x == Py_None)) return 0;
+   else return PyObject_IsTrue(x);
+}
+
+static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
+  PyNumberMethods *m;
+  const char *name = NULL;
+  PyObject *res = NULL;
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(x) || PyLong_Check(x))
+#else
+  if (PyLong_Check(x))
+#endif
+    return Py_INCREF(x), x;
+  m = Py_TYPE(x)->tp_as_number;
+#if PY_VERSION_HEX < 0x03000000
+  if (m && m->nb_int) {
+    name = "int";
+    res = PyNumber_Int(x);
+  }
+  else if (m && m->nb_long) {
+    name = "long";
+    res = PyNumber_Long(x);
+  }
+#else
+  if (m && m->nb_int) {
+    name = "int";
+    res = PyNumber_Long(x);
+  }
+#endif
+  if (res) {
+#if PY_VERSION_HEX < 0x03000000
+    if (!PyInt_Check(res) && !PyLong_Check(res)) {
+#else
+    if (!PyLong_Check(res)) {
+#endif
+      PyErr_Format(PyExc_TypeError,
+                   "__%s__ returned non-%s (type %.200s)",
+                   name, name, Py_TYPE(res)->tp_name);
+      Py_DECREF(res);
+      return NULL;
+    }
+  }
+  else if (!PyErr_Occurred()) {
+    PyErr_SetString(PyExc_TypeError,
+                    "an integer is required");
+  }
+  return res;
+}
+
+static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
+  Py_ssize_t ival;
+  PyObject* x = PyNumber_Index(b);
+  if (!x) return -1;
+  ival = PyInt_AsSsize_t(x);
+  Py_DECREF(x);
+  return ival;
+}
+
+static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
+#if PY_VERSION_HEX < 0x02050000
+   if (ival <= LONG_MAX)
+       return PyInt_FromLong((long)ival);
+   else {
+       unsigned char *bytes = (unsigned char *) &ival;
+       int one = 1; int little = (int)*(unsigned char*)&one;
+       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
+   }
+#else
+   return PyInt_FromSize_t(ival);
+#endif
+}
+
+static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
+   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
+   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
+       return (size_t)-1;
+   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
+       PyErr_SetString(PyExc_OverflowError,
+                       "value too large to convert to size_t");
+       return (size_t)-1;
+   }
+   return (size_t)val;
+}
+
+
+#endif /* Py_PYTHON_H */
diff --git a/scikits/learn/src/minilearn/minilearn.h b/scikits/learn/src/minilearn/minilearn.h
new file mode 100644
index 0000000000..c2edc64e36
--- /dev/null
+++ b/scikits/learn/src/minilearn/minilearn.h
@@ -0,0 +1,20 @@
+
+#if defined(__LP64__) /* In LP64 match sizes with the 32 bit ABI */
+typedef int 		ml_int;
+#else
+typedef long int 	ml_int;
+#endif
+
+
+
+/* lars.c */
+void lars_fit(int nfeatures, int nsamples, double *X, double *b, double *beta, int *ind, double *L, int niter);
+
+/* from cholesky.c */
+int cholesky_update(double *R, int ldr, int p, double *X, double *Z, int ldz,
+                    int nz, double *Y, double *rho, double *C, double *S);
+
+void givens_rot(double *da, double *db, double *dc, double *ds);
+
+double cholesky_logdet (double *L, int n);
+
diff --git a/scikits/learn/src/minilearn/minilearn.pyx b/scikits/learn/src/minilearn/minilearn.pyx
new file mode 100644
index 0000000000..718b215756
--- /dev/null
+++ b/scikits/learn/src/minilearn/minilearn.pyx
@@ -0,0 +1,27 @@
+"""
+Wrapper for minilearn
+http://fabianp.github.com/minilearn/
+"""
+
+import numpy as np
+cimport numpy as np
+
+cdef extern int RowMajorStrg
+
+cdef extern from "minilearn.h":
+    void lars_fit (int, int, double *, double *, double *, int *, double *, int)
+
+
+def lars_fit_wrap (np.ndarray[np.float64_t, ndim=2, mode='c'] X,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] res,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] beta,
+                   np.ndarray[np.int32_t,   ndim=1, mode='c'] ind,
+                   np.ndarray[np.float64_t, ndim=1, mode='c'] chol,
+                   np.npy_intp niter):
+    """
+    res will be rewritten with the residual at output
+    """
+    lars_fit (<int> X.shape[1], <int> X.shape[0], <double *> X.data,
+              <double *> res.data, <double *> beta.data, <int *>
+              ind.data, <double *> chol.data, <int> niter)
+
diff --git a/scikits/learn/tests/test_glm.py b/scikits/learn/tests/test_glm.py
new file mode 100644
index 0000000000..fdf1389da9
--- /dev/null
+++ b/scikits/learn/tests/test_glm.py
@@ -0,0 +1,23 @@
+from numpy.testing import *
+
+from scikits.learn import glm
+
+X = [[1, 0, -.1],
+     [0, 0, 0],
+     [0, 1, .1]]
+Y = [1, 0, -1]
+
+clf = glm.LassoLARS()
+clf.fit(X, Y)
+
+def test_1():
+    """
+    Very simple test
+    """
+    clf = glm.LassoLARS()
+    clf.fit(X, Y)
+    assert_array_almost_equal(clf.coef_,
+                [-1.4142, -1.4142, 0], decimal=4)
+
+
+
-- 
GitLab