[Scipy-svn] r2850 - in trunk/Lib/sandbox/pyloess/sandbox: . src

scipy-svn@scip... scipy-svn@scip...
Mon Mar 19 18:50:35 CDT 2007


Author: pierregm
Date: 2007-03-19 18:50:21 -0500 (Mon, 19 Mar 2007)
New Revision: 2850

Modified:
   trunk/Lib/sandbox/pyloess/sandbox/pyloess.py
   trunk/Lib/sandbox/pyloess/sandbox/src/S.h
   trunk/Lib/sandbox/pyloess/sandbox/src/c_loess.pxd
   trunk/Lib/sandbox/pyloess/sandbox/src/c_python.pxd
   trunk/Lib/sandbox/pyloess/sandbox/src/cloess.c
   trunk/Lib/sandbox/pyloess/sandbox/src/cloess.h
   trunk/Lib/sandbox/pyloess/sandbox/src/cloess.pyx
   trunk/Lib/sandbox/pyloess/sandbox/src/loess.c
   trunk/Lib/sandbox/pyloess/sandbox/src/loess.h
   trunk/Lib/sandbox/pyloess/sandbox/src/loessc.c
   trunk/Lib/sandbox/pyloess/sandbox/src/loessf.f
   trunk/Lib/sandbox/pyloess/sandbox/src/misc.c
   trunk/Lib/sandbox/pyloess/sandbox/src/predict.c
Log:
* Add anova
* Prevent the code to exit on Fortran error, raise an exception instead
* Fixed the exception.NameError in confidence_intervals

TODO:
Modify parametric_flags and drop_square on an element-by-element basis

Modified: trunk/Lib/sandbox/pyloess/sandbox/pyloess.py
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/pyloess.py	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/pyloess.py	2007-03-19 23:50:21 UTC (rev 2850)
@@ -110,10 +110,10 @@
         (x, y, results, newdata1, newdata2, madeup) = self.d
         madeup.model.span = 0.5
         madeup.model.normalize = True
-        madeup.predict(newdata1, stderr=False)
+        madeup.predict(newdata1, stderror=False)
         assert_almost_equal(madeup.predicted.values, results[4], 5)
         #
-        madeup_pred = madeup.predict(newdata1, stderr=False)
+        madeup_pred = madeup.predict(newdata1, stderror=False)
         assert_almost_equal(madeup_pred.values, results[4], 5)
     #
     def test_2d_pred_nodata(self):
@@ -131,13 +131,13 @@
         (x, y, results, newdata1, newdata2, madeup) = self.d   
         madeup.model.span = 0.5
         madeup.model.normalize = True
-        madeup_pred = madeup.predict(newdata2, stderr=True)
+        madeup_pred = madeup.predict(newdata2, stderror=True)
         assert_almost_equal(madeup_pred.values, results[5], 5)
         assert_almost_equal(madeup_pred.stderr, [0.276746, 0.278009], 5)
         assert_almost_equal(madeup_pred.residual_scale, 0.969302, 6)
         assert_almost_equal(madeup_pred.df, 81.2319, 4)
         # Direct access
-        madeup.predict(newdata2, stderr=True)
+        madeup.predict(newdata2, stderror=True)
         assert_almost_equal(madeup.predicted.values, results[5], 5)
         assert_almost_equal(madeup.predicted.stderr, [0.276746, 0.278009], 5)
         assert_almost_equal(madeup.predicted.residual_scale, 0.969302, 6)
@@ -148,7 +148,7 @@
         (x, y, results, newdata1, newdata2, madeup) = self.d   
         madeup.model.span = 0.5
         madeup.model.normalize = True
-        madeup_pred = madeup.predict(newdata2, stderr=True)        
+        madeup_pred = madeup.predict(newdata2, stderror=True)        
         madeup.predicted.confidence(coverage=0.99)
         assert_almost_equal(madeup.predicted.confidence_intervals.lower, 
                             results[6][::3], 5)
@@ -215,14 +215,14 @@
         (E, NOx, gas_fit_E, newdata, coverage, results) = self.d
         gas = cloess.loess(E,NOx, span=2./3.)
         gas.fit()
-        gas.predict(gas_fit_E, stderr=False)
+        gas.predict(gas_fit_E, stderror=False)
         assert_almost_equal(gas.predicted.values, results[2], 6)
     #
     def test_1dpredict_2(self):
         "Basic test 1d - new predictions"
         (E, NOx, gas_fit_E, newdata, coverage, results) = self.d        
         gas = cloess.loess(E,NOx, span=2./3.)
-        gas.predict(newdata, stderr=True)
+        gas.predict(newdata, stderror=True)
         gas.predicted.confidence(0.99)
         assert_almost_equal(gas.predicted.confidence_intervals.lower,
                             results[3][0::3], 6)
@@ -230,11 +230,59 @@
                             results[3][1::3], 6)
         assert_almost_equal(gas.predicted.confidence_intervals.upper,
                             results[3][2::3], 6)
+    #
+    def test_anova(self):
+        "Tests anova"
+        (E, NOx, gas_fit_E, newdata, coverage, results) = self.d        
+        gas = cloess.loess(E,NOx, span=2./3.)
+        gas.fit()
+        gas_null = cloess.loess(E, NOx, span=1.0)
+        gas_null.fit()
+        gas_anova = cloess.anova(gas, gas_null)
+        gas_anova_theo = results[4]
+        assert_almost_equal(gas_anova.dfn, gas_anova_theo[0], 5)
+        assert_almost_equal(gas_anova.dfd, gas_anova_theo[1], 5)
+        assert_almost_equal(gas_anova.F_value, gas_anova_theo[2], 5)
+        assert_almost_equal(gas_anova.Pr_F, gas_anova_theo[3], 5)
+    #
+    def test_failures(self):
+        "Tests failures"
+        (E, NOx, gas_fit_E, newdata, coverage, results) = self.d       
+        gas = cloess.loess(E,NOx, span=2./3.)
+        # This one should fail (all parametric)
+        gas.model.parametric_flags = True
+        self.assertRaises(ValueError, gas.fit)
+        # This one also (all drop_square)
+        gas.model.drop_square_flags = True
+        self.assertRaises(ValueError, gas.fit)
+        gas.model.degree = 1
+        self.assertRaises(ValueError, gas.fit)
+        # This one should not (revert to std)
+        gas.model.parametric_flags = False
+        gas.model.drop_square_flags = False
+        gas.model.degree = 2
+        gas.fit()
+        # Now, for predict .................
+        gas.predict(gas_fit_E, stderror=False)
+        # This one should fail (extrapolation & blending)
+        self.assertRaises(ValueError, 
+                          gas.predict, gas.predicted.values, stderror=False)
+        # But this one should not ..........
+        gas.predict(gas_fit_E, stderror=False)
+        print "OK"
         
+        
+        
+        
+        
+        
 ########################################################################
 if __name__ == '__main__':
     NumpyTest().run()       
 
+    print "cloess:", dir(cloess)
+#    print "cloess.modelflags", dir(cloess.modelflags)
+
     if 0:
         NOx = N.array([4.818, 2.849, 3.275, 4.691, 4.255, 5.064, 2.118, 4.602,
                        2.286, 0.970, 3.965, 5.344, 3.834, 1.990, 5.199, 5.283,
@@ -243,8 +291,48 @@
                      1.074, 1.148, 1.000, 0.928, 0.767, 0.701, 0.807, 0.902,
                      0.997, 1.224, 1.089, 0.973, 0.980, 0.665])
         gas_fit_E = N.array([0.665, 0.949, 1.224])
-        gas_test = loess(E, NOx, span=2./3.)
-#        gas_test.fit()
-        gas_test.predict(gas_fit_E, stderr=False)
-        gas_test.predict(gas_test.predicted.values, stderr=False)
+        gas = loess(E, NOx, span=2./3.)
+        #
+        gas.model.parametric_flags = True
+        try:
+            gas.fit()
+        except ValueError:
+            pass
+        else:
+            raise AssertionError("ValueError not raised !")
+        
+        
+    #
+    if 0:
+        dfile = open(os.path.join('examples','madeup_data'), 'r')
+        dfile.readline()
+        x = N.fromiter((float(v) for v in dfile.readline().rstrip().split()),
+                        N.float_).reshape(-1,2)
+        dfile.readline()
+        y = N.fromiter((float(v) for v in dfile.readline().rstrip().split()),
+                        N.float_)
+        dfile = open(os.path.join('examples','madeup_data'), 'r')
+        dfile.readline()
+        #
+        rfile = open(os.path.join('examples','madeup_result'), 'r')
+        results = []
+        for i in range(8):
+            rfile.readline()
+            z = N.fromiter((float(v) for v in rfile.readline().rstrip().split()),
+                           N.float_)
+            results.append(z)
+        #
+        newdata1 = N.array([[-2.5, 0.0, 2.5], [0., 0., 0.]])
+        newdata2 = N.array([[-0.5, 0.5], [0., 0.]])
+        #
+        madeup = cloess.loess(x,y)
+        
+        print madeup.model
+        madeup.model.parametric_flags = [True, False]        
+        print madeup.model
+        madeup.model.parametric_flags[0] = False
+        print madeup.model
+        madeup.model.update(family="symmetric",normalize=False)
+        print madeup.model
+        
     
\ No newline at end of file

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/S.h
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/S.h	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/S.h	2007-03-19 23:50:21 UTC (rev 2850)
@@ -27,3 +27,6 @@
 
 #define NULL_ENTRY          ((int *)NULL)
 
+
+
+

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/c_loess.pxd
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/c_loess.pxd	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/c_loess.pxd	2007-03-19 23:50:21 UTC (rev 2850)
@@ -1,6 +1,9 @@
 # -*- Mode: Python -*-  
 
 cdef extern from "loess.h":
+    ctypedef struct c_loess_errstatus "loess_errstatus":
+        int err_status
+        char *err_msg
     ctypedef struct c_loess_inputs "loess_inputs":
         long   n
         long   p
@@ -40,16 +43,17 @@
         c_loess_control control
         c_loess_kd_tree kd_tree
         c_loess_outputs outputs
+        c_loess_errstatus status
     ctypedef struct c_prediction "prediction": 
         double  *fit
         double  *se_fit
         double  residual_scale
         double  df
-    ctypedef struct c_anova "anova_struct":
-        double  dfn
-        double  dfd
-        double  F_value
-        double  Pr_F
+#    ctypedef struct c_anova "anova_struct":
+#        double  dfn
+#        double  dfd
+#        double  F_value
+#        double  Pr_F
     ctypedef struct c_conf_inv "conf_inv":
         double  *fit
         double  *upper
@@ -61,8 +65,11 @@
     void loess_free_mem(c_loess *lo)
     void loess_summary(c_loess *lo)
     #
-    void predict(double *eval, int m, c_loess *lo, c_prediction *pre, int se)
+    void c_predict "predict" (double *eval, int m, c_loess *lo, c_prediction *pre, int se) 
     void pred_free_mem(c_prediction *pre)
     #
-    void anova(c_loess *one, c_loess *two, c_anova *out)
-    void pointwise(c_prediction *pre, int m, double coverage, c_conf_inv *ci)
\ No newline at end of file
+    void c_pointwise "pointwise" (c_prediction *pre, int m, double coverage, c_conf_inv *ci)
+    double pf (double q, double df1, double df2)
+    double ibeta (double x, double a, double b)
+    void pw_free_mem (c_conf_inv *ci)
+    

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/c_python.pxd
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/c_python.pxd	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/c_python.pxd	2007-03-19 23:50:21 UTC (rev 2850)
@@ -18,3 +18,5 @@
     void   Py_XINCREF(object o)
     void   Py_XDECREF(object o)
     void   Py_CLEAR(object o) # use instead of decref
+    
+    object PyList_New(int size)

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/cloess.c
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/cloess.c	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/cloess.c	2007-03-19 23:50:21 UTC (rev 2850)
@@ -1,4 +1,4 @@
-/* Generated by Pyrex 0.9.5.1a on Fri Mar 16 16:29:33 2007 */
+/* Generated by Pyrex 0.9.5.1a on Mon Mar 19 19:46:10 2007 */
 
 #include "Python.h"
 #include "structmember.h"
@@ -46,6 +46,8 @@
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
+static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+
 static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size);  /*proto*/
 
 static void __Pyx_AddTraceback(char *funcname); /*proto*/
@@ -86,11 +88,17 @@
 
 struct __pyx_obj_6cloess_loess_model {
   PyObject_HEAD
+  struct __pyx_vtabstruct_6cloess_loess_model *__pyx_vtab;
   loess_model (*_base);
   long npar;
 };
 
+struct __pyx_vtabstruct_6cloess_loess_model {
+  PyObject *((*setup)(struct __pyx_obj_6cloess_loess_model *,loess_model (*),long ));
+};
+static struct __pyx_vtabstruct_6cloess_loess_model *__pyx_vtabptr_6cloess_loess_model;
 
+
 struct __pyx_obj_6cloess_loess_outputs {
   PyObject_HEAD
   loess_outputs (*_base);
@@ -100,28 +108,35 @@
 };
 
 
-struct __pyx_obj_6cloess_loess_anova {
-  PyObject_HEAD
-  anova_struct (*_base);
-  long nest;
-};
-
-
 struct __pyx_obj_6cloess_conf_intervals {
   PyObject_HEAD
+  struct __pyx_vtabstruct_6cloess_conf_intervals *__pyx_vtab;
   conf_inv _base;
-  PyObject *nest;
+  PyArrayObject *lower;
+  PyArrayObject *fit;
+  PyArrayObject *upper;
 };
 
+struct __pyx_vtabstruct_6cloess_conf_intervals {
+  PyObject *((*setup)(struct __pyx_obj_6cloess_conf_intervals *,conf_inv ,long ));
+};
+static struct __pyx_vtabstruct_6cloess_conf_intervals *__pyx_vtabptr_6cloess_conf_intervals;
 
+
 struct __pyx_obj_6cloess_loess_predicted {
   PyObject_HEAD
+  struct __pyx_vtabstruct_6cloess_loess_predicted *__pyx_vtab;
   prediction _base;
   long nest;
   struct __pyx_obj_6cloess_conf_intervals *confidence_intervals;
 };
 
+struct __pyx_vtabstruct_6cloess_loess_predicted {
+  PyObject *((*setup)(struct __pyx_obj_6cloess_loess_predicted *,prediction ,long ));
+};
+static struct __pyx_vtabstruct_6cloess_loess_predicted *__pyx_vtabptr_6cloess_loess_predicted;
 
+
 struct __pyx_obj_6cloess_loess {
   PyObject_HEAD
   loess _base;
@@ -135,18 +150,27 @@
   long npar;
 };
 
+
+struct __pyx_obj_6cloess_anova {
+  PyObject_HEAD
+  double dfn;
+  double dfd;
+  double F_value;
+  double Pr_F;
+};
+
 static PyTypeObject *__pyx_ptype_6cloess_loess_inputs = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess_control = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess_kd_tree = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess_model = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess_outputs = 0;
-static PyTypeObject *__pyx_ptype_6cloess_loess_anova = 0;
 static PyTypeObject *__pyx_ptype_6cloess_conf_intervals = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess_predicted = 0;
 static PyTypeObject *__pyx_ptype_6cloess_loess = 0;
-static PyObject *__pyx_k35;
-static PyObject *__pyx_k36;
-static PyObject *__pyx_k37;
+static PyTypeObject *__pyx_ptype_6cloess_anova = 0;
+static PyObject *__pyx_k32;
+static PyObject *__pyx_k33;
+static PyObject *__pyx_k34;
 static PyObject *(__pyx_f_6cloess_floatarray_from_data(int ,int ,double (*))); /*proto*/
 static PyObject *(__pyx_f_6cloess_boolarray_from_data(int ,int ,int (*))); /*proto*/
 
@@ -161,9 +185,9 @@
 static char (__pyx_k6[]) = "\n    trace_hat : string [\"wait.to.decide\"]\n        Determines how the trace of the hat matrix should be computed. The hat\n        matrix is used in the computation of the statistical quantities. \n        If \"exact\", an exact computation is done; this could be slow when the\n        number of observations n becomes large. If \"wait.to.decide\" is selected, \n        then a default is \"exact\" for n < 500 and \"approximate\" otherwise. \n        This option is only useful when the fitted surface is interpolated. If  \n        surface is \"exact\", an exact computation is always done for the trace. \n        Setting trace_hat to \"approximate\" for large dataset will substantially \n        reduce the computation time.\n        ";
 static char (__pyx_k7[]) = "\n    iterations : integer\n        Number of iterations of the robust fitting method. If the family is \n        \"gaussian\", the number of iterations is set to 0.\n        ";
 static char (__pyx_k8[]) = "\n    cell : integer\n        Maximum cell size of the kd-tree. Suppose k = floor(n*cell*span),\n        where n is the number of observations, and span the smoothing parameter.\n        Then, a cell is further divided if the number of observations within it \n        is greater than or equal to k. This option is only used if the surface \n        is interpolated.\n        ";
-static char (__pyx_k9[]) = "Smoothing factor, as a fraction of the number of points to take into\n    account. By default, span=0.75.";
-static char (__pyx_k10[]) = "\n    degree : integer [2]\n        Overall degree of locally-fitted polynomial. 1 is locally-linear \n        fitting and 2 is locally-quadratic fitting.  Degree should be 2 at most.\n        ";
-static char (__pyx_k11[]) = "\n    normalize : boolean [True]\n        Determines whether the independent variables should be normalized.  \n        If True, the normalization is performed by setting the 10% trimmed \n        standard deviation to one. If False, no normalization is carried out. \n        This option is only useful for more than one variable. For spatial\n        coordinates predictors or variables with a common scale, it should be \n        set to False.\n        ";
+static char (__pyx_k9[]) = "\n    normalize : boolean [True]\n        Determines whether the independent variables should be normalized.  \n        If True, the normalization is performed by setting the 10% trimmed \n        standard deviation to one. If False, no normalization is carried out. \n        This option is only useful for more than one variable. For spatial\n        coordinates predictors or variables with a common scale, it should be \n        set to False.\n        ";
+static char (__pyx_k10[]) = "Smoothing factor, as a fraction of the number of points to take into\n    account. By default, span=0.75.";
+static char (__pyx_k11[]) = "\n    degree : integer [2]\n        Overall degree of locally-fitted polynomial. 1 is locally-linear \n        fitting and 2 is locally-quadratic fitting.  Degree should be 2 at most.\n        ";
 static char (__pyx_k12[]) = "\n    family : string [\"gaussian\"]\n        Determines the assumed distribution of the errors. The values are \n        \"gaussian\" or \"symmetric\". If \"gaussian\" is selected, the fit is \n        performed with least-squares. If \"symmetric\" is selected, the fit\n        is performed robustly by redescending M-estimators.\n        ";
 static char (__pyx_k13[]) = "\n    parametric_flags : sequence [ [False]*p ]\n        Indicates which independent variables should be conditionally-parametric\n       (if there are two or more independent variables). The argument should \n       be a sequence of booleans, with the same size as the number of independent \n       variables, specified in the order of the predictor group ordered in x. \n        ";
 static char (__pyx_k14[]) = "\n    drop_square : sequence [ [False]* p]\n        When there are two or more independent variables and when a 2nd order\n        polynomial is used, \"drop_square_flags\" specifies those numeric predictors \n        whose squares should be dropped from the set of fitting variables. \n        The method of specification is the same as for parametric.  \n        ";
@@ -178,19 +202,18 @@
 static char (__pyx_k23[]) = "\n    one_delta: float\n        Statistical parameter used in the computation of standard errors.\n        ";
 static char (__pyx_k24[]) = "\n    two_delta : float\n        Statistical parameter used in the computation of standard errors.\n       ";
 static char (__pyx_k25[]) = "\n    trace_hat : float    \n        Trace of the operator hat matrix.\n        ";
-static char (__pyx_k26[]) = "\n    fit : ndarray\n        The (m,) ndarray of estimated values\n        ";
-static char (__pyx_k27[]) = "\n    upper : ndarray\n        The (m,) ndarray of the upper limits of the pointwise confidence intervals.\n        ";
-static char (__pyx_k28[]) = "\n    lower : ndarray\n        The (m,) ndarray of the lower limits of the pointwise confidence intervals.\n        ";
-static char (__pyx_k29[]) = "\n    values : ndarray\n        The (m,) ndarray of loess values evaluated at newdata\n        ";
-static char (__pyx_k30[]) = "\n    stderr : ndarray\n        The (m,) ndarray of the estimates of the standard error on the estimated\n        values.\n        ";
-static char (__pyx_k31[]) = "\n    residual_scale : float\n        Estimate of the scale of the residuals\n        ";
-static char (__pyx_k32[]) = "\n    df : integer\n        Degrees of freedom of the t-distribution used to compute pointwise \n        confidence intervals for the evaluated surface.\n        ";
-static char (__pyx_k34[]) = "\n:Keywords:\n    x : ndarray\n        A (n,p) ndarray of independent variables, with n the number of observations\n        and p the number of variables.\n    y : ndarray\n        A (n,) ndarray of observations\n    weights : ndarray\n        A (n,) ndarray of weights to be given to individual observations in the \n        sum of squared residuals that forms the local fitting criterion. If not\n        None, the weights should be non negative. If the different observations\n        have non-equal variances, the weights should be inversely proportional \n        to the variances.\n        By default, an unweighted fit is carried out (all the weights are one).\n    surface : string [\"interpolate\"]\n        Determines whether the fitted surface is computed directly at all points\n        (\"direct\") or whether an interpolation method is used (\"interpolate\").\n        The default (\"interpolate\") is what most users should use unless special \n        circumstances warrant.\n    statistics : string [\"approximate\"]\n        Determines whether the statistical quantities are computed exactly \n        (\"exact\") or approximately (\"approximate\"). \"exact\" should only be used \n        for testing the approximation in statistical development and is not meant \n        for routine usage because computation time can be horrendous.\n    trace_hat : string [\"wait.to.decide\"]\n        Determines how the trace of the hat matrix should be computed. The hat\n        matrix is used in the computation of the statistical quantities. \n        If \"exact\", an exact computation is done; this could be slow when the\n        number of observations n becomes large. If \"wait.to.decide\" is selected, \n        then a default is \"exact\" for n < 500 and \"approximate\" otherwise. \n        This option is only useful when the fitted surface is interpolated. If  \n        surface is \"exact\", an exact computation is always done for the trace. \n        Setting trace_hat to \"approximate\" for large dataset will substantially \n        reduce the computation time.\n    iterations : integer\n        Number of iterations of the robust fitting method. If the family is \n        \"gaussian\", the number of iterations is set to 0.\n    cell : integer\n        Maximum cell size of the kd-tree. Suppose k = floor(n*cell*span),\n        where n is the number of observations, and span the smoothing parameter.\n        Then, a cell is further divided if the number of observations within it \n        is greater than or equal to k. This option is only used if the surface \n        is interpolated.\n    span : float [0.75]\n        Smoothing factor, as a fraction of the number of points to take into\n        account. \n    degree : integer [2]\n        Overall degree of locally-fitted polynomial. 1 is locally-linear \n        fitting and 2 is locally-quadratic fitting.  Degree should be 2 at most.\n    normalize : boolean [True]\n        Determines whether the independent variables should be normalized.  \n        If True, the normalization is performed by setting the 10% trimmed \n        standard deviation to one. If False, no normalization is carried out. \n        This option is only useful for more than one variable. For spatial\n        coordinates predictors or variables with a common scale, it should be \n        set to False.\n    family : string [\"gaussian\"]\n        Determines the assumed distribution of the errors. The values are \n        \"gaussian\" or \"symmetric\". If \"gaussian\" is selected, the fit is \n        performed with least-squares. If \"symmetric\" is selected, the fit\n        is performed robustly by redescending M-estimators.\n    parametric_flags : sequence [ [False]*p ]\n        Indicates which independent variables should be conditionally-parametric\n       (if there are two or more independent variables). The argument should \n       be a sequence of booleans, with the same size as the number of independent \n       variables, specified in the order of the predictor group ordered in x. \n    drop_square : sequence [ [False]* p]\n        When there are two or more independent variables and when a 2nd order\n        polynomial is used, \"drop_square_flags\" specifies those numeric predictors \n        whose squares should be dropped from the set of fitting variables. \n        The method of specification is the same as for parametric.  \n        \n:Outputs:\n    fitted_values : ndarray\n        The (n,) ndarray of fitted values.\n    fitted_residuals : ndarray\n        The (n,) ndarray of fitted residuals (observations - fitted values).\n    enp : float\n        Equivalent number of parameters.\n    s : float\n        Estimate of the scale of residuals.\n    one_delta: float\n        Statistical parameter used in the computation of standard errors.\n    two_delta : float\n        Statistical parameter used in the computation of standard errors.\n    pseudovalues : ndarray\n        The (n,) ndarray of adjusted values of the response when robust estimation \n        is used.\n    trace_hat : float    \n        Trace of the operator hat matrix.\n    diagonal :\n        Diagonal of the operator hat matrix.\n    robust : ndarray\n        The (n,) ndarray of robustness weights for robust fitting.\n    divisor : ndarray\n        The (p,) array of normalization divisors for numeric predictors.\n        \n\n    newdata : ndarray\n        The (m,p) array of independent variables where the surface must be estimated.\n    values : ndarray\n        The (m,) ndarray of loess values evaluated at newdata\n    stderr : ndarray\n        The (m,) ndarray of the estimates of the standard error on the estimated\n        values.\n    residual_scale : float\n        Estimate of the scale of the residuals\n    df : integer\n        Degrees of freedom of the t-distribution used to compute pointwise \n        confidence intervals for the evaluated surface.\n    nest : integer\n        Number of new observations.\n       \n        \n";
+static char (__pyx_k26[]) = "\n    values : ndarray\n        The (m,) ndarray of loess values evaluated at newdata\n        ";
+static char (__pyx_k27[]) = "\n    stderr : ndarray\n        The (m,) ndarray of the estimates of the standard error on the estimated\n        values.\n        ";
+static char (__pyx_k28[]) = "\n    residual_scale : float\n        Estimate of the scale of the residuals\n        ";
+static char (__pyx_k29[]) = "\n    df : integer\n        Degrees of freedom of the t-distribution used to compute pointwise \n        confidence intervals for the evaluated surface.\n        ";
+static char (__pyx_k31[]) = "\n:Keywords:\n    x : ndarray\n        A (n,p) ndarray of independent variables, with n the number of observations\n        and p the number of variables.\n    y : ndarray\n        A (n,) ndarray of observations\n    weights : ndarray\n        A (n,) ndarray of weights to be given to individual observations in the \n        sum of squared residuals that forms the local fitting criterion. If not\n        None, the weights should be non negative. If the different observations\n        have non-equal variances, the weights should be inversely proportional \n        to the variances.\n        By default, an unweighted fit is carried out (all the weights are one).\n    surface : string [\"interpolate\"]\n        Determines whether the fitted surface is computed directly at all points\n        (\"direct\") or whether an interpolation method is used (\"interpolate\").\n        The default (\"interpolate\") is what most users should use unless special \n        circumstances warrant.\n    statistics : string [\"approximate\"]\n        Determines whether the statistical quantities are computed exactly \n        (\"exact\") or approximately (\"approximate\"). \"exact\" should only be used \n        for testing the approximation in statistical development and is not meant \n        for routine usage because computation time can be horrendous.\n    trace_hat : string [\"wait.to.decide\"]\n        Determines how the trace of the hat matrix should be computed. The hat\n        matrix is used in the computation of the statistical quantities. \n        If \"exact\", an exact computation is done; this could be slow when the\n        number of observations n becomes large. If \"wait.to.decide\" is selected, \n        then a default is \"exact\" for n < 500 and \"approximate\" otherwise. \n        This option is only useful when the fitted surface is interpolated. If  \n        surface is \"exact\", an exact computation is always done for the trace. \n        Setting trace_hat to \"approximate\" for large dataset will substantially \n        reduce the computation time.\n    iterations : integer\n        Number of iterations of the robust fitting method. If the family is \n        \"gaussian\", the number of iterations is set to 0.\n    cell : integer\n        Maximum cell size of the kd-tree. Suppose k = floor(n*cell*span),\n        where n is the number of observations, and span the smoothing parameter.\n        Then, a cell is further divided if the number of observations within it \n        is greater than or equal to k. This option is only used if the surface \n        is interpolated.\n    span : float [0.75]\n        Smoothing factor, as a fraction of the number of points to take into\n        account. \n    degree : integer [2]\n        Overall degree of locally-fitted polynomial. 1 is locally-linear \n        fitting and 2 is locally-quadratic fitting.  Degree should be 2 at most.\n    normalize : boolean [True]\n        Determines whether the independent variables should be normalized.  \n        If True, the normalization is performed by setting the 10% trimmed \n        standard deviation to one. If False, no normalization is carried out. \n        This option is only useful for more than one variable. For spatial\n        coordinates predictors or variables with a common scale, it should be \n        set to False.\n    family : string [\"gaussian\"]\n        Determines the assumed distribution of the errors. The values are \n        \"gaussian\" or \"symmetric\". If \"gaussian\" is selected, the fit is \n        performed with least-squares. If \"symmetric\" is selected, the fit\n        is performed robustly by redescending M-estimators.\n    parametric_flags : sequence [ [False]*p ]\n        Indicates which independent variables should be conditionally-parametric\n       (if there are two or more independent variables). The argument should \n       be a sequence of booleans, with the same size as the number of independent \n       variables, specified in the order of the predictor group ordered in x. \n    drop_square : sequence [ [False]* p]\n        When there are two or more independent variables and when a 2nd order\n        polynomial is used, \"drop_square_flags\" specifies those numeric predictors \n        whose squares should be dropped from the set of fitting variables. \n        The method of specification is the same as for parametric.  \n        \n:Outputs:\n    fitted_values : ndarray\n        The (n,) ndarray of fitted values.\n    fitted_residuals : ndarray\n        The (n,) ndarray of fitted residuals (observations - fitted values).\n    enp : float\n        Equivalent number of parameters.\n    s : float\n        Estimate of the scale of residuals.\n    one_delta: float\n        Statistical parameter used in the computation of standard errors.\n    two_delta : float\n        Statistical parameter used in the computation of standard errors.\n    pseudovalues : ndarray\n        The (n,) ndarray of adjusted values of the response when robust estimation \n        is used.\n    trace_hat : float    \n        Trace of the operator hat matrix.\n    diagonal :\n        Diagonal of the operator hat matrix.\n    robust : ndarray\n        The (n,) ndarray of robustness weights for robust fitting.\n    divisor : ndarray\n        The (p,) array of normalization divisors for numeric predictors.\n        \n\n    newdata : ndarray\n        The (m,p) array of independent variables where the surface must be estimated.\n    values : ndarray\n        The (m,) ndarray of loess values evaluated at newdata\n    stderr : ndarray\n        The (m,) ndarray of the estimates of the standard error on the estimated\n        values.\n    residual_scale : float\n        Estimate of the scale of the residuals\n    df : integer\n        Degrees of freedom of the t-distribution used to compute pointwise \n        confidence intervals for the evaluated surface.\n    nest : integer\n        Number of new observations.\n       \n        \n";
 
 static PyObject *__pyx_n_c_python;
 static PyObject *__pyx_n_c_numpy;
 static PyObject *__pyx_n_numpy;
+static PyObject *__pyx_n_narray;
 static PyObject *__pyx_n_c_loess;
+static PyObject *__pyx_n_array;
 static PyObject *__pyx_n_False;
 
 static PyObject *__pyx_n_shape;
@@ -205,36 +228,36 @@
   PyObject *__pyx_4 = 0;
   __pyx_v_a_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":23 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":19 */
   __pyx_v_size = (__pyx_v_rows * __pyx_v_cols);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":24 */
-  __pyx_1 = PyArray_SimpleNewFromData(1,(&__pyx_v_size),NPY_DOUBLE,__pyx_v_data); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":20 */
+  __pyx_1 = PyArray_SimpleNewFromData(1,(&__pyx_v_size),NPY_DOUBLE,__pyx_v_data); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; goto __pyx_L1;}
   Py_INCREF(((PyObject *)__pyx_1));
   Py_DECREF(((PyObject *)__pyx_v_a_ndr));
   __pyx_v_a_ndr = ((PyArrayObject *)((PyObject *)__pyx_1));
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":29 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":21 */
   __pyx_2 = (__pyx_v_cols > 1);
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":30 */
-    __pyx_1 = PyInt_FromLong(__pyx_v_rows); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; goto __pyx_L1;}
-    __pyx_3 = PyInt_FromLong(__pyx_v_cols); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; goto __pyx_L1;}
-    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":22 */
+    __pyx_1 = PyInt_FromLong(__pyx_v_rows); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; goto __pyx_L1;}
+    __pyx_3 = PyInt_FromLong(__pyx_v_cols); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_1);
     PyTuple_SET_ITEM(__pyx_4, 1, __pyx_3);
     __pyx_1 = 0;
     __pyx_3 = 0;
-    if (PyObject_SetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; goto __pyx_L1;}
+    if (PyObject_SetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; goto __pyx_L1;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":31 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":23 */
   Py_INCREF(((PyObject *)__pyx_v_a_ndr));
   __pyx_r = ((PyObject *)__pyx_v_a_ndr);
   goto __pyx_L0;
@@ -265,44 +288,44 @@
   PyObject *__pyx_4 = 0;
   __pyx_v_a_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":36 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":28 */
   __pyx_v_size = (__pyx_v_rows * __pyx_v_cols);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":39 */
-  __pyx_1 = PyArray_SimpleNewFromData(1,(&__pyx_v_size),NPY_DOUBLE,__pyx_v_data); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":29 */
+  __pyx_1 = PyArray_SimpleNewFromData(1,(&__pyx_v_size),NPY_DOUBLE,__pyx_v_data); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; goto __pyx_L1;}
   Py_INCREF(((PyObject *)__pyx_1));
   Py_DECREF(((PyObject *)__pyx_v_a_ndr));
   __pyx_v_a_ndr = ((PyArrayObject *)((PyObject *)__pyx_1));
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":43 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":30 */
   __pyx_2 = (__pyx_v_cols > 1);
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":44 */
-    __pyx_1 = PyInt_FromLong(__pyx_v_rows); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;}
-    __pyx_3 = PyInt_FromLong(__pyx_v_cols); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;}
-    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":31 */
+    __pyx_1 = PyInt_FromLong(__pyx_v_rows); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
+    __pyx_3 = PyInt_FromLong(__pyx_v_cols); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_1);
     PyTuple_SET_ITEM(__pyx_4, 1, __pyx_3);
     __pyx_1 = 0;
     __pyx_3 = 0;
-    if (PyObject_SetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; goto __pyx_L1;}
+    if (PyObject_SetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; goto __pyx_L1;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":45 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_astype); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; goto __pyx_L1;}
-  __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; goto __pyx_L1;}
-  __pyx_4 = PyObject_GetAttr(__pyx_3, __pyx_n_bool); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":32 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_a_ndr), __pyx_n_astype); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
+  __pyx_3 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
+  __pyx_4 = PyObject_GetAttr(__pyx_3, __pyx_n_bool); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_4);
   __pyx_4 = 0;
-  __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_4;
@@ -328,8 +351,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":173 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->p,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->x); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":198 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->p,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->x); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -351,8 +374,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":177 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,1,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->y); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":202 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,1,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->y); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -374,8 +397,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":188 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,1,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->weights); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":213 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n,1,((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->weights); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -395,9 +418,9 @@
 static PyObject *__pyx_n_size;
 static PyObject *__pyx_n_ValueError;
 
-static PyObject *__pyx_k38p;
+static PyObject *__pyx_k35p;
 
-static char (__pyx_k38[]) = "Invalid size of the 'weights' vector!";
+static char (__pyx_k35[]) = "Invalid size of the 'weights' vector!";
 
 static int __pyx_f_6cloess_12loess_inputs_7weights___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_w); /*proto*/
 static int __pyx_f_6cloess_12loess_inputs_7weights___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_w) {
@@ -410,40 +433,40 @@
   Py_INCREF(__pyx_v_w);
   __pyx_v_w_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":193 */
-  __pyx_1 = PyArray_FROMANY(__pyx_v_w,NPY_DOUBLE,1,1,NPY_OWNDATA); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":218 */
+  __pyx_1 = PyArray_FROMANY(__pyx_v_w,NPY_DOUBLE,1,1,NPY_OWNDATA); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; goto __pyx_L1;}
   Py_INCREF(((PyObject *)((PyArrayObject *)__pyx_1)));
   Py_DECREF(((PyObject *)__pyx_v_w_ndr));
   __pyx_v_w_ndr = ((PyArrayObject *)__pyx_1);
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":194 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w_ndr), __pyx_n_ndim); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
-  __pyx_3 = PyInt_FromLong(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_1, __pyx_3, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":219 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w_ndr), __pyx_n_ndim); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
+  __pyx_3 = PyInt_FromLong(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_1, __pyx_3, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
   __pyx_2 = __pyx_2 > 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   if (!__pyx_2) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
-    __pyx_3 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
-    if (PyObject_Cmp(__pyx_1, __pyx_3, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; goto __pyx_L1;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
+    __pyx_3 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
+    if (PyObject_Cmp(__pyx_1, __pyx_3, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; goto __pyx_L1;}
     __pyx_2 = __pyx_2 != 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
   }
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":195 */
-    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; goto __pyx_L1;}
-    __Pyx_Raise(__pyx_1, __pyx_k38p, 0);
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":220 */
+    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; goto __pyx_L1;}
+    __Pyx_Raise(__pyx_1, __pyx_k35p, 0);
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":196 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":221 */
   ((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->weights = ((double (*))__pyx_v_w_ndr->data);
 
   __pyx_r = 0;
@@ -466,8 +489,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":201 */
-  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":226 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->n); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -489,8 +512,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":206 */
-  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->p); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":231 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_inputs *)__pyx_v_self)->_base->p); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -512,8 +535,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":223 */
-  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->surface); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":248 */
+  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->surface); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 248; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -533,11 +556,11 @@
 static PyObject *__pyx_n_interpolate;
 static PyObject *__pyx_n_direct;
 
-static PyObject *__pyx_k41p;
-static PyObject *__pyx_k42p;
+static PyObject *__pyx_k38p;
+static PyObject *__pyx_k39p;
 
-static char (__pyx_k41[]) = "Invalid value for the 'surface' argument: ";
-static char (__pyx_k42[]) = "should be in ('interpolate', 'direct').";
+static char (__pyx_k38[]) = "Invalid value for the 'surface' argument: ";
+static char (__pyx_k39[]) = "should be in ('interpolate', 'direct').";
 
 static int __pyx_f_6cloess_13loess_control_7surface___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_surface); /*proto*/
 static int __pyx_f_6cloess_13loess_control_7surface___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_surface) {
@@ -552,47 +575,47 @@
   Py_INCREF(__pyx_v_surface);
   __pyx_v_tmpx = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":225 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_surface, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; goto __pyx_L1;}
-  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":250 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_surface, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; goto __pyx_L1;}
+  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; goto __pyx_L1;}
   Py_INCREF(__pyx_n_interpolate);
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_n_interpolate);
   Py_INCREF(__pyx_n_direct);
   PyTuple_SET_ITEM(__pyx_1, 1, __pyx_n_direct);
-  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; goto __pyx_L1;}
+  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; goto __pyx_L1;}
   __pyx_3 = !__pyx_3;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_3) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":226 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
-    __pyx_1 = PyNumber_Add(__pyx_k41p, __pyx_k42p); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
-    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":251 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; goto __pyx_L1;}
+    __pyx_1 = PyNumber_Add(__pyx_k38p, __pyx_k39p); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_1);
     __pyx_1 = 0;
-    __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
+    __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     __Pyx_Raise(__pyx_1, 0, 0);
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":228 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_surface, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; goto __pyx_L1;}
-  __pyx_4 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":253 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_surface, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_tmpx);
   __pyx_v_tmpx = __pyx_4;
   __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":229 */
-  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 229; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":254 */
+  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 254; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->surface = __pyx_5;
 
   __pyx_r = 0;
@@ -616,8 +639,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":240 */
-  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->statistics); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":265 */
+  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->statistics); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -636,9 +659,9 @@
 static PyObject *__pyx_n_approximate;
 static PyObject *__pyx_n_exact;
 
-static PyObject *__pyx_k45p;
+static PyObject *__pyx_k42p;
 
-static char (__pyx_k45[]) = "Invalid value for the 'statistics' argument: should be in ('approximate', 'exact').";
+static char (__pyx_k42[]) = "Invalid value for the 'statistics' argument: should be in ('approximate', 'exact').";
 
 static int __pyx_f_6cloess_13loess_control_10statistics___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_statistics); /*proto*/
 static int __pyx_f_6cloess_13loess_control_10statistics___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_statistics) {
@@ -653,46 +676,46 @@
   Py_INCREF(__pyx_v_statistics);
   __pyx_v_tmpx = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":242 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_statistics, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; goto __pyx_L1;}
-  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":267 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_statistics, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
+  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
   Py_INCREF(__pyx_n_approximate);
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_n_approximate);
   Py_INCREF(__pyx_n_exact);
   PyTuple_SET_ITEM(__pyx_1, 1, __pyx_n_exact);
-  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; goto __pyx_L1;}
+  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
   __pyx_3 = !__pyx_3;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_3) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":243 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; goto __pyx_L1;}
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; goto __pyx_L1;}
-    Py_INCREF(__pyx_k45p);
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k45p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":268 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; goto __pyx_L1;}
+    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; goto __pyx_L1;}
+    Py_INCREF(__pyx_k42p);
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k42p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":245 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_statistics, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; goto __pyx_L1;}
-  __pyx_1 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":270 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_statistics, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; goto __pyx_L1;}
+  __pyx_1 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_tmpx);
   __pyx_v_tmpx = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":246 */
-  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":271 */
+  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->statistics = __pyx_5;
 
   __pyx_r = 0;
@@ -716,8 +739,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":262 */
-  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":287 */
+  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -733,9 +756,9 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k48p;
+static PyObject *__pyx_k45p;
 
-static char (__pyx_k48[]) = "Invalid value for the 'trace_hat' argument: should be in ('approximate', 'exact').";
+static char (__pyx_k45[]) = "Invalid value for the 'trace_hat' argument: should be in ('approximate', 'exact').";
 
 static int __pyx_f_6cloess_13loess_control_9trace_hat___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_trace_hat); /*proto*/
 static int __pyx_f_6cloess_13loess_control_9trace_hat___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_trace_hat) {
@@ -750,46 +773,46 @@
   Py_INCREF(__pyx_v_trace_hat);
   __pyx_v_tmpx = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":264 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_trace_hat, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; goto __pyx_L1;}
-  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":289 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_trace_hat, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; goto __pyx_L1;}
+  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; goto __pyx_L1;}
   Py_INCREF(__pyx_n_approximate);
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_n_approximate);
   Py_INCREF(__pyx_n_exact);
   PyTuple_SET_ITEM(__pyx_1, 1, __pyx_n_exact);
-  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 264; goto __pyx_L1;}
+  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; goto __pyx_L1;}
   __pyx_3 = !__pyx_3;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_3) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":265 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; goto __pyx_L1;}
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; goto __pyx_L1;}
-    Py_INCREF(__pyx_k48p);
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k48p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":290 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; goto __pyx_L1;}
+    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; goto __pyx_L1;}
+    Py_INCREF(__pyx_k45p);
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k45p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":267 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_trace_hat, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
-  __pyx_1 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":292 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_trace_hat, __pyx_n_lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; goto __pyx_L1;}
+  __pyx_1 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_tmpx);
   __pyx_v_tmpx = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":268 */
-  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":293 */
+  __pyx_5 = PyString_AsString(__pyx_v_tmpx); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->trace_hat = __pyx_5;
 
   __pyx_r = 0;
@@ -813,8 +836,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":277 */
-  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->iterations); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":302 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->iterations); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -830,9 +853,9 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k49p;
+static PyObject *__pyx_k46p;
 
-static char (__pyx_k49[]) = "Invalid number of iterations: should be positive";
+static char (__pyx_k46[]) = "Invalid number of iterations: should be positive";
 
 static int __pyx_f_6cloess_13loess_control_10iterations___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_iterations); /*proto*/
 static int __pyx_f_6cloess_13loess_control_10iterations___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_iterations) {
@@ -844,30 +867,30 @@
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_iterations);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":279 */
-  __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_iterations, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":304 */
+  __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_iterations, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 304; goto __pyx_L1;}
   __pyx_2 = __pyx_2 < 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":280 */
-    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; goto __pyx_L1;}
-    Py_INCREF(__pyx_k49p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k49p);
-    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":305 */
+    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
+    Py_INCREF(__pyx_k46p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k46p);
+    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":281 */
-  __pyx_2 = PyInt_AsLong(__pyx_v_iterations); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":306 */
+  __pyx_2 = PyInt_AsLong(__pyx_v_iterations); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->iterations = __pyx_2;
 
   __pyx_r = 0;
@@ -890,8 +913,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":293 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->cell); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":318 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->cell); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -907,9 +930,9 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k50p;
+static PyObject *__pyx_k47p;
 
-static char (__pyx_k50[]) = "Invalid value for the cell argument: should be positive";
+static char (__pyx_k47[]) = "Invalid value for the cell argument: should be positive";
 
 static int __pyx_f_6cloess_13loess_control_4cell___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_cell); /*proto*/
 static int __pyx_f_6cloess_13loess_control_4cell___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_cell) {
@@ -922,30 +945,30 @@
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_cell);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":295 */
-  __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_cell, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":320 */
+  __pyx_1 = PyInt_FromLong(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_cell, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; goto __pyx_L1;}
   __pyx_2 = __pyx_2 <= 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":296 */
-    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; goto __pyx_L1;}
-    Py_INCREF(__pyx_k50p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k50p);
-    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":321 */
+    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; goto __pyx_L1;}
+    Py_INCREF(__pyx_k47p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k47p);
+    __pyx_4 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":297 */
-  __pyx_5 = PyFloat_AsDouble(__pyx_v_cell); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":322 */
+  __pyx_5 = PyFloat_AsDouble(__pyx_v_cell); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_control *)__pyx_v_self)->_base->cell = __pyx_5;
 
   __pyx_r = 0;
@@ -1000,122 +1023,122 @@
   __pyx_v_iterations = Py_None; Py_INCREF(Py_None);
   __pyx_v_cell = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":301 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":326 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; goto __pyx_L1;}
   Py_INCREF(__pyx_n_surface);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_surface);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_surface);
   __pyx_v_surface = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":302 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":327 */
   __pyx_4 = __pyx_v_surface != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":303 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_surface, __pyx_v_surface) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":328 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_surface, __pyx_v_surface) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":305 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":330 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; goto __pyx_L1;}
   Py_INCREF(__pyx_n_statistics);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_statistics);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 305; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_statistics);
   __pyx_v_statistics = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":306 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":331 */
   __pyx_4 = __pyx_v_statistics != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":307 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_statistics, __pyx_v_statistics) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 307; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":332 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_statistics, __pyx_v_statistics) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; goto __pyx_L1;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":309 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":334 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; goto __pyx_L1;}
   Py_INCREF(__pyx_n_trace_hat);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_trace_hat);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_trace_hat);
   __pyx_v_trace_hat = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":310 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":335 */
   __pyx_4 = __pyx_v_trace_hat != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":311 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_trace_hat, __pyx_v_trace_hat) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":336 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_trace_hat, __pyx_v_trace_hat) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; goto __pyx_L1;}
     goto __pyx_L4;
   }
   __pyx_L4:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":313 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":338 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; goto __pyx_L1;}
   Py_INCREF(__pyx_n_iterations);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_iterations);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_iterations);
   __pyx_v_iterations = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":314 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":339 */
   __pyx_4 = __pyx_v_iterations != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":315 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_iterations, __pyx_v_iterations) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 315; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":340 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_iterations, __pyx_v_iterations) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; goto __pyx_L1;}
     goto __pyx_L5;
   }
   __pyx_L5:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":317 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":342 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_cellargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; goto __pyx_L1;}
   Py_INCREF(__pyx_n_cell);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_cell);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_cell);
   __pyx_v_cell = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":318 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":343 */
   __pyx_4 = __pyx_v_cell != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":319 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_parametric_flags, __pyx_v_cell) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 319; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":344 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_parametric_flags, __pyx_v_cell) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; goto __pyx_L1;}
     goto __pyx_L6;
   }
   __pyx_L6:;
@@ -1143,21 +1166,21 @@
 
 static PyObject *__pyx_n_join;
 
+static PyObject *__pyx_k53p;
+static PyObject *__pyx_k54p;
+static PyObject *__pyx_k55p;
 static PyObject *__pyx_k56p;
 static PyObject *__pyx_k57p;
 static PyObject *__pyx_k58p;
 static PyObject *__pyx_k59p;
-static PyObject *__pyx_k60p;
-static PyObject *__pyx_k61p;
-static PyObject *__pyx_k62p;
 
-static char (__pyx_k56[]) = "Control          :";
-static char (__pyx_k57[]) = "Surface type     : %s";
-static char (__pyx_k58[]) = "Statistics       : %s";
-static char (__pyx_k59[]) = "Trace estimation : %s";
-static char (__pyx_k60[]) = "Cell size        : %s";
-static char (__pyx_k61[]) = "Nb iterations    : %s";
-static char (__pyx_k62[]) = "\n";
+static char (__pyx_k53[]) = "Control          :";
+static char (__pyx_k54[]) = "Surface type     : %s";
+static char (__pyx_k55[]) = "Statistics       : %s";
+static char (__pyx_k56[]) = "Trace estimation : %s";
+static char (__pyx_k57[]) = "Cell size        : %s";
+static char (__pyx_k58[]) = "Nb iterations    : %s";
+static char (__pyx_k59[]) = "\n";
 
 static PyObject *__pyx_f_6cloess_13loess_control___str__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_13loess_control___str__(PyObject *__pyx_v_self) {
@@ -1172,25 +1195,25 @@
   Py_INCREF(__pyx_v_self);
   __pyx_v_strg = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":323 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_surface); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k57p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":348 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_surface); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k54p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 349; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_statistics); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; goto __pyx_L1;}
-  __pyx_3 = PyNumber_Remainder(__pyx_k58p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_statistics); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; goto __pyx_L1;}
+  __pyx_3 = PyNumber_Remainder(__pyx_k55p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Remainder(__pyx_k59p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; goto __pyx_L1;}
+  __pyx_4 = PyNumber_Remainder(__pyx_k56p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 351; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_cell); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; goto __pyx_L1;}
-  __pyx_5 = PyNumber_Remainder(__pyx_k60p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_cell); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; goto __pyx_L1;}
+  __pyx_5 = PyNumber_Remainder(__pyx_k57p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_iterations); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; goto __pyx_L1;}
-  __pyx_6 = PyNumber_Remainder(__pyx_k61p, __pyx_1); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_iterations); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; goto __pyx_L1;}
+  __pyx_6 = PyNumber_Remainder(__pyx_k58p, __pyx_1); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyList_New(6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; goto __pyx_L1;}
-  Py_INCREF(__pyx_k56p);
-  PyList_SET_ITEM(__pyx_1, 0, __pyx_k56p);
+  __pyx_1 = PyList_New(6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; goto __pyx_L1;}
+  Py_INCREF(__pyx_k53p);
+  PyList_SET_ITEM(__pyx_1, 0, __pyx_k53p);
   PyList_SET_ITEM(__pyx_1, 1, __pyx_2);
   PyList_SET_ITEM(__pyx_1, 2, __pyx_3);
   PyList_SET_ITEM(__pyx_1, 3, __pyx_4);
@@ -1205,12 +1228,12 @@
   __pyx_v_strg = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":329 */
-  __pyx_2 = PyObject_GetAttr(__pyx_k62p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":354 */
+  __pyx_2 = PyObject_GetAttr(__pyx_k59p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; goto __pyx_L1;}
   Py_INCREF(__pyx_v_strg);
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_strg);
-  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_4;
@@ -1234,14 +1257,91 @@
   return __pyx_r;
 }
 
+static PyObject *__pyx_f_6cloess_11loess_model_setup(struct __pyx_obj_6cloess_loess_model *__pyx_v_self,loess_model (*__pyx_v_base),long __pyx_v_npar) {
+  PyObject *__pyx_r;
+  Py_INCREF(__pyx_v_self);
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":375 */
+  __pyx_v_self->_base = __pyx_v_base;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":376 */
+  __pyx_v_self->npar = __pyx_v_npar;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":386 */
+  Py_INCREF(((PyObject *)__pyx_v_self));
+  __pyx_r = ((PyObject *)__pyx_v_self);
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_self);
+  return __pyx_r;
+}
+
+static PyObject *__pyx_f_6cloess_11loess_model_9normalize___get__(PyObject *__pyx_v_self); /*proto*/
+static PyObject *__pyx_f_6cloess_11loess_model_9normalize___get__(PyObject *__pyx_v_self) {
+  PyObject *__pyx_r;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  Py_INCREF(__pyx_v_self);
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":399 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_bool); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
+  __pyx_2 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->normalize); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_2);
+  __pyx_2 = 0;
+  __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_r = __pyx_2;
+  __pyx_2 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  __Pyx_AddTraceback("cloess.loess_model.normalize.__get__");
+  __pyx_r = 0;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_self);
+  return __pyx_r;
+}
+
+static int __pyx_f_6cloess_11loess_model_9normalize___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_normalize); /*proto*/
+static int __pyx_f_6cloess_11loess_model_9normalize___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_normalize) {
+  int __pyx_r;
+  int __pyx_1;
+  Py_INCREF(__pyx_v_self);
+  Py_INCREF(__pyx_v_normalize);
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":401 */
+  __pyx_1 = PyInt_AsLong(__pyx_v_normalize); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; goto __pyx_L1;}
+  ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->normalize = __pyx_1;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  __Pyx_AddTraceback("cloess.loess_model.normalize.__set__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_self);
+  Py_DECREF(__pyx_v_normalize);
+  return __pyx_r;
+}
+
 static PyObject *__pyx_f_6cloess_11loess_model_4span___get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_11loess_model_4span___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":370 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->span); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":407 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->span); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -1257,9 +1357,9 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k63p;
+static PyObject *__pyx_k60p;
 
-static char (__pyx_k63[]) = "Span should be between 0 and 1!";
+static char (__pyx_k60[]) = "Span should be between 0 and 1!";
 
 static int __pyx_f_6cloess_11loess_model_4span___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_span); /*proto*/
 static int __pyx_f_6cloess_11loess_model_4span___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_span) {
@@ -1272,36 +1372,36 @@
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_span);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":372 */
-  __pyx_2 = PyFloat_FromDouble(0.); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_span, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":409 */
+  __pyx_2 = PyFloat_FromDouble(0.); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_span, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; goto __pyx_L1;}
   __pyx_1 = __pyx_1 <= 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   if (!__pyx_1) {
-    __pyx_2 = PyFloat_FromDouble(1.); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; goto __pyx_L1;}
-    if (PyObject_Cmp(__pyx_v_span, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; goto __pyx_L1;}
+    __pyx_2 = PyFloat_FromDouble(1.); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; goto __pyx_L1;}
+    if (PyObject_Cmp(__pyx_v_span, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; goto __pyx_L1;}
     __pyx_1 = __pyx_1 > 0;
     Py_DECREF(__pyx_2); __pyx_2 = 0;
   }
   if (__pyx_1) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":373 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; goto __pyx_L1;}
-    Py_INCREF(__pyx_k63p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k63p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":410 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; goto __pyx_L1;}
+    Py_INCREF(__pyx_k60p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k60p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 373; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":374 */
-  __pyx_5 = PyFloat_AsDouble(__pyx_v_span); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":411 */
+  __pyx_5 = PyFloat_AsDouble(__pyx_v_span); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->span = __pyx_5;
 
   __pyx_r = 0;
@@ -1324,8 +1424,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":383 */
-  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->degree); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 383; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":420 */
+  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->degree); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -1341,9 +1441,9 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k64p;
+static PyObject *__pyx_k61p;
 
-static char (__pyx_k64[]) = "Degree should be between 0 and 2!";
+static char (__pyx_k61[]) = "Degree should be between 0 and 2!";
 
 static int __pyx_f_6cloess_11loess_model_6degree___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_degree); /*proto*/
 static int __pyx_f_6cloess_11loess_model_6degree___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_degree) {
@@ -1355,30 +1455,30 @@
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_degree);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":385 */
-  __pyx_2 = PyInt_FromLong(0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_degree, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":422 */
+  __pyx_2 = PyInt_FromLong(0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_degree, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; goto __pyx_L1;}
   __pyx_1 = __pyx_1 < 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   if (!__pyx_1) {
-    __pyx_2 = PyInt_FromLong(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
-    if (PyObject_Cmp(__pyx_v_degree, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; goto __pyx_L1;}
+    __pyx_2 = PyInt_FromLong(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; goto __pyx_L1;}
+    if (PyObject_Cmp(__pyx_v_degree, __pyx_2, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; goto __pyx_L1;}
     __pyx_1 = __pyx_1 > 0;
     Py_DECREF(__pyx_2); __pyx_2 = 0;
   }
   if (__pyx_1) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":386 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; goto __pyx_L1;}
-    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; goto __pyx_L1;}
-    Py_INCREF(__pyx_k64p);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k64p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":423 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
+    Py_INCREF(__pyx_k61p);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_k61p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
@@ -1397,70 +1497,14 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_f_6cloess_11loess_model_9normalize___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_11loess_model_9normalize___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
-  PyObject *__pyx_2 = 0;
-  PyObject *__pyx_3 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":399 */
-  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_bool); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
-  __pyx_2 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->normalize); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_2);
-  __pyx_2 = 0;
-  __pyx_2 = PyObject_CallObject(__pyx_1, __pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  __pyx_r = __pyx_2;
-  __pyx_2 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  Py_XDECREF(__pyx_2);
-  Py_XDECREF(__pyx_3);
-  __Pyx_AddTraceback("cloess.loess_model.normalize.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static int __pyx_f_6cloess_11loess_model_9normalize___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_normalize); /*proto*/
-static int __pyx_f_6cloess_11loess_model_9normalize___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_normalize) {
-  int __pyx_r;
-  int __pyx_1;
-  Py_INCREF(__pyx_v_self);
-  Py_INCREF(__pyx_v_normalize);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":401 */
-  __pyx_1 = PyInt_AsLong(__pyx_v_normalize); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; goto __pyx_L1;}
-  ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->normalize = __pyx_1;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1:;
-  __Pyx_AddTraceback("cloess.loess_model.normalize.__set__");
-  __pyx_r = -1;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  Py_DECREF(__pyx_v_normalize);
-  return __pyx_r;
-}
-
 static PyObject *__pyx_f_6cloess_11loess_model_6family___get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_11loess_model_6family___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":412 */
-  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":434 */
+  __pyx_1 = PyString_FromString(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -1479,9 +1523,9 @@
 static PyObject *__pyx_n_symmetric;
 static PyObject *__pyx_n_gaussian;
 
-static PyObject *__pyx_k67p;
+static PyObject *__pyx_k64p;
 
-static char (__pyx_k67[]) = "Invalid value for the 'family' argument: should be in ('symmetric', 'gaussian').";
+static char (__pyx_k64[]) = "Invalid value for the 'family' argument: should be in ('symmetric', 'gaussian').";
 
 static int __pyx_f_6cloess_11loess_model_6family___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_family); /*proto*/
 static int __pyx_f_6cloess_11loess_model_6family___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_family) {
@@ -1494,38 +1538,38 @@
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_family);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":414 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_family, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; goto __pyx_L1;}
-  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":436 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_family, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; goto __pyx_L1;}
+  __pyx_2 = PyObject_CallObject(__pyx_1, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; goto __pyx_L1;}
   Py_INCREF(__pyx_n_symmetric);
   PyTuple_SET_ITEM(__pyx_1, 0, __pyx_n_symmetric);
   Py_INCREF(__pyx_n_gaussian);
   PyTuple_SET_ITEM(__pyx_1, 1, __pyx_n_gaussian);
-  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; goto __pyx_L1;}
+  __pyx_3 = PySequence_Contains(__pyx_1, __pyx_2); if (__pyx_3 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; goto __pyx_L1;}
   __pyx_3 = !__pyx_3;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_3) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":415 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; goto __pyx_L1;}
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; goto __pyx_L1;}
-    Py_INCREF(__pyx_k67p);
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k67p);
-    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":437 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; goto __pyx_L1;}
+    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; goto __pyx_L1;}
+    Py_INCREF(__pyx_k64p);
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k64p);
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":417 */
-  __pyx_5 = PyString_AsString(__pyx_v_family); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":439 */
+  __pyx_5 = PyString_AsString(__pyx_v_family); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->family = __pyx_5;
 
   __pyx_r = 0;
@@ -1548,8 +1592,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":428 */
-  __pyx_1 = __pyx_f_6cloess_boolarray_from_data(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar,1,((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->parametric); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":450 */
+  __pyx_1 = __pyx_f_6cloess_boolarray_from_data(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar,1,((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->parametric); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 450; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -1565,11 +1609,10 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_n_array;
+static PyObject *__pyx_n_atleast_1d;
 static PyObject *__pyx_n_copy;
 static PyObject *__pyx_n_True;
 static PyObject *__pyx_n_subok;
-static PyObject *__pyx_n_int;
 static PyObject *__pyx_n_dtype;
 static PyObject *__pyx_n_min;
 
@@ -1577,7 +1620,6 @@
 static int __pyx_f_6cloess_11loess_model_16parametric_flags___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_paramf); /*proto*/
 static int __pyx_f_6cloess_11loess_model_16parametric_flags___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_paramf) {
   PyArrayObject *__pyx_v_p_ndr;
-  long (*__pyx_v_p_dat);
   int __pyx_v_i;
   int __pyx_r;
   PyObject *__pyx_1 = 0;
@@ -1585,64 +1627,71 @@
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
   PyObject *__pyx_5 = 0;
-  long __pyx_6;
+  PyObject *__pyx_6 = 0;
+  long __pyx_7;
+  int __pyx_8;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_paramf);
   __pyx_v_p_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":433 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_array); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":454 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_atleast_1d); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_narray); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
   Py_INCREF(__pyx_v_paramf);
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_paramf);
-  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  __pyx_5 = PyObject_GetAttr(__pyx_4, __pyx_n_int); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  if (PyDict_SetItem(__pyx_3, __pyx_n_dtype, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_paramf);
+  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_4, __pyx_n_copy, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_4, __pyx_n_subok, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
+  __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; goto __pyx_L1;}
+  __pyx_6 = PyObject_GetAttr(__pyx_5, __pyx_n_bool); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
+  if (PyDict_SetItem(__pyx_4, __pyx_n_dtype, __pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_5 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_3, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_6 = PyTuple_New(1); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_6, 0, __pyx_5);
+  __pyx_5 = 0;
+  __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_p_ndr));
-  __pyx_v_p_ndr = ((PyArrayObject *)__pyx_4);
-  __pyx_4 = 0;
+  __pyx_v_p_ndr = ((PyArrayObject *)__pyx_1);
+  __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":434 */
-  __pyx_v_p_dat = ((long (*))__pyx_v_p_ndr->data);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":435 */
-  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_min); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  __pyx_2 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_p_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  __pyx_3 = PyInt_FromLong(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Subtract(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_2);
-  PyTuple_SET_ITEM(__pyx_1, 1, __pyx_4);
-  __pyx_2 = 0;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":456 */
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_min); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
+  __pyx_4 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
+  __pyx_5 = PyObject_GetAttr(((PyObject *)__pyx_v_p_ndr), __pyx_n_size); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_4);
+  PyTuple_SET_ITEM(__pyx_2, 1, __pyx_5);
   __pyx_4 = 0;
-  __pyx_3 = PyObject_CallObject(__pyx_5, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
-  Py_DECREF(__pyx_5); __pyx_5 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_6 = PyInt_AsLong(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 435; goto __pyx_L1;}
+  __pyx_5 = 0;
+  __pyx_6 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  for (__pyx_v_i = 0; __pyx_v_i < __pyx_6; ++__pyx_v_i) {
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_7 = PyInt_AsLong(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  for (__pyx_v_i = 0; __pyx_v_i < __pyx_7; ++__pyx_v_i) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":436 */
-    (((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->parametric[__pyx_v_i]) = (__pyx_v_p_dat[__pyx_v_i]);
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":457 */
+    __pyx_1 = PyInt_FromLong(__pyx_v_i); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; goto __pyx_L1;}
+    __pyx_4 = PyObject_GetItem(((PyObject *)__pyx_v_p_ndr), __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_8 = PyInt_AsLong(__pyx_4); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 457; goto __pyx_L1;}
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    (((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->parametric[__pyx_v_i]) = __pyx_8;
   }
 
   __pyx_r = 0;
@@ -1653,6 +1702,7 @@
   Py_XDECREF(__pyx_3);
   Py_XDECREF(__pyx_4);
   Py_XDECREF(__pyx_5);
+  Py_XDECREF(__pyx_6);
   __Pyx_AddTraceback("cloess.loess_model.parametric_flags.__set__");
   __pyx_r = -1;
   __pyx_L0:;
@@ -1668,8 +1718,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":447 */
-  __pyx_1 = __pyx_f_6cloess_boolarray_from_data(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar,1,((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->drop_square); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 447; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":468 */
+  __pyx_1 = __pyx_f_6cloess_boolarray_from_data(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar,1,((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->drop_square); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -1689,7 +1739,6 @@
 static int __pyx_f_6cloess_11loess_model_17drop_square_flags___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_drop_sq); /*proto*/
 static int __pyx_f_6cloess_11loess_model_17drop_square_flags___set__(PyObject *__pyx_v_self, PyObject *__pyx_v_drop_sq) {
   PyArrayObject *__pyx_v_d_ndr;
-  long (*__pyx_v_d_dat);
   int __pyx_v_i;
   int __pyx_r;
   PyObject *__pyx_1 = 0;
@@ -1697,64 +1746,71 @@
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
   PyObject *__pyx_5 = 0;
-  long __pyx_6;
+  PyObject *__pyx_6 = 0;
+  long __pyx_7;
+  int __pyx_8;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_drop_sq);
   __pyx_v_d_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":452 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_array); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":472 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_atleast_1d); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_narray); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
   Py_INCREF(__pyx_v_drop_sq);
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_drop_sq);
-  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_4 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  __pyx_5 = PyObject_GetAttr(__pyx_4, __pyx_n_int); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  if (PyDict_SetItem(__pyx_3, __pyx_n_dtype, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_drop_sq);
+  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_4, __pyx_n_copy, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_4, __pyx_n_subok, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
+  __pyx_5 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; goto __pyx_L1;}
+  __pyx_6 = PyObject_GetAttr(__pyx_5, __pyx_n_bool); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; goto __pyx_L1;}
+  Py_DECREF(__pyx_5); __pyx_5 = 0;
+  if (PyDict_SetItem(__pyx_4, __pyx_n_dtype, __pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_5 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_3, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_6 = PyTuple_New(1); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_6, 0, __pyx_5);
+  __pyx_5 = 0;
+  __pyx_1 = PyObject_CallObject(__pyx_2, __pyx_6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_d_ndr));
-  __pyx_v_d_ndr = ((PyArrayObject *)__pyx_4);
-  __pyx_4 = 0;
+  __pyx_v_d_ndr = ((PyArrayObject *)__pyx_1);
+  __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":453 */
-  __pyx_v_d_dat = ((long (*))__pyx_v_d_ndr->data);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":454 */
-  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_min); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  __pyx_2 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_d_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  __pyx_3 = PyInt_FromLong(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Subtract(__pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  __pyx_1 = PyTuple_New(2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_2);
-  PyTuple_SET_ITEM(__pyx_1, 1, __pyx_4);
-  __pyx_2 = 0;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":474 */
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_min); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  __pyx_4 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  __pyx_5 = PyObject_GetAttr(((PyObject *)__pyx_v_d_ndr), __pyx_n_size); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_4);
+  PyTuple_SET_ITEM(__pyx_2, 1, __pyx_5);
   __pyx_4 = 0;
-  __pyx_3 = PyObject_CallObject(__pyx_5, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
-  Py_DECREF(__pyx_5); __pyx_5 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_6 = PyInt_AsLong(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; goto __pyx_L1;}
+  __pyx_5 = 0;
+  __pyx_6 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  for (__pyx_v_i = 0; __pyx_v_i < __pyx_6; ++__pyx_v_i) {
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_7 = PyInt_AsLong(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  for (__pyx_v_i = 0; __pyx_v_i < __pyx_7; ++__pyx_v_i) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":455 */
-    (((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->drop_square[__pyx_v_i]) = (__pyx_v_d_dat[__pyx_v_i]);
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":475 */
+    __pyx_1 = PyInt_FromLong(__pyx_v_i); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; goto __pyx_L1;}
+    __pyx_4 = PyObject_GetItem(((PyObject *)__pyx_v_d_ndr), __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_8 = PyInt_AsLong(__pyx_4); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; goto __pyx_L1;}
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    (((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->_base->drop_square[__pyx_v_i]) = __pyx_8;
   }
 
   __pyx_r = 0;
@@ -1765,6 +1821,7 @@
   Py_XDECREF(__pyx_3);
   Py_XDECREF(__pyx_4);
   Py_XDECREF(__pyx_5);
+  Py_XDECREF(__pyx_6);
   __Pyx_AddTraceback("cloess.loess_model.drop_square_flags.__set__");
   __pyx_r = -1;
   __pyx_L0:;
@@ -1813,146 +1870,146 @@
   __pyx_v_parametric = Py_None; Py_INCREF(Py_None);
   __pyx_v_drop_square = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":458 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":478 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
   Py_INCREF(__pyx_n_family);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_family);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_family);
   __pyx_v_family = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":459 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":479 */
   __pyx_4 = __pyx_v_family != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":460 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_family, __pyx_v_family) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":480 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_family, __pyx_v_family) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; goto __pyx_L1;}
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":462 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":482 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; goto __pyx_L1;}
   Py_INCREF(__pyx_n_span);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_span);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 482; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_span);
   __pyx_v_span = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":463 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":483 */
   __pyx_4 = __pyx_v_span != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":464 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_span, __pyx_v_span) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":484 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_span, __pyx_v_span) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 484; goto __pyx_L1;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":466 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":486 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
   Py_INCREF(__pyx_n_degree);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_degree);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_degree);
   __pyx_v_degree = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":467 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":487 */
   __pyx_4 = __pyx_v_degree != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":468 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_degree, __pyx_v_degree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 468; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":488 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_degree, __pyx_v_degree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; goto __pyx_L1;}
     goto __pyx_L4;
   }
   __pyx_L4:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":470 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":490 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
   Py_INCREF(__pyx_n_normalize);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_normalize);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_normalize);
   __pyx_v_normalize = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":471 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":491 */
   __pyx_4 = __pyx_v_normalize != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":472 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_normalize, __pyx_v_normalize) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 472; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":492 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_normalize, __pyx_v_normalize) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
     goto __pyx_L5;
   }
   __pyx_L5:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":474 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":494 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
   Py_INCREF(__pyx_n_parametric);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_parametric);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_parametric);
   __pyx_v_parametric = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":475 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":495 */
   __pyx_4 = __pyx_v_parametric != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":476 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_parametric_flags, __pyx_v_parametric) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 476; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":496 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_parametric_flags, __pyx_v_parametric) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; goto __pyx_L1;}
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":478 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":498 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_modelargs, __pyx_n_get); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; goto __pyx_L1;}
   Py_INCREF(__pyx_n_drop_square);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_n_drop_square);
   Py_INCREF(Py_None);
   PyTuple_SET_ITEM(__pyx_2, 1, Py_None);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_v_drop_square);
   __pyx_v_drop_square = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":479 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":499 */
   __pyx_4 = __pyx_v_drop_square != Py_None;
   if (__pyx_4) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":480 */
-    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_drop_square_flags, __pyx_v_drop_square) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":500 */
+    if (PyObject_SetAttr(__pyx_v_self, __pyx_n_drop_square_flags, __pyx_v_drop_square) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; goto __pyx_L1;}
     goto __pyx_L7;
   }
   __pyx_L7:;
@@ -1981,9 +2038,9 @@
 
 static PyObject *__pyx_n_id;
 
-static PyObject *__pyx_k80p;
+static PyObject *__pyx_k77p;
 
-static char (__pyx_k80[]) = "loess model parameters @%s";
+static char (__pyx_k77[]) = "loess model parameters @%s";
 
 static PyObject *__pyx_f_6cloess_11loess_model___repr__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_11loess_model___repr__(PyObject *__pyx_v_self) {
@@ -1993,15 +2050,15 @@
   PyObject *__pyx_3 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":483 */
-  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_id); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":503 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_id); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
   Py_INCREF(__pyx_v_self);
   PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_self);
-  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; goto __pyx_L1;}
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_1 = PyNumber_Remainder(__pyx_k80p, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 483; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k77p, __pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; goto __pyx_L1;}
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
@@ -2020,23 +2077,23 @@
   return __pyx_r;
 }
 
+static PyObject *__pyx_k78p;
+static PyObject *__pyx_k79p;
+static PyObject *__pyx_k80p;
 static PyObject *__pyx_k81p;
 static PyObject *__pyx_k82p;
 static PyObject *__pyx_k83p;
 static PyObject *__pyx_k84p;
 static PyObject *__pyx_k85p;
-static PyObject *__pyx_k86p;
-static PyObject *__pyx_k87p;
-static PyObject *__pyx_k88p;
 
-static char (__pyx_k81[]) = "Model parameters.....";
-static char (__pyx_k82[]) = "family      : %s";
-static char (__pyx_k83[]) = "span        : %s";
-static char (__pyx_k84[]) = "degree      : %s";
-static char (__pyx_k85[]) = "normalized  : %s";
-static char (__pyx_k86[]) = "parametric  : %s";
-static char (__pyx_k87[]) = "drop_square : %s";
-static char (__pyx_k88[]) = "\n";
+static char (__pyx_k78[]) = "Model parameters.....";
+static char (__pyx_k79[]) = "family      : %s";
+static char (__pyx_k80[]) = "span        : %s";
+static char (__pyx_k81[]) = "degree      : %s";
+static char (__pyx_k82[]) = "normalized  : %s";
+static char (__pyx_k83[]) = "parametric  : %s";
+static char (__pyx_k84[]) = "drop_square : %s";
+static char (__pyx_k85[]) = "\n";
 
 static PyObject *__pyx_f_6cloess_11loess_model___str__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_11loess_model___str__(PyObject *__pyx_v_self) {
@@ -2052,32 +2109,32 @@
   Py_INCREF(__pyx_v_self);
   __pyx_v_strg = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":486 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k82p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":506 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k79p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_span); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; goto __pyx_L1;}
-  __pyx_3 = PyNumber_Remainder(__pyx_k83p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_span); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
+  __pyx_3 = PyNumber_Remainder(__pyx_k80p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_degree); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Remainder(__pyx_k84p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_degree); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; goto __pyx_L1;}
+  __pyx_4 = PyNumber_Remainder(__pyx_k81p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_normalize); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
-  __pyx_5 = PyNumber_Remainder(__pyx_k85p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 490; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_normalize); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
+  __pyx_5 = PyNumber_Remainder(__pyx_k82p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_parametric_flags); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
-  __pyx_6 = PySequence_GetSlice(__pyx_1, 0, ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_parametric_flags); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
+  __pyx_6 = PySequence_GetSlice(__pyx_1, 0, ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyNumber_Remainder(__pyx_k86p, __pyx_6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k83p, __pyx_6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; goto __pyx_L1;}
   Py_DECREF(__pyx_6); __pyx_6 = 0;
-  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_drop_square_flags); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
-  __pyx_7 = PySequence_GetSlice(__pyx_6, 0, ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
+  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_drop_square_flags); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
+  __pyx_7 = PySequence_GetSlice(__pyx_6, 0, ((struct __pyx_obj_6cloess_loess_model *)__pyx_v_self)->npar); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
   Py_DECREF(__pyx_6); __pyx_6 = 0;
-  __pyx_6 = PyNumber_Remainder(__pyx_k87p, __pyx_7); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 492; goto __pyx_L1;}
+  __pyx_6 = PyNumber_Remainder(__pyx_k84p, __pyx_7); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; goto __pyx_L1;}
   Py_DECREF(__pyx_7); __pyx_7 = 0;
-  __pyx_7 = PyList_New(7); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; goto __pyx_L1;}
-  Py_INCREF(__pyx_k81p);
-  PyList_SET_ITEM(__pyx_7, 0, __pyx_k81p);
+  __pyx_7 = PyList_New(7); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; goto __pyx_L1;}
+  Py_INCREF(__pyx_k78p);
+  PyList_SET_ITEM(__pyx_7, 0, __pyx_k78p);
   PyList_SET_ITEM(__pyx_7, 1, __pyx_2);
   PyList_SET_ITEM(__pyx_7, 2, __pyx_3);
   PyList_SET_ITEM(__pyx_7, 3, __pyx_4);
@@ -2094,12 +2151,12 @@
   __pyx_v_strg = __pyx_7;
   __pyx_7 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":494 */
-  __pyx_2 = PyObject_GetAttr(__pyx_k88p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":514 */
+  __pyx_2 = PyObject_GetAttr(__pyx_k85p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; goto __pyx_L1;}
   Py_INCREF(__pyx_v_strg);
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_strg);
-  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_4;
@@ -2130,8 +2187,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":510 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->fitted_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 510; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":530 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->fitted_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2153,8 +2210,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":518 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->fitted_residuals); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":538 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->fitted_residuals); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2176,8 +2233,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":527 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->pseudovalues); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 527; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":547 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->pseudovalues); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 547; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2199,8 +2256,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":535 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->diagonal); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 535; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":555 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->diagonal); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2222,8 +2279,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":543 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->robust); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":563 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->nobs,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->robust); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 563; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2239,20 +2296,14 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_n_nvar;
-
 static PyObject *__pyx_f_6cloess_13loess_outputs_7divisor___get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_13loess_outputs_7divisor___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
-  int __pyx_2;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":548 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_nvar); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; goto __pyx_L1;}
-  __pyx_2 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(__pyx_2,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->divisor); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":568 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->npar,1,((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->divisor); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2274,8 +2325,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":556 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":576 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2297,8 +2348,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":564 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->s); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":584 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->s); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2320,8 +2371,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":572 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->one_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 572; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":592 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->one_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2343,8 +2394,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":580 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->two_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 580; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":600 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->two_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 600; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2366,8 +2417,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":588 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 588; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":608 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_outputs *)__pyx_v_self)->_base->trace_hat); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 608; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2391,23 +2442,23 @@
 static PyObject *__pyx_n_two_delta;
 static PyObject *__pyx_n_divisor;
 
+static PyObject *__pyx_k86p;
+static PyObject *__pyx_k87p;
+static PyObject *__pyx_k88p;
 static PyObject *__pyx_k89p;
 static PyObject *__pyx_k90p;
 static PyObject *__pyx_k91p;
 static PyObject *__pyx_k92p;
 static PyObject *__pyx_k93p;
-static PyObject *__pyx_k94p;
-static PyObject *__pyx_k95p;
-static PyObject *__pyx_k96p;
 
-static char (__pyx_k89[]) = "Outputs................";
-static char (__pyx_k90[]) = "Fitted values         : %s\n";
-static char (__pyx_k91[]) = "Fitted residuals      : %s\n";
-static char (__pyx_k92[]) = "Eqv. nb of parameters : %s";
-static char (__pyx_k93[]) = "Residual error        : %s";
-static char (__pyx_k94[]) = "Deltas                : %s - %s";
-static char (__pyx_k95[]) = "Normalization factors : %s";
-static char (__pyx_k96[]) = "\n";
+static char (__pyx_k86[]) = "Outputs................";
+static char (__pyx_k87[]) = "Fitted values         : %s\n";
+static char (__pyx_k88[]) = "Fitted residuals      : %s\n";
+static char (__pyx_k89[]) = "Eqv. nb of parameters : %s";
+static char (__pyx_k90[]) = "Residual error        : %s";
+static char (__pyx_k91[]) = "Deltas                : %s - %s";
+static char (__pyx_k92[]) = "Normalization factors : %s";
+static char (__pyx_k93[]) = "\n";
 
 static PyObject *__pyx_f_6cloess_13loess_outputs___str__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_13loess_outputs___str__(PyObject *__pyx_v_self) {
@@ -2423,34 +2474,34 @@
   Py_INCREF(__pyx_v_self);
   __pyx_v_strg = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":591 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_fitted_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k90p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":611 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_fitted_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k87p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 612; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_fitted_residuals); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
-  __pyx_3 = PyNumber_Remainder(__pyx_k91p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 593; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_fitted_residuals); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; goto __pyx_L1;}
+  __pyx_3 = PyNumber_Remainder(__pyx_k88p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 613; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Remainder(__pyx_k92p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; goto __pyx_L1;}
+  __pyx_4 = PyNumber_Remainder(__pyx_k89p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; goto __pyx_L1;}
-  __pyx_5 = PyNumber_Remainder(__pyx_k93p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_s); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; goto __pyx_L1;}
+  __pyx_5 = PyNumber_Remainder(__pyx_k90p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_one_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; goto __pyx_L1;}
-  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_two_delta); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; goto __pyx_L1;}
-  __pyx_7 = PyTuple_New(2); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_one_delta); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; goto __pyx_L1;}
+  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_two_delta); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; goto __pyx_L1;}
+  __pyx_7 = PyTuple_New(2); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; goto __pyx_L1;}
   PyTuple_SET_ITEM(__pyx_7, 0, __pyx_1);
   PyTuple_SET_ITEM(__pyx_7, 1, __pyx_6);
   __pyx_1 = 0;
   __pyx_6 = 0;
-  __pyx_1 = PyNumber_Remainder(__pyx_k94p, __pyx_7); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 596; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Remainder(__pyx_k91p, __pyx_7); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 616; goto __pyx_L1;}
   Py_DECREF(__pyx_7); __pyx_7 = 0;
-  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_divisor); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; goto __pyx_L1;}
-  __pyx_7 = PyNumber_Remainder(__pyx_k95p, __pyx_6); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 597; goto __pyx_L1;}
+  __pyx_6 = PyObject_GetAttr(__pyx_v_self, __pyx_n_divisor); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; goto __pyx_L1;}
+  __pyx_7 = PyNumber_Remainder(__pyx_k92p, __pyx_6); if (!__pyx_7) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; goto __pyx_L1;}
   Py_DECREF(__pyx_6); __pyx_6 = 0;
-  __pyx_6 = PyList_New(7); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; goto __pyx_L1;}
-  Py_INCREF(__pyx_k89p);
-  PyList_SET_ITEM(__pyx_6, 0, __pyx_k89p);
+  __pyx_6 = PyList_New(7); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; goto __pyx_L1;}
+  Py_INCREF(__pyx_k86p);
+  PyList_SET_ITEM(__pyx_6, 0, __pyx_k86p);
   PyList_SET_ITEM(__pyx_6, 1, __pyx_2);
   PyList_SET_ITEM(__pyx_6, 2, __pyx_3);
   PyList_SET_ITEM(__pyx_6, 3, __pyx_4);
@@ -2467,12 +2518,12 @@
   __pyx_v_strg = __pyx_6;
   __pyx_6 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":598 */
-  __pyx_2 = PyObject_GetAttr(__pyx_k96p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":618 */
+  __pyx_2 = PyObject_GetAttr(__pyx_k93p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; goto __pyx_L1;}
   Py_INCREF(__pyx_v_strg);
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_strg);
-  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 598; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_4;
@@ -2497,212 +2548,52 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_f_6cloess_11loess_anova_3dfn___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_11loess_anova_3dfn___get__(PyObject *__pyx_v_self) {
+static PyObject *__pyx_f_6cloess_14conf_intervals_setup(struct __pyx_obj_6cloess_conf_intervals *__pyx_v_self,conf_inv __pyx_v_base,long __pyx_v_nest) {
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":610 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_anova *)__pyx_v_self)->_base->dfn); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 610; goto __pyx_L1;}
-  __pyx_r = __pyx_1;
-  __pyx_1 = 0;
-  goto __pyx_L0;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":633 */
+  __pyx_v_self->_base = __pyx_v_base;
 
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  __Pyx_AddTraceback("cloess.loess_anova.dfn.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static PyObject *__pyx_f_6cloess_11loess_anova_3dfd___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_11loess_anova_3dfd___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":614 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_anova *)__pyx_v_self)->_base->dfd); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; goto __pyx_L1;}
-  __pyx_r = __pyx_1;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":634 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(__pyx_v_nest,1,__pyx_v_base.fit); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 634; goto __pyx_L1;}
+  Py_DECREF(((PyObject *)__pyx_v_self->fit));
+  __pyx_v_self->fit = ((PyArrayObject *)__pyx_1);
   __pyx_1 = 0;
-  goto __pyx_L0;
 
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  __Pyx_AddTraceback("cloess.loess_anova.dfd.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static PyObject *__pyx_f_6cloess_11loess_anova_7F_value___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_11loess_anova_7F_value___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":618 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_anova *)__pyx_v_self)->_base->F_value); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 618; goto __pyx_L1;}
-  __pyx_r = __pyx_1;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":635 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(__pyx_v_nest,1,__pyx_v_base.upper); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 635; goto __pyx_L1;}
+  Py_DECREF(((PyObject *)__pyx_v_self->upper));
+  __pyx_v_self->upper = ((PyArrayObject *)__pyx_1);
   __pyx_1 = 0;
-  goto __pyx_L0;
 
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  __Pyx_AddTraceback("cloess.loess_anova.F_value.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static PyObject *__pyx_f_6cloess_11loess_anova_4Pr_F___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_11loess_anova_4Pr_F___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  PyObject *__pyx_1 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":622 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_anova *)__pyx_v_self)->_base->Pr_F); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 622; goto __pyx_L1;}
-  __pyx_r = __pyx_1;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":636 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(__pyx_v_nest,1,__pyx_v_base.lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 636; goto __pyx_L1;}
+  Py_DECREF(((PyObject *)__pyx_v_self->lower));
+  __pyx_v_self->lower = ((PyArrayObject *)__pyx_1);
   __pyx_1 = 0;
-  goto __pyx_L0;
 
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1:;
   Py_XDECREF(__pyx_1);
-  __Pyx_AddTraceback("cloess.loess_anova.Pr_F.__get__");
+  __Pyx_AddTraceback("cloess.conf_intervals.setup");
   __pyx_r = 0;
   __pyx_L0:;
   Py_DECREF(__pyx_v_self);
   return __pyx_r;
 }
 
-static PyObject *__pyx_n_pw_free_mem;
-
-static void __pyx_f_6cloess_14conf_intervals___dealloc__(PyObject *__pyx_v_self); /*proto*/
-static void __pyx_f_6cloess_14conf_intervals___dealloc__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_1 = 0;
-  PyObject *__pyx_2 = 0;
-  PyObject *__pyx_3 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":632 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_c_loess); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_pw_free_mem); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; goto __pyx_L1;}
-  Py_INCREF(__pyx_v_self);
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_self);
-  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_1);
-  Py_XDECREF(__pyx_2);
-  Py_XDECREF(__pyx_3);
-  __Pyx_AddTraceback("cloess.conf_intervals.__dealloc__");
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-}
-
-static PyObject *__pyx_f_6cloess_14conf_intervals_3fit___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_14conf_intervals_3fit___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  int __pyx_1;
-  PyObject *__pyx_2 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":640 */
-  __pyx_1 = PyInt_AsLong(((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->nest); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
-  __pyx_2 = __pyx_f_6cloess_floatarray_from_data(__pyx_1,1,((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->_base.fit); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
-  __pyx_r = __pyx_2;
-  __pyx_2 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_2);
-  __Pyx_AddTraceback("cloess.conf_intervals.fit.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static PyObject *__pyx_f_6cloess_14conf_intervals_5upper___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_14conf_intervals_5upper___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  int __pyx_1;
-  PyObject *__pyx_2 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":648 */
-  __pyx_1 = PyInt_AsLong(((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->nest); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 648; goto __pyx_L1;}
-  __pyx_2 = __pyx_f_6cloess_floatarray_from_data(__pyx_1,1,((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->_base.upper); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 648; goto __pyx_L1;}
-  __pyx_r = __pyx_2;
-  __pyx_2 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_2);
-  __Pyx_AddTraceback("cloess.conf_intervals.upper.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
-static PyObject *__pyx_f_6cloess_14conf_intervals_5lower___get__(PyObject *__pyx_v_self); /*proto*/
-static PyObject *__pyx_f_6cloess_14conf_intervals_5lower___get__(PyObject *__pyx_v_self) {
-  PyObject *__pyx_r;
-  int __pyx_1;
-  PyObject *__pyx_2 = 0;
-  Py_INCREF(__pyx_v_self);
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":656 */
-  __pyx_1 = PyInt_AsLong(((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->nest); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; goto __pyx_L1;}
-  __pyx_2 = __pyx_f_6cloess_floatarray_from_data(__pyx_1,1,((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->_base.lower); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; goto __pyx_L1;}
-  __pyx_r = __pyx_2;
-  __pyx_2 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; Py_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1:;
-  Py_XDECREF(__pyx_2);
-  __Pyx_AddTraceback("cloess.conf_intervals.lower.__get__");
-  __pyx_r = 0;
-  __pyx_L0:;
-  Py_DECREF(__pyx_v_self);
-  return __pyx_r;
-}
-
 static PyObject *__pyx_n_r_;
-static PyObject *__pyx_n_fit;
-static PyObject *__pyx_n_upper;
 static PyObject *__pyx_n_T;
 
-static PyObject *__pyx_k97p;
+static PyObject *__pyx_k94p;
 
-static char (__pyx_k97[]) = "Confidence intervals....\nLower b./ fit / upper b.\n%s";
+static char (__pyx_k94[]) = "Confidence intervals....\nLower b./ fit / upper b.\n%s";
 
 static PyObject *__pyx_f_6cloess_14conf_intervals___str__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_14conf_intervals___str__(PyObject *__pyx_v_self) {
@@ -2711,39 +2602,34 @@
   PyObject *__pyx_1 = 0;
   PyObject *__pyx_2 = 0;
   PyObject *__pyx_3 = 0;
-  PyObject *__pyx_4 = 0;
-  PyObject *__pyx_5 = 0;
   Py_INCREF(__pyx_v_self);
   __pyx_v_tmp_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":660 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_r_); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":640 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_r_); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_lower); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
-  __pyx_3 = PyObject_GetAttr(__pyx_v_self, __pyx_n_fit); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
-  __pyx_4 = PyObject_GetAttr(__pyx_v_self, __pyx_n_upper); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
-  __pyx_5 = PyList_New(3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
-  PyList_SET_ITEM(__pyx_5, 0, __pyx_1);
-  PyList_SET_ITEM(__pyx_5, 1, __pyx_3);
-  PyList_SET_ITEM(__pyx_5, 2, __pyx_4);
-  __pyx_1 = 0;
-  __pyx_3 = 0;
-  __pyx_4 = 0;
-  __pyx_1 = PyObject_GetItem(__pyx_2, __pyx_5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
+  __pyx_1 = PyList_New(3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
+  Py_INCREF(((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->lower));
+  PyList_SET_ITEM(__pyx_1, 0, ((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->lower));
+  Py_INCREF(((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->fit));
+  PyList_SET_ITEM(__pyx_1, 1, ((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->fit));
+  Py_INCREF(((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->upper));
+  PyList_SET_ITEM(__pyx_1, 2, ((PyObject *)((struct __pyx_obj_6cloess_conf_intervals *)__pyx_v_self)->upper));
+  __pyx_3 = PyObject_GetItem(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_5); __pyx_5 = 0;
-  __pyx_3 = PyObject_GetAttr(__pyx_1, __pyx_n_T); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 660; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_3, __pyx_n_T); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_tmp_ndr));
-  __pyx_v_tmp_ndr = ((PyArrayObject *)__pyx_3);
-  __pyx_3 = 0;
+  __pyx_v_tmp_ndr = ((PyArrayObject *)__pyx_2);
+  __pyx_2 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":661 */
-  __pyx_4 = PyNumber_Remainder(__pyx_k97p, ((PyObject *)__pyx_v_tmp_ndr)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 661; goto __pyx_L1;}
-  __pyx_r = __pyx_4;
-  __pyx_4 = 0;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":641 */
+  __pyx_1 = PyNumber_Remainder(__pyx_k94p, ((PyObject *)__pyx_v_tmp_ndr)); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 641; goto __pyx_L1;}
+  __pyx_r = __pyx_1;
+  __pyx_1 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; Py_INCREF(Py_None);
@@ -2752,8 +2638,6 @@
   Py_XDECREF(__pyx_1);
   Py_XDECREF(__pyx_2);
   Py_XDECREF(__pyx_3);
-  Py_XDECREF(__pyx_4);
-  Py_XDECREF(__pyx_5);
   __Pyx_AddTraceback("cloess.conf_intervals.__str__");
   __pyx_r = 0;
   __pyx_L0:;
@@ -2766,20 +2650,35 @@
 static void __pyx_f_6cloess_15loess_predicted___dealloc__(PyObject *__pyx_v_self) {
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":674 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":655 */
   pred_free_mem((&((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base));
 
   Py_DECREF(__pyx_v_self);
 }
 
+static PyObject *__pyx_f_6cloess_15loess_predicted_setup(struct __pyx_obj_6cloess_loess_predicted *__pyx_v_self,prediction __pyx_v_base,long __pyx_v_nest) {
+  PyObject *__pyx_r;
+  Py_INCREF(__pyx_v_self);
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":658 */
+  __pyx_v_self->_base = __pyx_v_base;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":659 */
+  __pyx_v_self->nest = __pyx_v_nest;
+
+  __pyx_r = Py_None; Py_INCREF(Py_None);
+  Py_DECREF(__pyx_v_self);
+  return __pyx_r;
+}
+
 static PyObject *__pyx_f_6cloess_15loess_predicted_6values___get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_15loess_predicted_6values___get__(PyObject *__pyx_v_self) {
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":682 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,1,((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.fit); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 682; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":693 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,1,((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.fit); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 693; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2801,8 +2700,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":691 */
-  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,1,((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.se_fit); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":702 */
+  __pyx_1 = __pyx_f_6cloess_floatarray_from_data(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,1,((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.se_fit); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2824,8 +2723,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":699 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.residual_scale); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":710 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.residual_scale); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2847,8 +2746,8 @@
   PyObject *__pyx_1 = 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":708 */
-  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.df); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":719 */
+  __pyx_1 = PyFloat_FromDouble(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base.df); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; goto __pyx_L1;}
   __pyx_r = __pyx_1;
   __pyx_1 = 0;
   goto __pyx_L0;
@@ -2864,15 +2763,15 @@
   return __pyx_r;
 }
 
-static PyObject *__pyx_k98p;
+static PyObject *__pyx_k95p;
 
-static char (__pyx_k98[]) = "The coverage precentage should be between 0 and 1!";
+static char (__pyx_k95[]) = "The coverage precentage should be between 0 and 1!";
 
 static PyObject *__pyx_f_6cloess_15loess_predicted_confidence(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_6cloess_15loess_predicted_confidence[] = "Returns the pointwise confidence intervals for each predicted values,\nat the given confidence interval coverage.\n        \n:Parameters:\n    coverage : float\n        Confidence level of the confidence intervals limits, as a fraction.\n        ";
 static PyObject *__pyx_f_6cloess_15loess_predicted_confidence(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_coverage = 0;
-  conf_inv __pyx_v__conf_intv;
+  conf_inv __pyx_v__confintv;
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   int __pyx_2;
@@ -2880,21 +2779,21 @@
   PyObject *__pyx_4 = 0;
   double __pyx_5;
   static char *__pyx_argnames[] = {"coverage",0};
-  __pyx_v_coverage = __pyx_k35;
+  __pyx_v_coverage = __pyx_k32;
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "|O", __pyx_argnames, &__pyx_v_coverage)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_coverage);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":719 */
-  __pyx_1 = PyFloat_FromDouble(0.5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_coverage, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":730 */
+  __pyx_1 = PyFloat_FromDouble(0.5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 730; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_coverage, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 730; goto __pyx_L1;}
   __pyx_2 = __pyx_2 < 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":720 */
-    __pyx_1 = PyFloat_FromDouble(1.); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; goto __pyx_L1;}
-    __pyx_3 = PyNumber_Subtract(__pyx_1, __pyx_v_coverage); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":731 */
+    __pyx_1 = PyFloat_FromDouble(1.); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; goto __pyx_L1;}
+    __pyx_3 = PyNumber_Subtract(__pyx_1, __pyx_v_coverage); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     Py_DECREF(__pyx_v_coverage);
     __pyx_v_coverage = __pyx_3;
@@ -2903,49 +2802,44 @@
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":721 */
-  __pyx_1 = PyFloat_FromDouble(1.); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 721; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_coverage, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 721; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":732 */
+  __pyx_1 = PyFloat_FromDouble(1.); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_coverage, __pyx_1, &__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; goto __pyx_L1;}
   __pyx_2 = __pyx_2 > 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_2) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":722 */
-    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; goto __pyx_L1;}
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; goto __pyx_L1;}
-    Py_INCREF(__pyx_k98p);
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k98p);
-    __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":733 */
+    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
+    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
+    Py_INCREF(__pyx_k95p);
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_k95p);
+    __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
     __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; goto __pyx_L1;}
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":723 */
-  __pyx_5 = PyFloat_AsDouble(__pyx_v_coverage); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 723; goto __pyx_L1;}
-  pointwise((&((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base),((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,__pyx_5,(&__pyx_v__conf_intv));
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":734 */
+  __pyx_5 = PyFloat_AsDouble(__pyx_v_coverage); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 734; goto __pyx_L1;}
+  pointwise((&((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->_base),((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest,__pyx_5,(&__pyx_v__confintv));
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":724 */
-  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_conf_intervals), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_conf_intervals)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":735 */
+  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_conf_intervals), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_conf_intervals)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals));
   ((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals = ((struct __pyx_obj_6cloess_conf_intervals *)__pyx_3);
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":725 */
-  ((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals->_base = __pyx_v__conf_intv;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":736 */
+  __pyx_1 = ((struct __pyx_vtabstruct_6cloess_conf_intervals *)((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals->__pyx_vtab)->setup(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals,__pyx_v__confintv,((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":726 */
-  __pyx_1 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->nest); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 726; goto __pyx_L1;}
-  Py_DECREF(((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals->nest);
-  ((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals->nest = __pyx_1;
-  __pyx_1 = 0;
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":727 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":737 */
   Py_INCREF(((PyObject *)((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals));
   __pyx_r = ((PyObject *)((struct __pyx_obj_6cloess_loess_predicted *)__pyx_v_self)->confidence_intervals);
   goto __pyx_L0;
@@ -2969,19 +2863,19 @@
 static PyObject *__pyx_n_residual_scale;
 static PyObject *__pyx_n_df;
 
+static PyObject *__pyx_k96p;
+static PyObject *__pyx_k97p;
+static PyObject *__pyx_k98p;
 static PyObject *__pyx_k99p;
 static PyObject *__pyx_k100p;
 static PyObject *__pyx_k101p;
-static PyObject *__pyx_k102p;
-static PyObject *__pyx_k103p;
-static PyObject *__pyx_k104p;
 
-static char (__pyx_k99[]) = "Outputs................";
-static char (__pyx_k100[]) = "Predicted values      : %s\n";
-static char (__pyx_k101[]) = "Predicted std error   : %s\n";
-static char (__pyx_k102[]) = "Residual scale        : %s";
-static char (__pyx_k103[]) = "Degrees of freedom    : %s";
-static char (__pyx_k104[]) = "\n";
+static char (__pyx_k96[]) = "Outputs................";
+static char (__pyx_k97[]) = "Predicted values      : %s\n";
+static char (__pyx_k98[]) = "Predicted std error   : %s\n";
+static char (__pyx_k99[]) = "Residual scale        : %s";
+static char (__pyx_k100[]) = "Degrees of freedom    : %s";
+static char (__pyx_k101[]) = "\n";
 
 static PyObject *__pyx_f_6cloess_15loess_predicted___str__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_f_6cloess_15loess_predicted___str__(PyObject *__pyx_v_self) {
@@ -2995,22 +2889,22 @@
   Py_INCREF(__pyx_v_self);
   __pyx_v_strg = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":730 */
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k100p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":740 */
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_values); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k97p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 741; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_stderr); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; goto __pyx_L1;}
-  __pyx_3 = PyNumber_Remainder(__pyx_k101p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_stderr); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; goto __pyx_L1;}
+  __pyx_3 = PyNumber_Remainder(__pyx_k98p, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_residual_scale); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
-  __pyx_4 = PyNumber_Remainder(__pyx_k102p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_residual_scale); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; goto __pyx_L1;}
+  __pyx_4 = PyNumber_Remainder(__pyx_k99p, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_df); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 734; goto __pyx_L1;}
-  __pyx_5 = PyNumber_Remainder(__pyx_k103p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 734; goto __pyx_L1;}
+  __pyx_1 = PyObject_GetAttr(__pyx_v_self, __pyx_n_df); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; goto __pyx_L1;}
+  __pyx_5 = PyNumber_Remainder(__pyx_k100p, __pyx_1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyList_New(5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 730; goto __pyx_L1;}
-  Py_INCREF(__pyx_k99p);
-  PyList_SET_ITEM(__pyx_1, 0, __pyx_k99p);
+  __pyx_1 = PyList_New(5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 740; goto __pyx_L1;}
+  Py_INCREF(__pyx_k96p);
+  PyList_SET_ITEM(__pyx_1, 0, __pyx_k96p);
   PyList_SET_ITEM(__pyx_1, 1, __pyx_2);
   PyList_SET_ITEM(__pyx_1, 2, __pyx_3);
   PyList_SET_ITEM(__pyx_1, 3, __pyx_4);
@@ -3023,12 +2917,12 @@
   __pyx_v_strg = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":737 */
-  __pyx_2 = PyObject_GetAttr(__pyx_k104p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 737; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 737; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":747 */
+  __pyx_2 = PyObject_GetAttr(__pyx_k101p, __pyx_n_join); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; goto __pyx_L1;}
   Py_INCREF(__pyx_v_strg);
   PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_strg);
-  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 737; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 747; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
   __pyx_r = __pyx_4;
@@ -3057,9 +2951,9 @@
 static PyObject *__pyx_n_iteritems;
 static PyObject *__pyx_n_update;
 
-static PyObject *__pyx_k113p;
+static PyObject *__pyx_k110p;
 
-static char (__pyx_k113[]) = "Incompatible size between the response array (%i) and the predictor array (%i)";
+static char (__pyx_k110[]) = "Incompatible size between the response array (%i) and the predictor array (%i)";
 
 static int __pyx_f_6cloess_5loess___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_f_6cloess_5loess___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -3086,7 +2980,7 @@
   int __pyx_6;
   long __pyx_7;
   static char *__pyx_argnames[] = {"x","y","weights",0};
-  __pyx_v_weights = __pyx_k36;
+  __pyx_v_weights = __pyx_k33;
   if (__Pyx_GetStarArgs(&__pyx_args, &__pyx_kwds, __pyx_argnames, 3, 0, &__pyx_v_options) < 0) return -1;
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OO|O", __pyx_argnames, &__pyx_v_x, &__pyx_v_y, &__pyx_v_weights)) {
     Py_XDECREF(__pyx_args);
@@ -3107,268 +3001,262 @@
   __pyx_v_k = Py_None; Py_INCREF(Py_None);
   __pyx_v_v = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":759 */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_array); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":769 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_narray); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
   Py_INCREF(__pyx_v_x);
-  PyTuple_SET_ITEM(__pyx_1, 0, __pyx_v_x);
-  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_x);
+  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
+  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
-  if (PyDict_SetItem(__pyx_3, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
-  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_1, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_x_ndr));
   __pyx_v_x_ndr = ((PyArrayObject *)__pyx_4);
   __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":760 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":770 */
   __pyx_v_x_dat = ((double (*))__pyx_v_x_ndr->data);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":761 */
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; goto __pyx_L1;}
-  __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":771 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; goto __pyx_L1;}
   Py_INCREF(((PyObject *)__pyx_v_x_ndr));
-  PyTuple_SET_ITEM(__pyx_1, 0, ((PyObject *)__pyx_v_x_ndr));
-  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_2, 0, ((PyObject *)__pyx_v_x_ndr));
+  __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_v_n);
   __pyx_v_n = __pyx_3;
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":762 */
-  __pyx_4 = PyObject_GetAttr(((PyObject *)__pyx_v_x_ndr), __pyx_n_size); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Divide(__pyx_4, __pyx_v_n); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":772 */
+  __pyx_4 = PyObject_GetAttr(((PyObject *)__pyx_v_x_ndr), __pyx_n_size); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
+  __pyx_1 = PyNumber_Divide(__pyx_4, __pyx_v_n); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
   Py_DECREF(__pyx_v_p);
-  __pyx_v_p = __pyx_2;
-  __pyx_2 = 0;
+  __pyx_v_p = __pyx_1;
+  __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":763 */
-  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 763; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":773 */
+  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->npar = __pyx_5;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":764 */
-  __pyx_5 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 764; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":774 */
+  __pyx_5 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->nobs = __pyx_5;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":766 */
-  __pyx_1 = PyInt_FromLong(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_v_p, __pyx_1, &__pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":776 */
+  __pyx_2 = PyInt_FromLong(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_v_p, __pyx_2, &__pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; goto __pyx_L1;}
   __pyx_6 = __pyx_6 > 0;
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
   if (__pyx_6) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":767 */
-    __pyx_3 = PyNumber_Multiply(__pyx_v_n, __pyx_v_p); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; goto __pyx_L1;}
-    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":777 */
+    __pyx_3 = PyNumber_Multiply(__pyx_v_n, __pyx_v_p); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; goto __pyx_L1;}
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
     __pyx_3 = 0;
-    if (PyObject_SetAttr(((PyObject *)__pyx_v_x_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; goto __pyx_L1;}
+    if (PyObject_SetAttr(((PyObject *)__pyx_v_x_ndr), __pyx_n_shape, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; goto __pyx_L1;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":769 */
-  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  __pyx_1 = PyObject_GetAttr(__pyx_2, __pyx_n_array); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_3 = PyTuple_New(1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":779 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_narray); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
   Py_INCREF(__pyx_v_y);
-  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_y);
-  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_4, __pyx_n_copy, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_y);
+  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  if (PyDict_SetItem(__pyx_3, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_4, __pyx_n_subok, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (PyDict_SetItem(__pyx_4, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  __pyx_2 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_3); __pyx_3 = 0;
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
-  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 779; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_y_ndr));
-  __pyx_v_y_ndr = ((PyArrayObject *)__pyx_2);
-  __pyx_2 = 0;
+  __pyx_v_y_ndr = ((PyArrayObject *)__pyx_4);
+  __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":770 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":780 */
   __pyx_v_y_dat = ((double (*))__pyx_v_y_ndr->data);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":771 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_y_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_1, __pyx_v_n, &__pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 771; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":781 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_y_ndr), __pyx_n_size); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_1, __pyx_v_n, &__pyx_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; goto __pyx_L1;}
   __pyx_6 = __pyx_6 != 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_6) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":772 */
-    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
-    __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":782 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; goto __pyx_L1;}
     Py_INCREF(((PyObject *)__pyx_v_y_ndr));
-    PyTuple_SET_ITEM(__pyx_4, 0, ((PyObject *)__pyx_v_y_ndr));
+    PyTuple_SET_ITEM(__pyx_3, 0, ((PyObject *)__pyx_v_y_ndr));
     Py_INCREF(__pyx_v_n);
-    PyTuple_SET_ITEM(__pyx_4, 1, __pyx_v_n);
-    __pyx_2 = PyNumber_Remainder(__pyx_k113p, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 773; goto __pyx_L1;}
-    Py_DECREF(__pyx_4); __pyx_4 = 0;
-    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
-    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_2);
-    __pyx_2 = 0;
-    __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_3, 1, __pyx_v_n);
+    __pyx_4 = PyNumber_Remainder(__pyx_k110p, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; goto __pyx_L1;}
     Py_DECREF(__pyx_3); __pyx_3 = 0;
+    __pyx_1 = PyTuple_New(1); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_4);
+    __pyx_4 = 0;
+    __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    __Pyx_Raise(__pyx_4, 0, 0);
-    Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; goto __pyx_L1;}
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; goto __pyx_L1;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":775 */
-  __pyx_5 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; goto __pyx_L1;}
-  __pyx_7 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 775; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":785 */
+  __pyx_5 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 785; goto __pyx_L1;}
+  __pyx_7 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 785; goto __pyx_L1;}
   loess_setup(__pyx_v_x_dat,__pyx_v_y_dat,__pyx_5,__pyx_7,(&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base));
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":777 */
-  __pyx_2 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_inputs), 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_6cloess_loess_inputs)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":787 */
+  __pyx_4 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_inputs), 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_6cloess_loess_inputs)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs));
-  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs = ((struct __pyx_obj_6cloess_loess_inputs *)__pyx_2);
-  __pyx_2 = 0;
+  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs = ((struct __pyx_obj_6cloess_loess_inputs *)__pyx_4);
+  __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":778 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":788 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs->_base = (&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.inputs);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":780 */
-  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_model), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_loess_model)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":790 */
+  __pyx_2 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_model), 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_6cloess_loess_model)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model));
-  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model = ((struct __pyx_obj_6cloess_loess_model *)__pyx_3);
-  __pyx_3 = 0;
+  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model = ((struct __pyx_obj_6cloess_loess_model *)__pyx_2);
+  __pyx_2 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":781 */
-  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model->_base = (&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.model);
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":791 */
+  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; goto __pyx_L1;}
+  __pyx_1 = ((struct __pyx_vtabstruct_6cloess_loess_model *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model->__pyx_vtab)->setup(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model,(&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.model),__pyx_5); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":782 */
-  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; goto __pyx_L1;}
-  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model->npar = __pyx_5;
-
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":784 */
-  __pyx_1 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_control), 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 784; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_1, __pyx_ptype_6cloess_loess_control)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 784; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":795 */
+  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_control), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 795; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_loess_control)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 795; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control));
-  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control = ((struct __pyx_obj_6cloess_loess_control *)__pyx_1);
-  __pyx_1 = 0;
+  ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control = ((struct __pyx_obj_6cloess_loess_control *)__pyx_3);
+  __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":785 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":796 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control->_base = (&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.control);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":787 */
-  __pyx_4 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_kd_tree), 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_6cloess_loess_kd_tree)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":798 */
+  __pyx_4 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_kd_tree), 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_6cloess_loess_kd_tree)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->kd_tree));
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->kd_tree = ((struct __pyx_obj_6cloess_loess_kd_tree *)__pyx_4);
   __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":788 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":799 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->kd_tree->_base = (&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.kd_tree);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":790 */
-  __pyx_2 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_outputs), 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_6cloess_loess_outputs)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 790; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":801 */
+  __pyx_2 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_outputs), 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_6cloess_loess_outputs)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs));
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs = ((struct __pyx_obj_6cloess_loess_outputs *)__pyx_2);
   __pyx_2 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":791 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":802 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->_base = (&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.outputs);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":792 */
-  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; goto __pyx_L1;}
-  __pyx_6 = PyInt_AsLong(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":803 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; goto __pyx_L1;}
+  __pyx_6 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 803; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->activated = __pyx_6;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":793 */
-  __pyx_7 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 793; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":804 */
+  __pyx_7 = PyInt_AsLong(__pyx_v_n); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->nobs = __pyx_7;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":794 */
-  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":805 */
+  __pyx_5 = PyInt_AsLong(__pyx_v_p); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; goto __pyx_L1;}
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->npar = __pyx_5;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":796 */
-  __pyx_1 = PyDict_New(); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 796; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":807 */
+  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 807; goto __pyx_L1;}
   Py_DECREF(__pyx_v_modelopt);
-  __pyx_v_modelopt = __pyx_1;
-  __pyx_1 = 0;
+  __pyx_v_modelopt = __pyx_3;
+  __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":797 */
-  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 797; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":808 */
+  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 808; goto __pyx_L1;}
   Py_DECREF(__pyx_v_controlopt);
   __pyx_v_controlopt = __pyx_4;
   __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":798 */
-  __pyx_2 = PyObject_GetAttr(__pyx_v_options, __pyx_n_iteritems); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
-  __pyx_3 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":809 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_options, __pyx_n_iteritems); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
+  __pyx_1 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_1 = PyObject_GetIter(__pyx_3); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_3 = PyObject_GetIter(__pyx_1); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   for (;;) {
-    __pyx_4 = PyIter_Next(__pyx_1);
+    __pyx_4 = PyIter_Next(__pyx_3);
     if (!__pyx_4) {
-      if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+      if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
       break;
     }
-    __pyx_2 = PyObject_GetIter(__pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+    __pyx_2 = PyObject_GetIter(__pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    __pyx_3 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+    __pyx_1 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
     Py_DECREF(__pyx_v_k);
-    __pyx_v_k = __pyx_3;
-    __pyx_3 = 0;
-    __pyx_4 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+    __pyx_v_k = __pyx_1;
+    __pyx_1 = 0;
+    __pyx_4 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
     Py_DECREF(__pyx_v_v);
     __pyx_v_v = __pyx_4;
     __pyx_4 = 0;
-    if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 798; goto __pyx_L1;}
+    if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 809; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":799 */
-    __pyx_3 = PyTuple_New(6); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 799; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":810 */
+    __pyx_1 = PyTuple_New(6); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 810; goto __pyx_L1;}
     Py_INCREF(__pyx_n_family);
-    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_n_family);
+    PyTuple_SET_ITEM(__pyx_1, 0, __pyx_n_family);
     Py_INCREF(__pyx_n_span);
-    PyTuple_SET_ITEM(__pyx_3, 1, __pyx_n_span);
+    PyTuple_SET_ITEM(__pyx_1, 1, __pyx_n_span);
     Py_INCREF(__pyx_n_degree);
-    PyTuple_SET_ITEM(__pyx_3, 2, __pyx_n_degree);
+    PyTuple_SET_ITEM(__pyx_1, 2, __pyx_n_degree);
     Py_INCREF(__pyx_n_normalize);
-    PyTuple_SET_ITEM(__pyx_3, 3, __pyx_n_normalize);
+    PyTuple_SET_ITEM(__pyx_1, 3, __pyx_n_normalize);
     Py_INCREF(__pyx_n_parametric);
-    PyTuple_SET_ITEM(__pyx_3, 4, __pyx_n_parametric);
+    PyTuple_SET_ITEM(__pyx_1, 4, __pyx_n_parametric);
     Py_INCREF(__pyx_n_drop_square);
-    PyTuple_SET_ITEM(__pyx_3, 5, __pyx_n_drop_square);
-    __pyx_6 = PySequence_Contains(__pyx_3, __pyx_v_k); if (__pyx_6 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 799; goto __pyx_L1;}
-    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    PyTuple_SET_ITEM(__pyx_1, 5, __pyx_n_drop_square);
+    __pyx_6 = PySequence_Contains(__pyx_1, __pyx_v_k); if (__pyx_6 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 810; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
     if (__pyx_6) {
 
-      /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":801 */
-      if (PyObject_SetItem(__pyx_v_modelopt, __pyx_v_k, __pyx_v_v) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 801; goto __pyx_L1;}
+      /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":812 */
+      if (PyObject_SetItem(__pyx_v_modelopt, __pyx_v_k, __pyx_v_v) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 812; goto __pyx_L1;}
       goto __pyx_L6;
     }
-    __pyx_4 = PyTuple_New(5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 813; goto __pyx_L1;}
     Py_INCREF(__pyx_n_surface);
     PyTuple_SET_ITEM(__pyx_4, 0, __pyx_n_surface);
     Py_INCREF(__pyx_n_statistics);
@@ -3379,33 +3267,33 @@
     PyTuple_SET_ITEM(__pyx_4, 3, __pyx_n_iterations);
     Py_INCREF(__pyx_n_cell);
     PyTuple_SET_ITEM(__pyx_4, 4, __pyx_n_cell);
-    __pyx_6 = PySequence_Contains(__pyx_4, __pyx_v_k); if (__pyx_6 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; goto __pyx_L1;}
+    __pyx_6 = PySequence_Contains(__pyx_4, __pyx_v_k); if (__pyx_6 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 813; goto __pyx_L1;}
     Py_DECREF(__pyx_4); __pyx_4 = 0;
     if (__pyx_6) {
 
-      /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":804 */
-      if (PyObject_SetItem(__pyx_v_controlopt, __pyx_v_k, __pyx_v_v) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; goto __pyx_L1;}
+      /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":815 */
+      if (PyObject_SetItem(__pyx_v_controlopt, __pyx_v_k, __pyx_v_v) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; goto __pyx_L1;}
       goto __pyx_L6;
     }
     __pyx_L6:;
   }
-  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":805 */
-  __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control), __pyx_n_update); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; goto __pyx_L1;}
-  __pyx_3 = PyTuple_New(0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; goto __pyx_L1;}
-  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_3, __pyx_v_controlopt); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 805; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":816 */
+  __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->control), __pyx_n_update); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; goto __pyx_L1;}
+  __pyx_1 = PyTuple_New(0); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; goto __pyx_L1;}
+  __pyx_4 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_1, __pyx_v_controlopt); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
   Py_DECREF(__pyx_4); __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":806 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model), __pyx_n_update); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; goto __pyx_L1;}
-  __pyx_3 = PyEval_CallObjectWithKeywords(__pyx_1, __pyx_2, __pyx_v_modelopt); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 806; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":817 */
+  __pyx_3 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model), __pyx_n_update); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+  __pyx_2 = PyTuple_New(0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+  __pyx_1 = PyEval_CallObjectWithKeywords(__pyx_3, __pyx_2, __pyx_v_modelopt); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -3440,20 +3328,42 @@
   PyObject *__pyx_r;
   PyObject *__pyx_1 = 0;
   int __pyx_2;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
   static char *__pyx_argnames[] = {0};
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":809 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":820 */
   loess_fit((&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base));
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":810 */
-  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 810; goto __pyx_L1;}
-  __pyx_2 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 810; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":821 */
+  __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; goto __pyx_L1;}
+  __pyx_2 = PyInt_AsLong(__pyx_1); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->activated = __pyx_2;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":811 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":822 */
+  __pyx_2 = ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_status;
+  if (__pyx_2) {
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":823 */
+    __pyx_1 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; goto __pyx_L1;}
+    __pyx_3 = PyString_FromString(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_msg); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+    __pyx_3 = 0;
+    __pyx_3 = PyObject_CallObject(__pyx_1, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; goto __pyx_L1;}
+    Py_DECREF(__pyx_1); __pyx_1 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; goto __pyx_L1;}
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":824 */
   __pyx_r = Py_None; Py_INCREF(Py_None);
   goto __pyx_L0;
 
@@ -3461,6 +3371,8 @@
   goto __pyx_L0;
   __pyx_L1:;
   Py_XDECREF(__pyx_1);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
   __Pyx_AddTraceback("cloess.loess.fit");
   __pyx_r = 0;
   __pyx_L0:;
@@ -3470,15 +3382,15 @@
 
 static PyObject *__pyx_n_nobs;
 
+static PyObject *__pyx_k122p;
+static PyObject *__pyx_k123p;
 static PyObject *__pyx_k125p;
 static PyObject *__pyx_k126p;
-static PyObject *__pyx_k128p;
-static PyObject *__pyx_k129p;
 
-static char (__pyx_k125[]) = "Number of Observations         : %d";
-static char (__pyx_k126[]) = "Equivalent Number of Parameters: %.1f";
-static char (__pyx_k128[]) = "Residual Standard Error        : %.4f";
-static char (__pyx_k129[]) = "Residual Scale Estimate        : %.4f";
+static char (__pyx_k122[]) = "Number of Observations         : %d";
+static char (__pyx_k123[]) = "Equivalent Number of Parameters: %.1f";
+static char (__pyx_k125[]) = "Residual Standard Error        : %.4f";
+static char (__pyx_k126[]) = "Residual Scale Estimate        : %.4f";
 
 static PyObject *__pyx_f_6cloess_5loess_summary(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static PyObject *__pyx_f_6cloess_5loess_summary(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -3490,47 +3402,47 @@
   if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "", __pyx_argnames)) return 0;
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":814 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs), __pyx_n_nobs); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k125p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":827 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->inputs), __pyx_n_nobs); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k122p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  if (__Pyx_PrintItem(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; goto __pyx_L1;}
+  if (__Pyx_PrintItem(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; goto __pyx_L1;}
+  if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; goto __pyx_L1;}
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":815 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; goto __pyx_L1;}
-  __pyx_2 = PyNumber_Remainder(__pyx_k126p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":828 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_enp); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Remainder(__pyx_k123p, __pyx_1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
-  if (__Pyx_PrintItem(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; goto __pyx_L1;}
+  if (__Pyx_PrintItem(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; goto __pyx_L1;}
+  if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 828; goto __pyx_L1;}
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":816 */
-  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model), __pyx_n_family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_1, __pyx_n_gaussian, &__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":829 */
+  __pyx_1 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->model), __pyx_n_family); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_1, __pyx_n_gaussian, &__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; goto __pyx_L1;}
   __pyx_3 = __pyx_3 == 0;
   Py_DECREF(__pyx_1); __pyx_1 = 0;
   if (__pyx_3) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":817 */
-    __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_s); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
-    __pyx_1 = PyNumber_Remainder(__pyx_k128p, __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":830 */
+    __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_s); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; goto __pyx_L1;}
+    __pyx_1 = PyNumber_Remainder(__pyx_k125p, __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    if (__Pyx_PrintItem(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+    if (__Pyx_PrintItem(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; goto __pyx_L1;}
+    if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; goto __pyx_L1;}
     goto __pyx_L2;
   }
   /*else*/ {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":819 */
-    __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_s); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; goto __pyx_L1;}
-    __pyx_1 = PyNumber_Remainder(__pyx_k129p, __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":832 */
+    __pyx_2 = PyObject_GetAttr(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs), __pyx_n_s); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; goto __pyx_L1;}
+    __pyx_1 = PyNumber_Remainder(__pyx_k126p, __pyx_2); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    if (__Pyx_PrintItem(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; goto __pyx_L1;}
+    if (__Pyx_PrintItem(__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; goto __pyx_L1;}
     Py_DECREF(__pyx_1); __pyx_1 = 0;
-    if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 819; goto __pyx_L1;}
+    if (__Pyx_PrintNewline() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; goto __pyx_L1;}
   }
   __pyx_L2:;
 
@@ -3549,17 +3461,17 @@
 static PyObject *__pyx_n_ravel;
 static PyObject *__pyx_n_divmod;
 
-static PyObject *__pyx_k134p;
-static PyObject *__pyx_k135p;
+static PyObject *__pyx_k131p;
+static PyObject *__pyx_k132p;
 
-static char (__pyx_k134[]) = "Can't predict without input data !";
-static char (__pyx_k135[]) = "Incompatible data size: there should be as many rows as parameters";
+static char (__pyx_k131[]) = "Can't predict without input data !";
+static char (__pyx_k132[]) = "Incompatible data size: there should be as many rows as parameters";
 
 static PyObject *__pyx_f_6cloess_5loess_predict(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_6cloess_5loess_predict[] = "\n    newdata: ndarray\n        A (m,p) ndarray specifying the values of the predictors at which the \n        evaluation is to be carried out.\n    stderr: Boolean\n        Logical flag for computing standard errors at newdata.\n        ";
 static PyObject *__pyx_f_6cloess_5loess_predict(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_newdata = 0;
-  PyObject *__pyx_v_stderr = 0;
+  PyObject *__pyx_v_stderror = 0;
   PyArrayObject *__pyx_v_p_ndr;
   double (*__pyx_v_p_dat);
   prediction __pyx_v__prediction;
@@ -3571,154 +3483,192 @@
   PyObject *__pyx_3 = 0;
   PyObject *__pyx_4 = 0;
   PyObject *__pyx_5 = 0;
-  static char *__pyx_argnames[] = {"newdata","stderr",0};
-  __pyx_v_stderr = __pyx_k37;
-  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O|O", __pyx_argnames, &__pyx_v_newdata, &__pyx_v_stderr)) return 0;
+  static char *__pyx_argnames[] = {"newdata","stderror",0};
+  __pyx_v_stderror = __pyx_k34;
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "O|O", __pyx_argnames, &__pyx_v_newdata, &__pyx_v_stderror)) return 0;
   Py_INCREF(__pyx_v_self);
   Py_INCREF(__pyx_v_newdata);
-  Py_INCREF(__pyx_v_stderr);
+  Py_INCREF(__pyx_v_stderror);
   __pyx_v_p_ndr = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
   __pyx_v_notOK = Py_None; Py_INCREF(Py_None);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":834 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":847 */
   __pyx_1 = (((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->activated == 0);
   if (__pyx_1) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":835 */
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":848 */
     loess_fit((&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base));
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":836 */
-    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 836; goto __pyx_L1;}
-    __pyx_1 = PyInt_AsLong(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 836; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":849 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; goto __pyx_L1;}
+    __pyx_1 = PyInt_AsLong(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
     ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->outputs->activated = __pyx_1;
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":850 */
+    __pyx_1 = ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_status;
+    if (__pyx_1) {
+
+      /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":851 */
+      __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; goto __pyx_L1;}
+      __pyx_3 = PyString_FromString(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_msg); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; goto __pyx_L1;}
+      __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; goto __pyx_L1;}
+      PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+      __pyx_3 = 0;
+      __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; goto __pyx_L1;}
+      Py_DECREF(__pyx_2); __pyx_2 = 0;
+      Py_DECREF(__pyx_4); __pyx_4 = 0;
+      __Pyx_Raise(__pyx_3, 0, 0);
+      Py_DECREF(__pyx_3); __pyx_3 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; goto __pyx_L1;}
+      goto __pyx_L3;
+    }
+    __pyx_L3:;
     goto __pyx_L2;
   }
   __pyx_L2:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":838 */
-  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  __pyx_3 = PyObject_GetAttr(__pyx_2, __pyx_n_array); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":853 */
+  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_n_narray); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_INCREF(__pyx_v_newdata);
-  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_v_newdata);
-  __pyx_4 = PyDict_New(); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_4, __pyx_n_copy, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_v_newdata);
+  __pyx_3 = PyDict_New(); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_copy, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  if (PyDict_SetItem(__pyx_4, __pyx_n_subok, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_True); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  if (PyDict_SetItem(__pyx_3, __pyx_n_subok, __pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  if (PyDict_SetItem(__pyx_4, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  __pyx_5 = PyEval_CallObjectWithKeywords(__pyx_3, __pyx_2, __pyx_4); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  if (PyDict_SetItem(__pyx_3, __pyx_n_order, __pyx_n_C) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  __pyx_5 = PyEval_CallObjectWithKeywords(__pyx_2, __pyx_4, __pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
   Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_3 = PyObject_GetAttr(__pyx_5, __pyx_n_ravel); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_2 = PyObject_GetAttr(__pyx_5, __pyx_n_ravel); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  __pyx_2 = PyObject_CallObject(__pyx_3, 0); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
-  if (!__Pyx_TypeTest(__pyx_2, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; goto __pyx_L1;}
+  __pyx_4 = PyObject_CallObject(__pyx_2, 0); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  if (!__Pyx_TypeTest(__pyx_4, __pyx_ptype_7c_numpy_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; goto __pyx_L1;}
   Py_DECREF(((PyObject *)__pyx_v_p_ndr));
-  __pyx_v_p_ndr = ((PyArrayObject *)__pyx_2);
-  __pyx_2 = 0;
+  __pyx_v_p_ndr = ((PyArrayObject *)__pyx_4);
+  __pyx_4 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":839 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":854 */
   __pyx_v_p_dat = ((double (*))__pyx_v_p_ndr->data);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":841 */
-  __pyx_4 = PyObject_GetAttr(((PyObject *)__pyx_v_p_ndr), __pyx_n_size); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 841; goto __pyx_L1;}
-  __pyx_5 = PyInt_FromLong(0); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 841; goto __pyx_L1;}
-  if (PyObject_Cmp(__pyx_4, __pyx_5, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 841; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":856 */
+  __pyx_3 = PyObject_GetAttr(((PyObject *)__pyx_v_p_ndr), __pyx_n_size); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 856; goto __pyx_L1;}
+  __pyx_5 = PyInt_FromLong(0); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 856; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_3, __pyx_5, &__pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 856; goto __pyx_L1;}
   __pyx_1 = __pyx_1 == 0;
-  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
   Py_DECREF(__pyx_5); __pyx_5 = 0;
   if (__pyx_1) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":842 */
-    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; goto __pyx_L1;}
-    __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; goto __pyx_L1;}
-    Py_INCREF(__pyx_k134p);
-    PyTuple_SET_ITEM(__pyx_2, 0, __pyx_k134p);
-    __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; goto __pyx_L1;}
-    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":857 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; goto __pyx_L1;}
+    Py_INCREF(__pyx_k131p);
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_k131p);
+    __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; goto __pyx_L1;}
     Py_DECREF(__pyx_2); __pyx_2 = 0;
-    __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; goto __pyx_L1;}
-    goto __pyx_L3;
+    __Pyx_Raise(__pyx_3, 0, 0);
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; goto __pyx_L1;}
+    goto __pyx_L4;
   }
-  __pyx_L3:;
+  __pyx_L4:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":843 */
-  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_divmod); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":858 */
+  __pyx_5 = __Pyx_GetName(__pyx_b, __pyx_n_divmod); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_len); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
   Py_INCREF(((PyObject *)__pyx_v_p_ndr));
-  PyTuple_SET_ITEM(__pyx_2, 0, ((PyObject *)__pyx_v_p_ndr));
-  __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  PyTuple_SET_ITEM(__pyx_4, 0, ((PyObject *)__pyx_v_p_ndr));
+  __pyx_3 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
   Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_3 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->npar); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  __pyx_2 = PyTuple_New(2); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  PyTuple_SET_ITEM(__pyx_2, 0, __pyx_4);
-  PyTuple_SET_ITEM(__pyx_2, 1, __pyx_3);
-  __pyx_4 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_2 = PyInt_FromLong(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->npar); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+  PyTuple_SET_ITEM(__pyx_4, 1, __pyx_2);
   __pyx_3 = 0;
-  __pyx_4 = PyObject_CallObject(__pyx_5, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
+  __pyx_2 = 0;
+  __pyx_3 = PyObject_CallObject(__pyx_5, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
-  Py_DECREF(__pyx_2); __pyx_2 = 0;
-  __pyx_3 = PyObject_GetIter(__pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
   Py_DECREF(__pyx_4); __pyx_4 = 0;
-  __pyx_5 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  __pyx_1 = PyInt_AsLong(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetIter(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_5 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  __pyx_1 = PyInt_AsLong(__pyx_5); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
   Py_DECREF(__pyx_5); __pyx_5 = 0;
   __pyx_v_m = __pyx_1;
-  __pyx_2 = __Pyx_UnpackItem(__pyx_3); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
+  __pyx_4 = __Pyx_UnpackItem(__pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
   Py_DECREF(__pyx_v_notOK);
-  __pyx_v_notOK = __pyx_2;
-  __pyx_2 = 0;
-  if (__Pyx_EndUnpack(__pyx_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; goto __pyx_L1;}
-  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_v_notOK = __pyx_4;
+  __pyx_4 = 0;
+  if (__Pyx_EndUnpack(__pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":844 */
-  __pyx_1 = PyObject_IsTrue(__pyx_v_notOK); if (__pyx_1 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":859 */
+  __pyx_1 = PyObject_IsTrue(__pyx_v_notOK); if (__pyx_1 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 859; goto __pyx_L1;}
   if (__pyx_1) {
 
-    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":845 */
-    __pyx_4 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; goto __pyx_L1;}
-    __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; goto __pyx_L1;}
-    Py_INCREF(__pyx_k135p);
-    PyTuple_SET_ITEM(__pyx_5, 0, __pyx_k135p);
-    __pyx_2 = PyObject_CallObject(__pyx_4, __pyx_5); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; goto __pyx_L1;}
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":860 */
+    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; goto __pyx_L1;}
+    __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; goto __pyx_L1;}
+    Py_INCREF(__pyx_k132p);
+    PyTuple_SET_ITEM(__pyx_5, 0, __pyx_k132p);
+    __pyx_4 = PyObject_CallObject(__pyx_3, __pyx_5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; goto __pyx_L1;}
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    Py_DECREF(__pyx_5); __pyx_5 = 0;
+    __Pyx_Raise(__pyx_4, 0, 0);
     Py_DECREF(__pyx_4); __pyx_4 = 0;
-    Py_DECREF(__pyx_5); __pyx_5 = 0;
-    __Pyx_Raise(__pyx_2, 0, 0);
-    Py_DECREF(__pyx_2); __pyx_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; goto __pyx_L1;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; goto __pyx_L1;}
+    goto __pyx_L5;
   }
-  __pyx_L4:;
+  __pyx_L5:;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":848 */
-  __pyx_1 = PyInt_AsLong(__pyx_v_stderr); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 848; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":863 */
+  __pyx_1 = PyInt_AsLong(__pyx_v_stderror); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 863; goto __pyx_L1;}
   predict(__pyx_v_p_dat,__pyx_v_m,(&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base),(&__pyx_v__prediction),__pyx_1);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":849 */
-  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_predicted), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; goto __pyx_L1;}
-  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_loess_predicted)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; goto __pyx_L1;}
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":864 */
+  __pyx_1 = ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_status;
+  if (__pyx_1) {
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":865 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; goto __pyx_L1;}
+    __pyx_3 = PyString_FromString(((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base.status.err_msg); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; goto __pyx_L1;}
+    __pyx_5 = PyTuple_New(1); if (!__pyx_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_5, 0, __pyx_3);
+    __pyx_3 = 0;
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_5); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_5); __pyx_5 = 0;
+    __Pyx_Raise(__pyx_4, 0, 0);
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; goto __pyx_L1;}
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":866 */
+  __pyx_3 = PyObject_CallObject(((PyObject*)__pyx_ptype_6cloess_loess_predicted), 0); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 866; goto __pyx_L1;}
+  if (!__Pyx_TypeTest(__pyx_3, __pyx_ptype_6cloess_loess_predicted)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 866; goto __pyx_L1;}
   Py_DECREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted));
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted = ((struct __pyx_obj_6cloess_loess_predicted *)__pyx_3);
   __pyx_3 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":850 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":867 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted->_base = __pyx_v__prediction;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":851 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":868 */
   ((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted->nest = __pyx_v_m;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":852 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":870 */
   Py_INCREF(((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted));
   __pyx_r = ((PyObject *)((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->predicted);
   goto __pyx_L0;
@@ -3737,7 +3687,7 @@
   Py_DECREF(__pyx_v_notOK);
   Py_DECREF(__pyx_v_self);
   Py_DECREF(__pyx_v_newdata);
-  Py_DECREF(__pyx_v_stderr);
+  Py_DECREF(__pyx_v_stderror);
   return __pyx_r;
 }
 
@@ -3745,21 +3695,290 @@
 static void __pyx_f_6cloess_5loess___dealloc__(PyObject *__pyx_v_self) {
   Py_INCREF(__pyx_v_self);
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":855 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":873 */
   loess_free_mem((&((struct __pyx_obj_6cloess_loess *)__pyx_v_self)->_base));
 
   Py_DECREF(__pyx_v_self);
 }
 
+static PyObject *__pyx_n_isinstance;
+static PyObject *__pyx_n_type;
+static PyObject *__pyx_n_outputs;
+static PyObject *__pyx_n_abs;
+
+static PyObject *__pyx_k133p;
+
+static char (__pyx_k133[]) = "Arguments should be valid loess objects!got '%s' instead";
+
+static int __pyx_f_6cloess_5anova___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_f_6cloess_5anova___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_loess_one = 0;
+  PyObject *__pyx_v_loess_two = 0;
+  double __pyx_v_one_d1;
+  double __pyx_v_one_d2;
+  double __pyx_v_one_s;
+  double __pyx_v_two_d1;
+  double __pyx_v_two_d2;
+  double __pyx_v_two_s;
+  double __pyx_v_rssdiff;
+  double __pyx_v_d1diff;
+  double __pyx_v_tmp;
+  double __pyx_v_df1;
+  double __pyx_v_df2;
+  PyObject *__pyx_v_out_one;
+  PyObject *__pyx_v_out_two;
+  PyObject *__pyx_v_F_value;
+  int __pyx_r;
+  int __pyx_1;
+  PyObject *__pyx_2 = 0;
+  PyObject *__pyx_3 = 0;
+  PyObject *__pyx_4 = 0;
+  int __pyx_5;
+  PyObject *__pyx_6 = 0;
+  double __pyx_7;
+  static char *__pyx_argnames[] = {"loess_one","loess_two",0};
+  if (!PyArg_ParseTupleAndKeywords(__pyx_args, __pyx_kwds, "OO", __pyx_argnames, &__pyx_v_loess_one, &__pyx_v_loess_two)) return -1;
+  Py_INCREF(__pyx_v_self);
+  Py_INCREF(__pyx_v_loess_one);
+  Py_INCREF(__pyx_v_loess_two);
+  __pyx_v_out_one = Py_None; Py_INCREF(Py_None);
+  __pyx_v_out_two = Py_None; Py_INCREF(Py_None);
+  __pyx_v_F_value = Py_None; Py_INCREF(Py_None);
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":887 */
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_isinstance); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+  __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+  Py_INCREF(__pyx_v_loess_one);
+  PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_loess_one);
+  Py_INCREF(((PyObject*)__pyx_ptype_6cloess_loess));
+  PyTuple_SET_ITEM(__pyx_3, 1, ((PyObject*)__pyx_ptype_6cloess_loess));
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_5 = PyObject_IsTrue(__pyx_4); if (__pyx_5 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_1 = (!__pyx_5);
+  if (!__pyx_1) {
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_isinstance); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+    __pyx_3 = PyTuple_New(2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+    Py_INCREF(__pyx_v_loess_two);
+    PyTuple_SET_ITEM(__pyx_3, 0, __pyx_v_loess_two);
+    Py_INCREF(((PyObject*)__pyx_ptype_6cloess_loess));
+    PyTuple_SET_ITEM(__pyx_3, 1, ((PyObject*)__pyx_ptype_6cloess_loess));
+    __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_3); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    __pyx_5 = PyObject_IsTrue(__pyx_4); if (__pyx_5 < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; goto __pyx_L1;}
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __pyx_1 = (!__pyx_5);
+  }
+  if (__pyx_1) {
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":888 */
+    __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_ValueError); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; goto __pyx_L1;}
+    __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_type); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; goto __pyx_L1;}
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; goto __pyx_L1;}
+    Py_INCREF(__pyx_v_loess_one);
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_v_loess_one);
+    __pyx_6 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; goto __pyx_L1;}
+    Py_DECREF(__pyx_3); __pyx_3 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __pyx_3 = PyNumber_Remainder(__pyx_k133p, __pyx_6); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; goto __pyx_L1;}
+    Py_DECREF(__pyx_6); __pyx_6 = 0;
+    __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; goto __pyx_L1;}
+    PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+    __pyx_3 = 0;
+    __pyx_6 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; goto __pyx_L1;}
+    Py_DECREF(__pyx_2); __pyx_2 = 0;
+    Py_DECREF(__pyx_4); __pyx_4 = 0;
+    __Pyx_Raise(__pyx_6, 0, 0);
+    Py_DECREF(__pyx_6); __pyx_6 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; goto __pyx_L1;}
+    goto __pyx_L2;
+  }
+  __pyx_L2:;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":891 */
+  __pyx_3 = PyObject_GetAttr(__pyx_v_loess_one, __pyx_n_outputs); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 891; goto __pyx_L1;}
+  Py_DECREF(__pyx_v_out_one);
+  __pyx_v_out_one = __pyx_3;
+  __pyx_3 = 0;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":892 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_loess_two, __pyx_n_outputs); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 892; goto __pyx_L1;}
+  Py_DECREF(__pyx_v_out_two);
+  __pyx_v_out_two = __pyx_2;
+  __pyx_2 = 0;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":894 */
+  __pyx_4 = PyObject_GetAttr(__pyx_v_out_one, __pyx_n_one_delta); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_4); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_v_one_d1 = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":895 */
+  __pyx_6 = PyObject_GetAttr(__pyx_v_out_one, __pyx_n_two_delta); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_v_one_d2 = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":896 */
+  __pyx_3 = PyObject_GetAttr(__pyx_v_out_one, __pyx_n_s); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  __pyx_v_one_s = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":898 */
+  __pyx_2 = PyObject_GetAttr(__pyx_v_out_two, __pyx_n_one_delta); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 898; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 898; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_v_two_d1 = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":899 */
+  __pyx_4 = PyObject_GetAttr(__pyx_v_out_two, __pyx_n_two_delta); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 899; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_4); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 899; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_v_two_d2 = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":900 */
+  __pyx_6 = PyObject_GetAttr(__pyx_v_out_two, __pyx_n_s); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; goto __pyx_L1;}
+  __pyx_7 = PyFloat_AsDouble(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_v_two_s = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":902 */
+  __pyx_3 = __Pyx_GetName(__pyx_b, __pyx_n_abs); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; goto __pyx_L1;}
+  __pyx_2 = PyFloat_FromDouble((((__pyx_v_one_s * __pyx_v_one_s) * __pyx_v_one_d1) - ((__pyx_v_two_s * __pyx_v_two_s) * __pyx_v_two_d1))); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_2);
+  __pyx_2 = 0;
+  __pyx_6 = PyObject_CallObject(__pyx_3, __pyx_4); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_7 = PyFloat_AsDouble(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_v_rssdiff = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":903 */
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_abs); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; goto __pyx_L1;}
+  __pyx_3 = PyFloat_FromDouble((__pyx_v_one_d1 - __pyx_v_two_d1)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; goto __pyx_L1;}
+  __pyx_4 = PyTuple_New(1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_4, 0, __pyx_3);
+  __pyx_3 = 0;
+  __pyx_6 = PyObject_CallObject(__pyx_2, __pyx_4); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_7 = PyFloat_AsDouble(__pyx_6); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_v_d1diff = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":904 */
+  __pyx_3 = PyFloat_FromDouble((__pyx_v_d1diff * __pyx_v_d1diff)); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_abs); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  __pyx_4 = PyFloat_FromDouble((__pyx_v_one_d2 - __pyx_v_two_d2)); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  __pyx_6 = PyTuple_New(1); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  PyTuple_SET_ITEM(__pyx_6, 0, __pyx_4);
+  __pyx_4 = 0;
+  __pyx_4 = PyObject_CallObject(__pyx_2, __pyx_6); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  __pyx_2 = PyNumber_Divide(__pyx_3, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_7 = PyFloat_AsDouble(__pyx_2); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->dfn = __pyx_7;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":905 */
+  __pyx_v_df1 = ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->dfn;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":907 */
+  __pyx_6 = PyObject_GetAttr(__pyx_v_out_one, __pyx_n_enp); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 907; goto __pyx_L1;}
+  __pyx_3 = PyObject_GetAttr(__pyx_v_out_two, __pyx_n_enp); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 907; goto __pyx_L1;}
+  if (PyObject_Cmp(__pyx_6, __pyx_3, &__pyx_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 907; goto __pyx_L1;}
+  __pyx_5 = __pyx_5 > 0;
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  if (__pyx_5) {
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":908 */
+    ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->dfd = ((__pyx_v_one_d1 * __pyx_v_one_d1) / __pyx_v_one_d2);
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":909 */
+    __pyx_v_tmp = __pyx_v_one_s;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":911 */
+    ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->dfd = ((__pyx_v_two_d1 * __pyx_v_two_d1) / __pyx_v_two_d2);
+
+    /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":912 */
+    __pyx_v_tmp = __pyx_v_two_s;
+  }
+  __pyx_L3:;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":913 */
+  __pyx_v_df2 = ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->dfd;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":914 */
+  __pyx_4 = PyFloat_FromDouble(((__pyx_v_rssdiff / __pyx_v_d1diff) / (__pyx_v_tmp * __pyx_v_tmp))); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 914; goto __pyx_L1;}
+  Py_DECREF(__pyx_v_F_value);
+  __pyx_v_F_value = __pyx_4;
+  __pyx_4 = 0;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":916 */
+  __pyx_2 = PyFloat_FromDouble(__pyx_v_df1); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  __pyx_6 = PyNumber_Multiply(__pyx_v_F_value, __pyx_2); if (!__pyx_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_3 = PyFloat_FromDouble(__pyx_v_df2); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  __pyx_4 = PyFloat_FromDouble(__pyx_v_df1); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  __pyx_2 = PyNumber_Multiply(__pyx_v_F_value, __pyx_4); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_4 = PyNumber_Add(__pyx_3, __pyx_2); if (!__pyx_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_3 = PyNumber_Divide(__pyx_6, __pyx_4); if (!__pyx_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  Py_DECREF(__pyx_6); __pyx_6 = 0;
+  Py_DECREF(__pyx_4); __pyx_4 = 0;
+  __pyx_7 = PyFloat_AsDouble(__pyx_3); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 916; goto __pyx_L1;}
+  Py_DECREF(__pyx_3); __pyx_3 = 0;
+  ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->Pr_F = (1. - ibeta(__pyx_7,(__pyx_v_df1 / 2),(__pyx_v_df2 / 2)));
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":917 */
+  __pyx_7 = PyFloat_AsDouble(__pyx_v_F_value); if (PyErr_Occurred()) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 917; goto __pyx_L1;}
+  ((struct __pyx_obj_6cloess_anova *)__pyx_v_self)->F_value = __pyx_7;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1:;
+  Py_XDECREF(__pyx_2);
+  Py_XDECREF(__pyx_3);
+  Py_XDECREF(__pyx_4);
+  Py_XDECREF(__pyx_6);
+  __Pyx_AddTraceback("cloess.anova.__init__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  Py_DECREF(__pyx_v_out_one);
+  Py_DECREF(__pyx_v_out_two);
+  Py_DECREF(__pyx_v_F_value);
+  Py_DECREF(__pyx_v_self);
+  Py_DECREF(__pyx_v_loess_one);
+  Py_DECREF(__pyx_v_loess_two);
+  return __pyx_r;
+}
+
 static __Pyx_InternTabEntry __pyx_intern_tab[] = {
   {&__pyx_n_C, "C"},
   {&__pyx_n_False, "False"},
   {&__pyx_n_T, "T"},
   {&__pyx_n_True, "True"},
   {&__pyx_n_ValueError, "ValueError"},
+  {&__pyx_n_abs, "abs"},
   {&__pyx_n_approximate, "approximate"},
   {&__pyx_n_array, "array"},
   {&__pyx_n_astype, "astype"},
+  {&__pyx_n_atleast_1d, "atleast_1d"},
   {&__pyx_n_bool, "bool"},
   {&__pyx_n_c_loess, "c_loess"},
   {&__pyx_n_c_numpy, "c_numpy"},
@@ -3777,30 +3996,29 @@
   {&__pyx_n_enp, "enp"},
   {&__pyx_n_exact, "exact"},
   {&__pyx_n_family, "family"},
-  {&__pyx_n_fit, "fit"},
   {&__pyx_n_fitted_residuals, "fitted_residuals"},
   {&__pyx_n_fitted_values, "fitted_values"},
   {&__pyx_n_gaussian, "gaussian"},
   {&__pyx_n_get, "get"},
   {&__pyx_n_id, "id"},
-  {&__pyx_n_int, "int"},
   {&__pyx_n_interpolate, "interpolate"},
+  {&__pyx_n_isinstance, "isinstance"},
   {&__pyx_n_iterations, "iterations"},
   {&__pyx_n_iteritems, "iteritems"},
   {&__pyx_n_join, "join"},
   {&__pyx_n_len, "len"},
   {&__pyx_n_lower, "lower"},
   {&__pyx_n_min, "min"},
+  {&__pyx_n_narray, "narray"},
   {&__pyx_n_ndim, "ndim"},
   {&__pyx_n_nobs, "nobs"},
   {&__pyx_n_normalize, "normalize"},
   {&__pyx_n_numpy, "numpy"},
-  {&__pyx_n_nvar, "nvar"},
   {&__pyx_n_one_delta, "one_delta"},
   {&__pyx_n_order, "order"},
+  {&__pyx_n_outputs, "outputs"},
   {&__pyx_n_parametric, "parametric"},
   {&__pyx_n_parametric_flags, "parametric_flags"},
-  {&__pyx_n_pw_free_mem, "pw_free_mem"},
   {&__pyx_n_r_, "r_"},
   {&__pyx_n_ravel, "ravel"},
   {&__pyx_n_residual_scale, "residual_scale"},
@@ -3815,30 +4033,33 @@
   {&__pyx_n_symmetric, "symmetric"},
   {&__pyx_n_trace_hat, "trace_hat"},
   {&__pyx_n_two_delta, "two_delta"},
+  {&__pyx_n_type, "type"},
   {&__pyx_n_update, "update"},
-  {&__pyx_n_upper, "upper"},
   {&__pyx_n_values, "values"},
   {0, 0}
 };
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
+  {&__pyx_k35p, __pyx_k35, sizeof(__pyx_k35)},
   {&__pyx_k38p, __pyx_k38, sizeof(__pyx_k38)},
-  {&__pyx_k41p, __pyx_k41, sizeof(__pyx_k41)},
+  {&__pyx_k39p, __pyx_k39, sizeof(__pyx_k39)},
   {&__pyx_k42p, __pyx_k42, sizeof(__pyx_k42)},
   {&__pyx_k45p, __pyx_k45, sizeof(__pyx_k45)},
-  {&__pyx_k48p, __pyx_k48, sizeof(__pyx_k48)},
-  {&__pyx_k49p, __pyx_k49, sizeof(__pyx_k49)},
-  {&__pyx_k50p, __pyx_k50, sizeof(__pyx_k50)},
+  {&__pyx_k46p, __pyx_k46, sizeof(__pyx_k46)},
+  {&__pyx_k47p, __pyx_k47, sizeof(__pyx_k47)},
+  {&__pyx_k53p, __pyx_k53, sizeof(__pyx_k53)},
+  {&__pyx_k54p, __pyx_k54, sizeof(__pyx_k54)},
+  {&__pyx_k55p, __pyx_k55, sizeof(__pyx_k55)},
   {&__pyx_k56p, __pyx_k56, sizeof(__pyx_k56)},
   {&__pyx_k57p, __pyx_k57, sizeof(__pyx_k57)},
   {&__pyx_k58p, __pyx_k58, sizeof(__pyx_k58)},
   {&__pyx_k59p, __pyx_k59, sizeof(__pyx_k59)},
   {&__pyx_k60p, __pyx_k60, sizeof(__pyx_k60)},
   {&__pyx_k61p, __pyx_k61, sizeof(__pyx_k61)},
-  {&__pyx_k62p, __pyx_k62, sizeof(__pyx_k62)},
-  {&__pyx_k63p, __pyx_k63, sizeof(__pyx_k63)},
   {&__pyx_k64p, __pyx_k64, sizeof(__pyx_k64)},
-  {&__pyx_k67p, __pyx_k67, sizeof(__pyx_k67)},
+  {&__pyx_k77p, __pyx_k77, sizeof(__pyx_k77)},
+  {&__pyx_k78p, __pyx_k78, sizeof(__pyx_k78)},
+  {&__pyx_k79p, __pyx_k79, sizeof(__pyx_k79)},
   {&__pyx_k80p, __pyx_k80, sizeof(__pyx_k80)},
   {&__pyx_k81p, __pyx_k81, sizeof(__pyx_k81)},
   {&__pyx_k82p, __pyx_k82, sizeof(__pyx_k82)},
@@ -3861,16 +4082,14 @@
   {&__pyx_k99p, __pyx_k99, sizeof(__pyx_k99)},
   {&__pyx_k100p, __pyx_k100, sizeof(__pyx_k100)},
   {&__pyx_k101p, __pyx_k101, sizeof(__pyx_k101)},
-  {&__pyx_k102p, __pyx_k102, sizeof(__pyx_k102)},
-  {&__pyx_k103p, __pyx_k103, sizeof(__pyx_k103)},
-  {&__pyx_k104p, __pyx_k104, sizeof(__pyx_k104)},
-  {&__pyx_k113p, __pyx_k113, sizeof(__pyx_k113)},
+  {&__pyx_k110p, __pyx_k110, sizeof(__pyx_k110)},
+  {&__pyx_k122p, __pyx_k122, sizeof(__pyx_k122)},
+  {&__pyx_k123p, __pyx_k123, sizeof(__pyx_k123)},
   {&__pyx_k125p, __pyx_k125, sizeof(__pyx_k125)},
   {&__pyx_k126p, __pyx_k126, sizeof(__pyx_k126)},
-  {&__pyx_k128p, __pyx_k128, sizeof(__pyx_k128)},
-  {&__pyx_k129p, __pyx_k129, sizeof(__pyx_k129)},
-  {&__pyx_k134p, __pyx_k134, sizeof(__pyx_k134)},
-  {&__pyx_k135p, __pyx_k135, sizeof(__pyx_k135)},
+  {&__pyx_k131p, __pyx_k131, sizeof(__pyx_k131)},
+  {&__pyx_k132p, __pyx_k132, sizeof(__pyx_k132)},
+  {&__pyx_k133p, __pyx_k133, sizeof(__pyx_k133)},
   {0, 0, 0}
 };
 
@@ -4403,9 +4622,12 @@
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
 };
+static struct __pyx_vtabstruct_6cloess_loess_model __pyx_vtable_6cloess_loess_model;
 
 static PyObject *__pyx_tp_new_6cloess_loess_model(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
+  struct __pyx_obj_6cloess_loess_model *p = (struct __pyx_obj_6cloess_loess_model *)o;
+  *(struct __pyx_vtabstruct_6cloess_loess_model **)&p->__pyx_vtab = __pyx_vtabptr_6cloess_loess_model;
   return o;
 }
 
@@ -4421,13 +4643,13 @@
   return 0;
 }
 
-static PyObject *__pyx_getprop_6cloess_11loess_model_span(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_model_4span___get__(o);
+static PyObject *__pyx_getprop_6cloess_11loess_model_normalize(PyObject *o, void *x) {
+  return __pyx_f_6cloess_11loess_model_9normalize___get__(o);
 }
 
-static int __pyx_setprop_6cloess_11loess_model_span(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_6cloess_11loess_model_normalize(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_f_6cloess_11loess_model_4span___set__(o, v);
+    return __pyx_f_6cloess_11loess_model_9normalize___set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -4435,13 +4657,13 @@
   }
 }
 
-static PyObject *__pyx_getprop_6cloess_11loess_model_degree(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_model_6degree___get__(o);
+static PyObject *__pyx_getprop_6cloess_11loess_model_span(PyObject *o, void *x) {
+  return __pyx_f_6cloess_11loess_model_4span___get__(o);
 }
 
-static int __pyx_setprop_6cloess_11loess_model_degree(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_6cloess_11loess_model_span(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_f_6cloess_11loess_model_6degree___set__(o, v);
+    return __pyx_f_6cloess_11loess_model_4span___set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -4449,13 +4671,13 @@
   }
 }
 
-static PyObject *__pyx_getprop_6cloess_11loess_model_normalize(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_model_9normalize___get__(o);
+static PyObject *__pyx_getprop_6cloess_11loess_model_degree(PyObject *o, void *x) {
+  return __pyx_f_6cloess_11loess_model_6degree___get__(o);
 }
 
-static int __pyx_setprop_6cloess_11loess_model_normalize(PyObject *o, PyObject *v, void *x) {
+static int __pyx_setprop_6cloess_11loess_model_degree(PyObject *o, PyObject *v, void *x) {
   if (v) {
-    return __pyx_f_6cloess_11loess_model_9normalize___set__(o, v);
+    return __pyx_f_6cloess_11loess_model_6degree___set__(o, v);
   }
   else {
     PyErr_SetString(PyExc_NotImplementedError, "__del__");
@@ -4511,9 +4733,9 @@
 };
 
 static struct PyGetSetDef __pyx_getsets_6cloess_loess_model[] = {
-  {"span", __pyx_getprop_6cloess_11loess_model_span, __pyx_setprop_6cloess_11loess_model_span, __pyx_k9, 0},
-  {"degree", __pyx_getprop_6cloess_11loess_model_degree, __pyx_setprop_6cloess_11loess_model_degree, __pyx_k10, 0},
-  {"normalize", __pyx_getprop_6cloess_11loess_model_normalize, __pyx_setprop_6cloess_11loess_model_normalize, __pyx_k11, 0},
+  {"normalize", __pyx_getprop_6cloess_11loess_model_normalize, __pyx_setprop_6cloess_11loess_model_normalize, __pyx_k9, 0},
+  {"span", __pyx_getprop_6cloess_11loess_model_span, __pyx_setprop_6cloess_11loess_model_span, __pyx_k10, 0},
+  {"degree", __pyx_getprop_6cloess_11loess_model_degree, __pyx_setprop_6cloess_11loess_model_degree, __pyx_k11, 0},
   {"family", __pyx_getprop_6cloess_11loess_model_family, __pyx_setprop_6cloess_11loess_model_family, __pyx_k12, 0},
   {"parametric_flags", __pyx_getprop_6cloess_11loess_model_parametric_flags, __pyx_setprop_6cloess_11loess_model_parametric_flags, __pyx_k13, 0},
   {"drop_square_flags", __pyx_getprop_6cloess_11loess_model_drop_square_flags, __pyx_setprop_6cloess_11loess_model_drop_square_flags, __pyx_k14, 0},
@@ -4836,226 +5058,60 @@
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
 };
+static struct __pyx_vtabstruct_6cloess_conf_intervals __pyx_vtable_6cloess_conf_intervals;
 
-static PyObject *__pyx_tp_new_6cloess_loess_anova(PyTypeObject *t, PyObject *a, PyObject *k) {
-  PyObject *o = (*t->tp_alloc)(t, 0);
-  return o;
-}
-
-static void __pyx_tp_dealloc_6cloess_loess_anova(PyObject *o) {
-  (*o->ob_type->tp_free)(o);
-}
-
-static int __pyx_tp_traverse_6cloess_loess_anova(PyObject *o, visitproc v, void *a) {
-  return 0;
-}
-
-static int __pyx_tp_clear_6cloess_loess_anova(PyObject *o) {
-  return 0;
-}
-
-static PyObject *__pyx_getprop_6cloess_11loess_anova_dfn(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_anova_3dfn___get__(o);
-}
-
-static PyObject *__pyx_getprop_6cloess_11loess_anova_dfd(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_anova_3dfd___get__(o);
-}
-
-static PyObject *__pyx_getprop_6cloess_11loess_anova_F_value(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_anova_7F_value___get__(o);
-}
-
-static PyObject *__pyx_getprop_6cloess_11loess_anova_Pr_F(PyObject *o, void *x) {
-  return __pyx_f_6cloess_11loess_anova_4Pr_F___get__(o);
-}
-
-static struct PyMethodDef __pyx_methods_6cloess_loess_anova[] = {
-  {0, 0, 0, 0}
-};
-
-static struct PyGetSetDef __pyx_getsets_6cloess_loess_anova[] = {
-  {"dfn", __pyx_getprop_6cloess_11loess_anova_dfn, 0, 0, 0},
-  {"dfd", __pyx_getprop_6cloess_11loess_anova_dfd, 0, 0, 0},
-  {"F_value", __pyx_getprop_6cloess_11loess_anova_F_value, 0, 0, 0},
-  {"Pr_F", __pyx_getprop_6cloess_11loess_anova_Pr_F, 0, 0, 0},
-  {0, 0, 0, 0, 0}
-};
-
-static PyNumberMethods __pyx_tp_as_number_loess_anova = {
-  0, /*nb_add*/
-  0, /*nb_subtract*/
-  0, /*nb_multiply*/
-  0, /*nb_divide*/
-  0, /*nb_remainder*/
-  0, /*nb_divmod*/
-  0, /*nb_power*/
-  0, /*nb_negative*/
-  0, /*nb_positive*/
-  0, /*nb_absolute*/
-  0, /*nb_nonzero*/
-  0, /*nb_invert*/
-  0, /*nb_lshift*/
-  0, /*nb_rshift*/
-  0, /*nb_and*/
-  0, /*nb_xor*/
-  0, /*nb_or*/
-  0, /*nb_coerce*/
-  0, /*nb_int*/
-  0, /*nb_long*/
-  0, /*nb_float*/
-  0, /*nb_oct*/
-  0, /*nb_hex*/
-  0, /*nb_inplace_add*/
-  0, /*nb_inplace_subtract*/
-  0, /*nb_inplace_multiply*/
-  0, /*nb_inplace_divide*/
-  0, /*nb_inplace_remainder*/
-  0, /*nb_inplace_power*/
-  0, /*nb_inplace_lshift*/
-  0, /*nb_inplace_rshift*/
-  0, /*nb_inplace_and*/
-  0, /*nb_inplace_xor*/
-  0, /*nb_inplace_or*/
-  0, /*nb_floor_divide*/
-  0, /*nb_true_divide*/
-  0, /*nb_inplace_floor_divide*/
-  0, /*nb_inplace_true_divide*/
-};
-
-static PySequenceMethods __pyx_tp_as_sequence_loess_anova = {
-  0, /*sq_length*/
-  0, /*sq_concat*/
-  0, /*sq_repeat*/
-  0, /*sq_item*/
-  0, /*sq_slice*/
-  0, /*sq_ass_item*/
-  0, /*sq_ass_slice*/
-  0, /*sq_contains*/
-  0, /*sq_inplace_concat*/
-  0, /*sq_inplace_repeat*/
-};
-
-static PyMappingMethods __pyx_tp_as_mapping_loess_anova = {
-  0, /*mp_length*/
-  0, /*mp_subscript*/
-  0, /*mp_ass_subscript*/
-};
-
-static PyBufferProcs __pyx_tp_as_buffer_loess_anova = {
-  0, /*bf_getreadbuffer*/
-  0, /*bf_getwritebuffer*/
-  0, /*bf_getsegcount*/
-  0, /*bf_getcharbuffer*/
-};
-
-PyTypeObject __pyx_type_6cloess_loess_anova = {
-  PyObject_HEAD_INIT(0)
-  0, /*ob_size*/
-  "cloess.loess_anova", /*tp_name*/
-  sizeof(struct __pyx_obj_6cloess_loess_anova), /*tp_basicsize*/
-  0, /*tp_itemsize*/
-  __pyx_tp_dealloc_6cloess_loess_anova, /*tp_dealloc*/
-  0, /*tp_print*/
-  0, /*tp_getattr*/
-  0, /*tp_setattr*/
-  0, /*tp_compare*/
-  0, /*tp_repr*/
-  &__pyx_tp_as_number_loess_anova, /*tp_as_number*/
-  &__pyx_tp_as_sequence_loess_anova, /*tp_as_sequence*/
-  &__pyx_tp_as_mapping_loess_anova, /*tp_as_mapping*/
-  0, /*tp_hash*/
-  0, /*tp_call*/
-  0, /*tp_str*/
-  0, /*tp_getattro*/
-  0, /*tp_setattro*/
-  &__pyx_tp_as_buffer_loess_anova, /*tp_as_buffer*/
-  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
-  0, /*tp_doc*/
-  __pyx_tp_traverse_6cloess_loess_anova, /*tp_traverse*/
-  __pyx_tp_clear_6cloess_loess_anova, /*tp_clear*/
-  0, /*tp_richcompare*/
-  0, /*tp_weaklistoffset*/
-  0, /*tp_iter*/
-  0, /*tp_iternext*/
-  __pyx_methods_6cloess_loess_anova, /*tp_methods*/
-  0, /*tp_members*/
-  __pyx_getsets_6cloess_loess_anova, /*tp_getset*/
-  0, /*tp_base*/
-  0, /*tp_dict*/
-  0, /*tp_descr_get*/
-  0, /*tp_descr_set*/
-  0, /*tp_dictoffset*/
-  0, /*tp_init*/
-  0, /*tp_alloc*/
-  __pyx_tp_new_6cloess_loess_anova, /*tp_new*/
-  0, /*tp_free*/
-  0, /*tp_is_gc*/
-  0, /*tp_bases*/
-  0, /*tp_mro*/
-  0, /*tp_cache*/
-  0, /*tp_subclasses*/
-  0, /*tp_weaklist*/
-};
-
 static PyObject *__pyx_tp_new_6cloess_conf_intervals(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   struct __pyx_obj_6cloess_conf_intervals *p = (struct __pyx_obj_6cloess_conf_intervals *)o;
-  p->nest = Py_None; Py_INCREF(Py_None);
+  *(struct __pyx_vtabstruct_6cloess_conf_intervals **)&p->__pyx_vtab = __pyx_vtabptr_6cloess_conf_intervals;
+  p->lower = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  p->fit = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  p->upper = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
   return o;
 }
 
 static void __pyx_tp_dealloc_6cloess_conf_intervals(PyObject *o) {
   struct __pyx_obj_6cloess_conf_intervals *p = (struct __pyx_obj_6cloess_conf_intervals *)o;
-  {
-    PyObject *etype, *eval, *etb;
-    PyErr_Fetch(&etype, &eval, &etb);
-    ++o->ob_refcnt;
-    __pyx_f_6cloess_14conf_intervals___dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
-    --o->ob_refcnt;
-    PyErr_Restore(etype, eval, etb);
-  }
-  Py_XDECREF(p->nest);
+  Py_XDECREF(((PyObject *)p->lower));
+  Py_XDECREF(((PyObject *)p->fit));
+  Py_XDECREF(((PyObject *)p->upper));
   (*o->ob_type->tp_free)(o);
 }
 
 static int __pyx_tp_traverse_6cloess_conf_intervals(PyObject *o, visitproc v, void *a) {
   int e;
   struct __pyx_obj_6cloess_conf_intervals *p = (struct __pyx_obj_6cloess_conf_intervals *)o;
-  if (p->nest) {
-    e = (*v)(p->nest, a); if (e) return e;
+  if (p->lower) {
+    e = (*v)(((PyObject*)p->lower), a); if (e) return e;
   }
+  if (p->fit) {
+    e = (*v)(((PyObject*)p->fit), a); if (e) return e;
+  }
+  if (p->upper) {
+    e = (*v)(((PyObject*)p->upper), a); if (e) return e;
+  }
   return 0;
 }
 
 static int __pyx_tp_clear_6cloess_conf_intervals(PyObject *o) {
   struct __pyx_obj_6cloess_conf_intervals *p = (struct __pyx_obj_6cloess_conf_intervals *)o;
-  Py_XDECREF(p->nest);
-  p->nest = Py_None; Py_INCREF(Py_None);
+  Py_XDECREF(((PyObject *)p->lower));
+  p->lower = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(((PyObject *)p->fit));
+  p->fit = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
+  Py_XDECREF(((PyObject *)p->upper));
+  p->upper = ((PyArrayObject *)Py_None); Py_INCREF(Py_None);
   return 0;
 }
 
-static PyObject *__pyx_getprop_6cloess_14conf_intervals_fit(PyObject *o, void *x) {
-  return __pyx_f_6cloess_14conf_intervals_3fit___get__(o);
-}
-
-static PyObject *__pyx_getprop_6cloess_14conf_intervals_upper(PyObject *o, void *x) {
-  return __pyx_f_6cloess_14conf_intervals_5upper___get__(o);
-}
-
-static PyObject *__pyx_getprop_6cloess_14conf_intervals_lower(PyObject *o, void *x) {
-  return __pyx_f_6cloess_14conf_intervals_5lower___get__(o);
-}
-
 static struct PyMethodDef __pyx_methods_6cloess_conf_intervals[] = {
   {0, 0, 0, 0}
 };
 
-static struct PyGetSetDef __pyx_getsets_6cloess_conf_intervals[] = {
-  {"fit", __pyx_getprop_6cloess_14conf_intervals_fit, 0, __pyx_k26, 0},
-  {"upper", __pyx_getprop_6cloess_14conf_intervals_upper, 0, __pyx_k27, 0},
-  {"lower", __pyx_getprop_6cloess_14conf_intervals_lower, 0, __pyx_k28, 0},
+static struct PyMemberDef __pyx_members_6cloess_conf_intervals[] = {
+  {"lower", T_OBJECT, offsetof(struct __pyx_obj_6cloess_conf_intervals, lower), READONLY, 0},
+  {"fit", T_OBJECT, offsetof(struct __pyx_obj_6cloess_conf_intervals, fit), READONLY, 0},
+  {"upper", T_OBJECT, offsetof(struct __pyx_obj_6cloess_conf_intervals, upper), READONLY, 0},
   {0, 0, 0, 0, 0}
 };
 
@@ -5156,8 +5212,8 @@
   0, /*tp_iter*/
   0, /*tp_iternext*/
   __pyx_methods_6cloess_conf_intervals, /*tp_methods*/
-  0, /*tp_members*/
-  __pyx_getsets_6cloess_conf_intervals, /*tp_getset*/
+  __pyx_members_6cloess_conf_intervals, /*tp_members*/
+  0, /*tp_getset*/
   0, /*tp_base*/
   0, /*tp_dict*/
   0, /*tp_descr_get*/
@@ -5174,10 +5230,12 @@
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
 };
+static struct __pyx_vtabstruct_6cloess_loess_predicted __pyx_vtable_6cloess_loess_predicted;
 
 static PyObject *__pyx_tp_new_6cloess_loess_predicted(PyTypeObject *t, PyObject *a, PyObject *k) {
   PyObject *o = (*t->tp_alloc)(t, 0);
   struct __pyx_obj_6cloess_loess_predicted *p = (struct __pyx_obj_6cloess_loess_predicted *)o;
+  *(struct __pyx_vtabstruct_6cloess_loess_predicted **)&p->__pyx_vtab = __pyx_vtabptr_6cloess_loess_predicted;
   p->confidence_intervals = ((struct __pyx_obj_6cloess_conf_intervals *)Py_None); Py_INCREF(Py_None);
   return o;
 }
@@ -5241,10 +5299,10 @@
 };
 
 static struct PyGetSetDef __pyx_getsets_6cloess_loess_predicted[] = {
-  {"values", __pyx_getprop_6cloess_15loess_predicted_values, 0, __pyx_k29, 0},
-  {"stderr", __pyx_getprop_6cloess_15loess_predicted_stderr, 0, __pyx_k30, 0},
-  {"residual_scale", __pyx_getprop_6cloess_15loess_predicted_residual_scale, 0, __pyx_k31, 0},
-  {"df", __pyx_getprop_6cloess_15loess_predicted_df, 0, __pyx_k32, 0},
+  {"values", __pyx_getprop_6cloess_15loess_predicted_values, 0, __pyx_k26, 0},
+  {"stderr", __pyx_getprop_6cloess_15loess_predicted_stderr, 0, __pyx_k27, 0},
+  {"residual_scale", __pyx_getprop_6cloess_15loess_predicted_residual_scale, 0, __pyx_k28, 0},
+  {"df", __pyx_getprop_6cloess_15loess_predicted_df, 0, __pyx_k29, 0},
   {0, 0, 0, 0, 0}
 };
 
@@ -5572,6 +5630,151 @@
   0, /*tp_weaklist*/
 };
 
+static PyObject *__pyx_tp_new_6cloess_anova(PyTypeObject *t, PyObject *a, PyObject *k) {
+  PyObject *o = (*t->tp_alloc)(t, 0);
+  return o;
+}
+
+static void __pyx_tp_dealloc_6cloess_anova(PyObject *o) {
+  (*o->ob_type->tp_free)(o);
+}
+
+static int __pyx_tp_traverse_6cloess_anova(PyObject *o, visitproc v, void *a) {
+  return 0;
+}
+
+static int __pyx_tp_clear_6cloess_anova(PyObject *o) {
+  return 0;
+}
+
+static struct PyMethodDef __pyx_methods_6cloess_anova[] = {
+  {0, 0, 0, 0}
+};
+
+static struct PyMemberDef __pyx_members_6cloess_anova[] = {
+  {"dfn", T_DOUBLE, offsetof(struct __pyx_obj_6cloess_anova, dfn), READONLY, 0},
+  {"dfd", T_DOUBLE, offsetof(struct __pyx_obj_6cloess_anova, dfd), READONLY, 0},
+  {"F_value", T_DOUBLE, offsetof(struct __pyx_obj_6cloess_anova, F_value), READONLY, 0},
+  {"Pr_F", T_DOUBLE, offsetof(struct __pyx_obj_6cloess_anova, Pr_F), READONLY, 0},
+  {0, 0, 0, 0, 0}
+};
+
+static PyNumberMethods __pyx_tp_as_number_anova = {
+  0, /*nb_add*/
+  0, /*nb_subtract*/
+  0, /*nb_multiply*/
+  0, /*nb_divide*/
+  0, /*nb_remainder*/
+  0, /*nb_divmod*/
+  0, /*nb_power*/
+  0, /*nb_negative*/
+  0, /*nb_positive*/
+  0, /*nb_absolute*/
+  0, /*nb_nonzero*/
+  0, /*nb_invert*/
+  0, /*nb_lshift*/
+  0, /*nb_rshift*/
+  0, /*nb_and*/
+  0, /*nb_xor*/
+  0, /*nb_or*/
+  0, /*nb_coerce*/
+  0, /*nb_int*/
+  0, /*nb_long*/
+  0, /*nb_float*/
+  0, /*nb_oct*/
+  0, /*nb_hex*/
+  0, /*nb_inplace_add*/
+  0, /*nb_inplace_subtract*/
+  0, /*nb_inplace_multiply*/
+  0, /*nb_inplace_divide*/
+  0, /*nb_inplace_remainder*/
+  0, /*nb_inplace_power*/
+  0, /*nb_inplace_lshift*/
+  0, /*nb_inplace_rshift*/
+  0, /*nb_inplace_and*/
+  0, /*nb_inplace_xor*/
+  0, /*nb_inplace_or*/
+  0, /*nb_floor_divide*/
+  0, /*nb_true_divide*/
+  0, /*nb_inplace_floor_divide*/
+  0, /*nb_inplace_true_divide*/
+};
+
+static PySequenceMethods __pyx_tp_as_sequence_anova = {
+  0, /*sq_length*/
+  0, /*sq_concat*/
+  0, /*sq_repeat*/
+  0, /*sq_item*/
+  0, /*sq_slice*/
+  0, /*sq_ass_item*/
+  0, /*sq_ass_slice*/
+  0, /*sq_contains*/
+  0, /*sq_inplace_concat*/
+  0, /*sq_inplace_repeat*/
+};
+
+static PyMappingMethods __pyx_tp_as_mapping_anova = {
+  0, /*mp_length*/
+  0, /*mp_subscript*/
+  0, /*mp_ass_subscript*/
+};
+
+static PyBufferProcs __pyx_tp_as_buffer_anova = {
+  0, /*bf_getreadbuffer*/
+  0, /*bf_getwritebuffer*/
+  0, /*bf_getsegcount*/
+  0, /*bf_getcharbuffer*/
+};
+
+PyTypeObject __pyx_type_6cloess_anova = {
+  PyObject_HEAD_INIT(0)
+  0, /*ob_size*/
+  "cloess.anova", /*tp_name*/
+  sizeof(struct __pyx_obj_6cloess_anova), /*tp_basicsize*/
+  0, /*tp_itemsize*/
+  __pyx_tp_dealloc_6cloess_anova, /*tp_dealloc*/
+  0, /*tp_print*/
+  0, /*tp_getattr*/
+  0, /*tp_setattr*/
+  0, /*tp_compare*/
+  0, /*tp_repr*/
+  &__pyx_tp_as_number_anova, /*tp_as_number*/
+  &__pyx_tp_as_sequence_anova, /*tp_as_sequence*/
+  &__pyx_tp_as_mapping_anova, /*tp_as_mapping*/
+  0, /*tp_hash*/
+  0, /*tp_call*/
+  0, /*tp_str*/
+  0, /*tp_getattro*/
+  0, /*tp_setattro*/
+  &__pyx_tp_as_buffer_anova, /*tp_as_buffer*/
+  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
+  0, /*tp_doc*/
+  __pyx_tp_traverse_6cloess_anova, /*tp_traverse*/
+  __pyx_tp_clear_6cloess_anova, /*tp_clear*/
+  0, /*tp_richcompare*/
+  0, /*tp_weaklistoffset*/
+  0, /*tp_iter*/
+  0, /*tp_iternext*/
+  __pyx_methods_6cloess_anova, /*tp_methods*/
+  __pyx_members_6cloess_anova, /*tp_members*/
+  0, /*tp_getset*/
+  0, /*tp_base*/
+  0, /*tp_dict*/
+  0, /*tp_descr_get*/
+  0, /*tp_descr_set*/
+  0, /*tp_dictoffset*/
+  __pyx_f_6cloess_5anova___init__, /*tp_init*/
+  0, /*tp_alloc*/
+  __pyx_tp_new_6cloess_anova, /*tp_new*/
+  0, /*tp_free*/
+  0, /*tp_is_gc*/
+  0, /*tp_bases*/
+  0, /*tp_mro*/
+  0, /*tp_cache*/
+  0, /*tp_subclasses*/
+  0, /*tp_weaklist*/
+};
+
 static struct PyMethodDef __pyx_methods[] = {
   {0, 0, 0, 0}
 };
@@ -5590,36 +5793,45 @@
   if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;};
   if (__Pyx_InternStrings(__pyx_intern_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;};
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; goto __pyx_L1;};
-  if (PyType_Ready(&__pyx_type_6cloess_loess_inputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_inputs", (PyObject *)&__pyx_type_6cloess_loess_inputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess_inputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_inputs", (PyObject *)&__pyx_type_6cloess_loess_inputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_inputs = &__pyx_type_6cloess_loess_inputs;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_control) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_control", (PyObject *)&__pyx_type_6cloess_loess_control) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess_control) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_control", (PyObject *)&__pyx_type_6cloess_loess_control) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_control = &__pyx_type_6cloess_loess_control;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_kd_tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_kd_tree", (PyObject *)&__pyx_type_6cloess_loess_kd_tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess_kd_tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 360; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_kd_tree", (PyObject *)&__pyx_type_6cloess_loess_kd_tree) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 360; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_kd_tree = &__pyx_type_6cloess_loess_kd_tree;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_model) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_model", (PyObject *)&__pyx_type_6cloess_loess_model) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; goto __pyx_L1;}
+  __pyx_vtabptr_6cloess_loess_model = &__pyx_vtable_6cloess_loess_model;
+  *(void(**)())&__pyx_vtable_6cloess_loess_model.setup = (void(*)())__pyx_f_6cloess_11loess_model_setup;
+  if (PyType_Ready(&__pyx_type_6cloess_loess_model) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; goto __pyx_L1;}
+  if (__Pyx_SetVtable(__pyx_type_6cloess_loess_model.tp_dict, __pyx_vtabptr_6cloess_loess_model) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_model", (PyObject *)&__pyx_type_6cloess_loess_model) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_model = &__pyx_type_6cloess_loess_model;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_outputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_outputs", (PyObject *)&__pyx_type_6cloess_loess_outputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess_outputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_outputs", (PyObject *)&__pyx_type_6cloess_loess_outputs) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_outputs = &__pyx_type_6cloess_loess_outputs;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_anova) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_anova", (PyObject *)&__pyx_type_6cloess_loess_anova) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 604; goto __pyx_L1;}
-  __pyx_ptype_6cloess_loess_anova = &__pyx_type_6cloess_loess_anova;
+  __pyx_vtabptr_6cloess_conf_intervals = &__pyx_vtable_6cloess_conf_intervals;
+  *(void(**)())&__pyx_vtable_6cloess_conf_intervals.setup = (void(*)())__pyx_f_6cloess_14conf_intervals_setup;
   __pyx_type_6cloess_conf_intervals.tp_free = _PyObject_GC_Del;
-  if (PyType_Ready(&__pyx_type_6cloess_conf_intervals) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "conf_intervals", (PyObject *)&__pyx_type_6cloess_conf_intervals) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_conf_intervals) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; goto __pyx_L1;}
+  if (__Pyx_SetVtable(__pyx_type_6cloess_conf_intervals.tp_dict, __pyx_vtabptr_6cloess_conf_intervals) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "conf_intervals", (PyObject *)&__pyx_type_6cloess_conf_intervals) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; goto __pyx_L1;}
   __pyx_ptype_6cloess_conf_intervals = &__pyx_type_6cloess_conf_intervals;
+  __pyx_vtabptr_6cloess_loess_predicted = &__pyx_vtable_6cloess_loess_predicted;
+  *(void(**)())&__pyx_vtable_6cloess_loess_predicted.setup = (void(*)())__pyx_f_6cloess_15loess_predicted_setup;
   __pyx_type_6cloess_loess_predicted.tp_free = _PyObject_GC_Del;
-  if (PyType_Ready(&__pyx_type_6cloess_loess_predicted) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess_predicted", (PyObject *)&__pyx_type_6cloess_loess_predicted) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 667; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess_predicted) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 647; goto __pyx_L1;}
+  if (__Pyx_SetVtable(__pyx_type_6cloess_loess_predicted.tp_dict, __pyx_vtabptr_6cloess_loess_predicted) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 647; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess_predicted", (PyObject *)&__pyx_type_6cloess_loess_predicted) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 647; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess_predicted = &__pyx_type_6cloess_loess_predicted;
   __pyx_type_6cloess_loess.tp_free = _PyObject_GC_Del;
-  if (PyType_Ready(&__pyx_type_6cloess_loess) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; goto __pyx_L1;}
-  if (PyObject_SetAttrString(__pyx_m, "loess", (PyObject *)&__pyx_type_6cloess_loess) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 743; goto __pyx_L1;}
+  if (PyType_Ready(&__pyx_type_6cloess_loess) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "loess", (PyObject *)&__pyx_type_6cloess_loess) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; goto __pyx_L1;}
   __pyx_ptype_6cloess_loess = &__pyx_type_6cloess_loess;
+  if (PyType_Ready(&__pyx_type_6cloess_anova) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; goto __pyx_L1;}
+  if (PyObject_SetAttrString(__pyx_m, "anova", (PyObject *)&__pyx_type_6cloess_anova) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 880; goto __pyx_L1;}
+  __pyx_ptype_6cloess_anova = &__pyx_type_6cloess_anova;
   __pyx_ptype_7c_numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr)); if (!__pyx_ptype_7c_numpy_dtype) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 76; goto __pyx_L1;}
   __pyx_ptype_7c_numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject)); if (!__pyx_ptype_7c_numpy_ndarray) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 81; goto __pyx_L1;}
   __pyx_ptype_7c_numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject)); if (!__pyx_ptype_7c_numpy_flatiter) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 90; goto __pyx_L1;}
@@ -5630,27 +5842,34 @@
   if (PyObject_SetAttr(__pyx_m, __pyx_n_numpy, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; goto __pyx_L1;}
   Py_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":15 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":9 */
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_n_numpy); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; goto __pyx_L1;}
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_n_array); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; goto __pyx_L1;}
+  Py_DECREF(__pyx_1); __pyx_1 = 0;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_narray, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; goto __pyx_L1;}
+  Py_DECREF(__pyx_2); __pyx_2 = 0;
+
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":12 */
   import_array();
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":48 */
-  __pyx_k34;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":73 */
+  __pyx_k31;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":710 */
-  __pyx_1 = PyFloat_FromDouble(0.95); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; goto __pyx_L1;}
-  __pyx_k35 = __pyx_1;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":721 */
+  __pyx_1 = PyFloat_FromDouble(0.95); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 721; goto __pyx_L1;}
+  __pyx_k32 = __pyx_1;
   __pyx_1 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":753 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":763 */
   Py_INCREF(Py_None);
-  __pyx_k36 = Py_None;
+  __pyx_k33 = Py_None;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":821 */
-  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 821; goto __pyx_L1;}
-  __pyx_k37 = __pyx_2;
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":834 */
+  __pyx_2 = __Pyx_GetName(__pyx_b, __pyx_n_False); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 834; goto __pyx_L1;}
+  __pyx_k34 = __pyx_2;
   __pyx_2 = 0;
 
-  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":854 */
+  /* "/home/backtopop/workspace/pyloess_c/src/cloess.pyx":883 */
   return;
   __pyx_L1:;
   Py_XDECREF(__pyx_1);
@@ -5940,6 +6159,25 @@
     return 0;
 }
 
+static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
+    PyObject *pycobj = 0;
+    int result;
+    
+    pycobj = PyCObject_FromVoidPtr(vtable, 0);
+    if (!pycobj)
+        goto bad;
+    if (PyDict_SetItemString(dict, "__pyx_vtable__", pycobj) < 0)
+        goto bad;
+    result = 0;
+    goto done;
+
+bad:
+    result = -1;
+done:
+    Py_XDECREF(pycobj);
+    return result;
+}
+
 static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, 
     long size) 
 {

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/cloess.h
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/cloess.h	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/cloess.h	2007-03-19 23:50:21 UTC (rev 2850)
@@ -4,15 +4,18 @@
 
 // from loess.c
 void loess_setup(double *x, double *y, int n, int p, loess *lo);
-void loess_fit(loess *lo);
+char loess_fit(loess *lo);
 void loess_free_mem(loess *lo);
 void loess_summary(loess *lo);
                
 // from misc.c
-void anova(loess *one, loess *two, anova_struct *out);
-void pointwise(prediction *pre, int m, double coverage, conf_inv *ci);     
+void pointwise(prediction *pre, int m, double coverage, conf_inv *ci); 
 void pw_free_mem(conf_inv *ci);
+double pf(double q, double df1, double df2);
+double ibeta(double x, double a, double b);
 ////
 // from predict.c
 void predict(double *eval, int m, loess *lo, prediction *pre, int se);
 void pred_free_mem(prediction *pre);
+//
+

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/cloess.pyx
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/cloess.pyx	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/cloess.pyx	2007-03-19 23:50:21 UTC (rev 2850)
@@ -6,26 +6,18 @@
     NPY_INT, NPY_DOUBLE, NPY_OWNDATA, NPY_ALIGNED, NPY_FORTRAN, \
     PyArray_SimpleNewFromData
 import numpy
+narray = numpy.array
 
-#narray = _N.array
-#ndouble = _N.float
-#nbool = _N.bool
-
 # NumPy must be initialized
 c_numpy.import_array()
 
 cimport c_loess
 
-
 cdef floatarray_from_data(int rows, int cols, double *data):
     cdef ndarray a_ndr
     cdef npy_intp size
     size = rows*cols
     a_ndr = <object>PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, data)
-#    a_ndr = numpy.empty((rows*cols,), dtype=numpy.float)
-#    a_dat = <double *>a_ndr.data
-#    for i from 0 <= i < a_ndr.size:
-#        a_dat[i] = data[i]
     if cols > 1:
         a_ndr.shape = (rows, cols)
     return a_ndr
@@ -34,17 +26,50 @@
     cdef ndarray a_ndr
     cdef npy_intp size
     size = rows*cols
-#    cdef int *a_dat
-#    a_ndr = numpy.empty((rows*cols,), dtype=numpy.int)
     a_ndr = <object>PyArray_SimpleNewFromData(1, &size, NPY_DOUBLE, data)
-#    a_dat = <int *>a_ndr.data
-#    for i from 0 <= i < a_ndr.size:
-#        a_dat[i] = data[i]
     if cols > 1:
         a_ndr.shape = (rows, cols)
     return a_ndr.astype(numpy.bool)
 
+##cimport modelflags
+##import modelflags
+#
+#cdef list_to_clist(object p_list):
+#    cdef int i, imax
+#    p_list = list(p_list)
+#    imax = min(8, len(p_list))
+#    for i from 0 <= i < imax:
+#        c_list[i] = p_list[i]
+#    return c_list[0]
+#cdef object clist_to_list(int c_list[8]):
+#    cdef int i, imax
+#    p_list = [False] * 8
+#    imax = min(8, len(p_list))
+#    for i from 0 <= i < imax:
+#        p_list[i] = c_list[i]
+#    return p_list
+#        
+#
+#class modelflags:
+#    def __init__(self):
+#        self.str_list = [False] * 8
+#        self.c_list = list_to_clist(self.str_list)
+#    def __getitem__(self, idx):
+#        return self.str_list[idx]
+#    def __setitem__(self, idx, val):
+#        cdef int tmpval
+#        tmpval = val
+#        self.c_list[idx] = tmpval
+#        self.str_list[idx] = bool(val)
+#    def __str__(self):
+#        return str(self.str_list)
+#
+##class modelflags(c_modelflags):
+##    def __init__(self):
+##        c_modelflags.__init__(self)
+##        
 
+
 """
 :Keywords:
     x : ndarray
@@ -334,35 +359,47 @@
 ######---------------------------------------------------------------------------
 cdef class loess_kd_tree:
     cdef c_loess.c_loess_kd_tree *_base
-#    #.........
-#    property parameter:
-#        def __get__(self):
-#            return self._base.parameter
-#    #.........
-#    property a:
-#        def __get__(self):
-#            return self._base.a
-#    #.........
-#    property vval:
-#        def __get__(self):
-#            return self._base.vert
-#    #.........
-#    property xi:
-#        def __get__(self):
-#            return self._base.xi
-#    #.........
-#    property vert:
-#        def __get__(self):
-#            return self._base.vert
-#        return
-#    
+
 ######---------------------------------------------------------------------------
 ##---- ---- loess model ---
 ######---------------------------------------------------------------------------
 cdef class loess_model:
     cdef c_loess.c_loess_model *_base
     cdef long npar
+#    cdef public double span
+#    cdef public int degree
+#    cdef public char *family
+#    cdef public parametric_mflags, drop_square_mflags
     #.........
+    cdef setup(self, c_loess.c_loess_model *base, long npar):
+        self._base = base
+        self.npar = npar
+#        self.parametric_flags = modelflags()
+#        self.parametric_flags.c_list[0] = base.parametric[0]
+#        self.drop_square_flags = modelflags()
+#        self.drop_square_flags.c_list[0] = base.drop_square[0]
+#        self.span = self._base.span
+#        self.degree = self._base.degree
+#        self.family = self._base.family
+#        self.parametric_flags = boolarray_from_data(self.npar, 1, self._base.parametric)
+#        self.drop_square_flags = boolarray_from_data(self.npar, 1, self._base.drop_square)
+        return self    
+    #.........
+    property normalize:
+        """
+    normalize : boolean [True]
+        Determines whether the independent variables should be normalized.  
+        If True, the normalization is performed by setting the 10% trimmed 
+        standard deviation to one. If False, no normalization is carried out. 
+        This option is only useful for more than one variable. For spatial
+        coordinates predictors or variables with a common scale, it should be 
+        set to False.
+        """
+        def __get__(self):
+            return bool(self._base.normalize)
+        def __set__(self, normalize):
+            self._base.normalize = normalize
+    #.........
     property span:
         """Smoothing factor, as a fraction of the number of points to take into
     account. By default, span=0.75."""
@@ -385,21 +422,6 @@
             if degree < 0 or degree > 2:
                 raise ValueError("Degree should be between 0 and 2!")
     #.........
-    property normalize:
-        """
-    normalize : boolean [True]
-        Determines whether the independent variables should be normalized.  
-        If True, the normalization is performed by setting the 10% trimmed 
-        standard deviation to one. If False, no normalization is carried out. 
-        This option is only useful for more than one variable. For spatial
-        coordinates predictors or variables with a common scale, it should be 
-        set to False.
-        """
-        def __get__(self):
-            return bool(self._base.normalize)
-        def __set__(self, normalize):
-            self._base.normalize = normalize
-    #.........
     property family:
         """
     family : string ["gaussian"]
@@ -428,12 +450,11 @@
             return boolarray_from_data(self.npar, 1, self._base.parametric)
         def __set__(self, paramf):
             cdef ndarray p_ndr
-            cdef long *p_dat
             cdef int i
-            p_ndr = numpy.array(paramf, copy=False, subok=True, dtype=numpy.int)
-            p_dat = <long *>p_ndr.data
-            for i from 0 <= i < min(self.npar, p_ndr.size - 1):
-                self._base.parametric[i] = p_dat[i]
+            p_ndr = numpy.atleast_1d(narray(paramf, copy=False, subok=True, 
+                                            dtype=numpy.bool))
+            for i from 0 <= i < min(self.npar, p_ndr.size):
+                self._base.parametric[i] = p_ndr[i]
     #.........
     property drop_square_flags:
         """
@@ -447,12 +468,11 @@
             return boolarray_from_data(self.npar, 1, self._base.drop_square)
         def __set__(self, drop_sq):
             cdef ndarray d_ndr
-            cdef long *d_dat
             cdef int i
-            d_ndr = numpy.array(drop_sq, copy=False, subok=True, dtype=numpy.int)
-            d_dat = <long *>d_ndr.data
-            for i from 0 <= i < min(self.npar, d_ndr.size - 1):
-                self._base.drop_square[i] = d_dat[i]
+            d_ndr = numpy.atleast_1d(narray(drop_sq, copy=False, subok=True, 
+                                            dtype=numpy.bool))
+            for i from 0 <= i < min(self.npar, d_ndr.size):
+                self._base.drop_square[i] = d_ndr[i]
     #........
     def update(self, **modelargs):
         family = modelargs.get('family', None)
@@ -545,7 +565,7 @@
     property divisor:
         "Equivalent number of parameters."
         def __get__(self):
-            return floatarray_from_data(self.nvar, 1, self._base.divisor)
+            return floatarray_from_data(self.npar, 1, self._base.divisor)
     #.........    
     property enp:
         """
@@ -585,7 +605,7 @@
         Trace of the operator hat matrix.
         """
         def __get__(self):
-            return self._base.trace_hat    #        ""
+            return self._base.trace_hat
     #.........
     def __str__(self):
         strg = ["Outputs................",
@@ -598,63 +618,23 @@
         return '\n'.join(strg)
 
 
-#####---------------------------------------------------------------------------
-#---- ---- loess anova ---
-#####---------------------------------------------------------------------------
-cdef class loess_anova:
-    cdef c_loess.c_anova *_base
-    cdef long nest
-    #.........
-    property dfn:
-        def __get__(self):
-            return self._base.dfn
-    #.........
-    property dfd:
-        def __get__(self):
-            return self._base.dfd
-    #.........
-    property F_value:
-        def __get__(self):
-            return self._base.F_value
-    #.........
-    property Pr_F:
-        def __get__(self):
-            return self._base.Pr_F
         
 #####---------------------------------------------------------------------------
 #---- ---- loess confidence ---
 #####---------------------------------------------------------------------------
 cdef class conf_intervals:
     cdef c_loess.c_conf_inv _base
-    cdef nest
+    cdef readonly ndarray lower, fit, upper
     #.........
-    def __dealloc__(self):
-        c_loess.pw_free_mem(self)
+#    def __dealloc__(self):
+#        c_loess.pw_free_mem(self._base)
     #.........
-    property fit:
-        """
-    fit : ndarray
-        The (m,) ndarray of estimated values
-        """
-        def __get__(self):
-            return floatarray_from_data(self.nest, 1, self._base.fit)
+    cdef setup(self, c_loess.c_conf_inv base, long nest):
+        self._base = base
+        self.fit = floatarray_from_data(nest, 1, base.fit)
+        self.upper = floatarray_from_data(nest, 1, base.upper)
+        self.lower = floatarray_from_data(nest, 1, base.lower)
     #.........
-    property upper:
-        """
-    upper : ndarray
-        The (m,) ndarray of the upper limits of the pointwise confidence intervals.
-        """  
-        def __get__(self):
-            return floatarray_from_data(self.nest, 1, self._base.upper)
-    #.........
-    property lower:  
-        """
-    lower : ndarray
-        The (m,) ndarray of the lower limits of the pointwise confidence intervals.
-        """
-        def __get__(self):
-            return floatarray_from_data(self.nest, 1, self._base.lower)
-    #.........
     def __str__(self):
         cdef ndarray tmp_ndr
         tmp_ndr = numpy.r_[[self.lower,self.fit,self.upper]].T
@@ -668,11 +648,42 @@
     cdef c_loess.c_prediction _base
     cdef readonly long nest
     cdef readonly conf_intervals confidence_intervals
-
+#    cdef readonly ndarray values, stderr
+#    cdef readonly double residual_scale, df
     #.........
     def __dealloc__(self):
         c_loess.pred_free_mem(&self._base)      
     #.........
+    cdef setup(self, c_loess.c_prediction base, long nest):
+        self._base = base
+        self.nest = nest
+#    cdef setup(self, c_loess.c_loess loess_base, object newdata, stderror):
+#        cdef ndarray p_ndr
+#        cdef double *p_dat
+#        cdef c_loess.c_prediction _prediction
+#        cdef int i, m
+#        #
+#        # Note : we need a copy as we may have to normalize
+#        p_ndr = narray(newdata, copy=True, subok=True, order='C').ravel()
+#        p_dat = <double *>p_ndr.data
+#        # Test the compatibility of sizes .......
+#        if p_ndr.size == 0:
+#            raise ValueError("Can't predict without input data !")
+#        (m, notOK) = divmod(len(p_ndr), loess_base.inputs.p)
+#        if notOK:
+#            raise ValueError(
+#                  "Incompatible data size: there should be as many rows as parameters")
+#        #.....
+#        c_loess.c_predict(p_dat, m, &loess_base, &_prediction, stderror)
+#        if loess_base.status.err_status:
+#            raise ValueError(loess_base.status.err_msg)
+#        self._base = _prediction
+#        self.nest = m
+##        self.values = floatarray_from_data(m, 1, _prediction.fit)
+##        self.stderr = floatarray_from_data(m, 1, _prediction.se_fit)
+##        self.residual_scale = _prediction.residual_scale
+##        self.df = _prediction.df
+    #.........
     property values:
         """
     values : ndarray
@@ -705,7 +716,7 @@
         confidence intervals for the evaluated surface.
         """
         def __get__(self):
-            return self._base.df
+            return self._base.df        
     #.........
     def confidence(self, coverage=0.95):
         """Returns the pointwise confidence intervals for each predicted values,
@@ -715,15 +726,14 @@
     coverage : float
         Confidence level of the confidence intervals limits, as a fraction.
         """
-        cdef c_loess.c_conf_inv _conf_intv
+        cdef c_loess.c_conf_inv _confintv
         if coverage < 0.5:
             coverage = 1. - coverage 
         if coverage > 1. :
             raise ValueError("The coverage precentage should be between 0 and 1!")
-        c_loess.pointwise(&self._base, self.nest, coverage, &_conf_intv)
+        c_loess.c_pointwise(&self._base, self.nest, coverage, &_confintv)
         self.confidence_intervals = conf_intervals()
-        self.confidence_intervals._base = _conf_intv
-        self.confidence_intervals.nest = self.nest
+        self.confidence_intervals.setup(_confintv, self.nest)
         return self.confidence_intervals
     #.........
     def __str__(self):
@@ -756,7 +766,7 @@
         cdef double *x_dat, *y_dat
         cdef int i
         # Get the predictor array
-        x_ndr = numpy.array(x, copy=True, subok=True, order='C')
+        x_ndr = narray(x, copy=True, subok=True, order='C')
         x_dat = <double *>x_ndr.data
         n = len(x_ndr)
         p = x_ndr.size / n
@@ -766,7 +776,7 @@
         if p > 1:
             x_ndr.shape = (n*p,)
         # Get the response array ......
-        y_ndr = numpy.array(y, copy=False, subok=True, order='C')
+        y_ndr = narray(y, copy=False, subok=True, order='C')
         y_dat = <double *>y_ndr.data
         if y_ndr.size != n:
             raise ValueError("Incompatible size between the response array (%i)"\
@@ -778,8 +788,9 @@
         self.inputs._base = &self._base.inputs
         #
         self.model = loess_model()
-        self.model._base = &self._base.model
-        self.model.npar = p
+        self.model.setup(&self._base.model, p)
+#        self.model._base = &self._base.model
+#        self.model.npar = p
         #
         self.control = loess_control()
         self.control._base = &self._base.control
@@ -808,6 +819,8 @@
     def fit(self):
         c_loess.loess_fit(&self._base)
         self.outputs.activated = True
+        if self._base.status.err_status:
+            raise ValueError(self._base.status.err_msg)
         return
     #......................................................
     def summary(self):
@@ -818,7 +831,7 @@
         else:
             print "Residual Scale Estimate        : %.4f" % self.outputs.s
     #......................................................
-    def predict(self, newdata, stderr=False):
+    def predict(self, newdata, stderror=False):
         """
     newdata: ndarray
         A (m,p) ndarray specifying the values of the predictors at which the 
@@ -834,8 +847,10 @@
         if self.outputs.activated == 0:
             c_loess.loess_fit(&self._base)
             self.outputs.activated = True
+            if self._base.status.err_status:
+                raise ValueError(self._base.status.err_msg)
         # Note : we need a copy as we may have to normalize
-        p_ndr = numpy.array(newdata, copy=True, subok=True, order='C').ravel()
+        p_ndr = narray(newdata, copy=True, subok=True, order='C').ravel()
         p_dat = <double *>p_ndr.data
         # Test the compatibility of sizes .......
         if p_ndr.size == 0:
@@ -845,10 +860,13 @@
             raise ValueError(
                   "Incompatible data size: there should be as many rows as parameters")
         #.....
-        c_loess.predict(p_dat, m, &self._base, &_prediction, stderr)
+        c_loess.c_predict(p_dat, m, &self._base, &_prediction, stderror)
+        if self._base.status.err_status:
+            raise ValueError(self._base.status.err_msg)
         self.predicted = loess_predicted()
         self.predicted._base = _prediction
         self.predicted.nest = m
+#        self.predicted.setup(_prediction, m)
         return self.predicted
     #.........
     def __dealloc__(self):
@@ -856,27 +874,46 @@
     #......................................................
     
 
-#cdef prediction(loess loess_obj, object newdata, object stderr):
-#    cdef c_loess.c_prediction _base
-#    cdef ndarray p_ndr
-#    cdef double *p_dat
-#    cdef int i, m
-#    cdef loess_prediction result
-#    #
-#    p_ndr = numpy.array(newdata, copy=False, subok=True, order='F') #.ravel()
-##   p_ndr = <ndarray>PyArray_FROMANY(newdata, NPY_DOUBLE, 1, self.model.npar, NPY_FORTRAN)
-#    p_dat = <double *>p_ndr.data
-#    m = len(p_ndr)    
-#    c_loess.predict(p_dat, m, &loess_obj._base, &_base, stderr)
-#    result = loess_predicted()
-#    result._base = _base
-#    result.nest = m
-#    return result
+#####---------------------------------------------------------------------------
+#---- ---- loess anova ---
+#####---------------------------------------------------------------------------
+cdef class anova:
+    cdef readonly double dfn, dfd, F_value, Pr_F
+    #
+    def __init__(self, loess_one, loess_two):
+        cdef double one_d1, one_d2, one_s, two_d1, two_d2, two_s, rssdiff,\
+                    d1diff, tmp, df1, df2
+        #
+        if not isinstance(loess_one, loess) or not isinstance(loess_two, loess):
+            raise ValueError("Arguments should be valid loess objects!"\
+                             "got '%s' instead" % type(loess_one))
+        #
+        out_one = loess_one.outputs
+        out_two = loess_two.outputs
+        #
+        one_d1 = out_one.one_delta
+        one_d2 = out_one.two_delta
+        one_s = out_one.s
+        #
+        two_d1 = out_two.one_delta
+        two_d2 = out_two.two_delta
+        two_s = out_two.s
+        #
+        rssdiff = abs(one_s * one_s * one_d1 - two_s * two_s * two_d1)
+        d1diff = abs(one_d1 - two_d1)
+        self.dfn = d1diff * d1diff / abs(one_d2 - two_d2)
+        df1 = self.dfn
+        #
+        if out_one.enp > out_two.enp:
+            self.dfd = one_d1 * one_d1 / one_d2
+            tmp = one_s
+        else:
+            self.dfd = two_d1 * two_d1 / two_d2
+            tmp = two_s
+        df2 = self.dfd
+        F_value = (rssdiff / d1diff) / (tmp * tmp)
+        
+        self.Pr_F = 1. - c_loess.ibeta(F_value*df1/(df2+F_value*df1), df1/2, df2/2)
+        self.F_value = F_value
 
-
-#def anova(loess_one, loess_two):
-#    cdef c_loess.c_anova result
-#   
-#    c_loess.anova(loess_one._base, loess_two._base, &result)
-#        
         
\ No newline at end of file

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/loess.c
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/loess.c	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/loess.c	2007-03-19 23:50:21 UTC (rev 2850)
@@ -2,10 +2,14 @@
 #include "loess.h"
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 
 static char *surf_stat;
 
+int error_status = 0;
+char *error_message = NULL;
+
 void
 loess_setup(double *x, double *y, long n, long p, loess *lo)
 {
@@ -59,13 +63,17 @@
 
     size_info[0] = lo->inputs.p;
     size_info[1] = lo->inputs.n;
+    
+    //Reset the default error status...
+    error_status = 0;
+    lo->status.err_status = 0;
+    lo->status.err_msg = NULL;
 
     iterations = (!strcmp(lo->model.family, "gaussian")) ? 0 :
     lo->control.iterations;
     if(!strcmp(lo->control.trace_hat, "wait.to.decide")) {
         if(!strcmp(lo->control.surface, "interpolate"))
-            lo->control.trace_hat = (lo->inputs.n < 500) ? "exact" :
-"approximate";
+            lo->control.trace_hat = (lo->inputs.n < 500) ? "exact" : "approximate";
         else
             lo->control.trace_hat = "exact";
         }
@@ -96,6 +104,11 @@
            lo->kd_tree.xi,
            lo->kd_tree.vert,
            lo->kd_tree.vval);
+
+    if(error_status){
+        lo->status.err_status = error_status;
+        lo->status.err_msg = error_message;
+    }
 }
 
 void
@@ -115,7 +128,7 @@
             setLf, nonparametric = 0, *order_parametric,
             *order_drop_sqr, zero = 0, max_kd, *a_tmp, *param_tmp;
     int     cut, comp();
-    char    *new_stat;
+    char    *new_stat, *mess;
     void    condition();
 
     D = size_info[0];
@@ -167,6 +180,7 @@
     }
     else
         for(i = 0; i < D; i++) divisor[i] = 1;
+    
     j = D - 1;
     for(i = 0; i < D; i++) {
         sum_drop_sqr = sum_drop_sqr + drop_square[i];
@@ -176,6 +190,7 @@
         else
             order_parametric[nonparametric++] = i;
     }
+    //Reorder the predictors w/ the non-parametric first
     for(i = 0; i < D; i++) {
         order_drop_sqr[i] = 2 - drop_square[order_parametric[i]];
         k = i * N;
@@ -183,20 +198,29 @@
         for(j = 0; j < N; j++)
             x[k + j] = x_tmp[p + j];
     }
+    
+    // Misc. checks .............................
     if((*degree) == 1 && sum_drop_sqr) {
-        fprintf(stderr, "Specified the square of a factor predictor to be"\
-                        "dropped when degree = 1");
-        exit(1);
+    	error_status = 1;
+    	error_message = "Specified the square of a factor predictor to be "\
+               			"dropped when degree = 1";
+        return;
     }
+    
     if(D == 1 && sum_drop_sqr) {
-        fprintf(stderr, "Specified the square of a predictor to be dropped"\
-                        "with only one numeric predictor");
-        exit(1);
+    	error_status = 1;
+        error_message = "Specified the square of a predictor to be dropped "\
+                        "with only one numeric predictor";
+        return;
     }
+    
     if(sum_parametric == D) {
-        fprintf(stderr, "Specified parametric for all predictors");
-        exit(1);
+    	error_status = 1;
+        error_message = "Specified parametric for all predictors";
+        return;
         }
+        
+    // Start the iterations .....................
     for(j = 0; j <= (*iterations); j++) {
         new_stat = j ? "none" : *statistics;
         for(i = 0; i < N; i++)
@@ -221,8 +245,7 @@
     }
     if((*iterations) > 0) {
         F77_SUB(lowesp)(&N, y, fitted_values, weights, robust, temp,
-pseudovalues);
-
+						pseudovalues);
         loess_raw(pseudovalues, x, weights, weights, &D, &N, span,
                   degree, &nonparametric, order_drop_sqr, &sum_drop_sqr,
                   &new_cell, &surf_stat, temp, param_tmp, a_tmp, xi_tmp,
@@ -241,7 +264,8 @@
                     pseudo_resid[i] * pseudo_resid[i];
     *enp = (*one_delta) + 2 * (*trace_hat_out) - N;
     *s = sqrt(sum_squares / (*one_delta));
-
+    
+    //Clean the mess and leave ..................
     free(x);
     free(x_tmp);
     free(temp);

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/loess.h
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/loess.h	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/loess.h	2007-03-19 23:50:21 UTC (rev 2850)
@@ -5,6 +5,11 @@
 #define FALSE 0
 
 typedef struct {
+    int err_status;
+    char *err_msg;
+    } loess_errstatus;
+
+typedef struct {
     long    n;
     long    p;
     double  *y;
@@ -57,6 +62,7 @@
     loess_control control;
     loess_kd_tree kd_tree;
     loess_outputs outputs;
+    loess_errstatus status;
 } loess;
 
 typedef struct {

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/loessc.c
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/loessc.c	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/loessc.c	2007-03-19 23:50:21 UTC (rev 2850)
@@ -3,14 +3,17 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define    min(x,y)  ((x) < (y) ? (x) : (y))
-#define    max(x,y)  ((x) > (y) ? (x) : (y))
-#define    GAUSSIAN    1
-#define SYMMETRIC    0
+#define  min(x,y)  ((x) < (y) ? (x) : (y))
+#define  max(x,y)  ((x) > (y) ? (x) : (y))
+#define  GAUSSIAN  1
+#define  SYMMETRIC 0
 
 static int *iv, liv, lv, tau;
 static double *v;
 
+extern char *error_message;
+extern int error_status;
+
 loess_raw(double *y, double *x, double *weights, double *robust, int *d,
           int*n, double *span, int *degree, int *nonparametric,
           int *drop_square, int *sum_drop_sqr, double *cell, char **surf_stat,
@@ -32,7 +35,7 @@
     }
     else if (!strcmp(*surf_stat, "direct/none")) {
         F77_SUB(lowesf)(x, y, robust, iv, &liv, &lv, v, n, x,
-            &zero, &zero, surface);
+                        &zero, &zero, surface);
     }
     else if (!strcmp(*surf_stat, "interpolate/1.approx")) {
         F77_SUB(lowesb)(x, y, weights, diagonal, &one, iv, &liv, &lv, v);
@@ -261,47 +264,121 @@
 {
 char *mess, mess2[50];
 switch(*i){
-case 100: mess="wrong version number in lowesd.  Probably typo in caller."; break;
-case 101: mess="d>dMAX in ehg131.  Need to recompile with increased dimensions."; break;
-case 102: mess="liv too small.   (Discovered by lowesd)"; break;
-case 103: mess="lv too small.    (Discovered by lowesd)"; break;
-case 104: mess="span too small.  fewer data values than degrees of freedom."; break;
-case 105: mess="k>d2MAX in ehg136.  Need to recompile with increased dimensions."; break;
-case 106: mess="lwork too small"; break;
-case 107: mess="invalid value for kernel"; break;
-case 108: mess="invalid value for ideg"; break;
-case 109: mess="lowstt only applies when kernel=1."; break;
-case 110: mess="not enough extra workspace for robustness calculation"; break;
-case 120: mess="zero-width neighborhood. make span bigger"; break;
-case 121: mess="all data on boundary of neighborhood. make span bigger"; break;
-case 122: mess="extrapolation not allowed with blending"; break;
-case 123: mess="ihat=1 (diag L) in l2fit only makes sense if z=x (eval=data)."; break;
-case 171: mess="lowesd must be called first."; break;
-case 172: mess="lowesf must not come between lowesb and lowese, lowesr, or lowesl."; break;
-case 173: mess="lowesb must come before lowese, lowesr, or lowesl."; break;
-case 174: mess="lowesb need not be called twice."; break;
-case 175: mess="need setLf=.true. for lowesl."; break;
-case 180: mess="nv>nvmax in cpvert."; break;
-case 181: mess="nt>20 in eval."; break;
-case 182: mess="svddc failed in l2fit."; break;
-case 183: mess="didnt find edge in vleaf."; break;
-case 184: mess="zero-width cell found in vleaf."; break;
-case 185: mess="trouble descending to leaf in vleaf."; break;
-case 186: mess="insufficient workspace for lowesf."; break;
-case 187: mess="insufficient stack space"; break;
-case 188: mess="lv too small for computing explicit L"; break;
-case 191: mess="computed trace L was negative; something is wrong!"; break;
-case 192: mess="computed delta was negative; something is wrong!"; break;
-case 193: mess="workspace in loread appears to be corrupted"; break;
-case 194: mess="trouble in l2fit/l2tr"; break;
-case 195: mess="only constant, linear, or quadratic local models allowed"; break;
-case 196: mess="degree must be at least 1 for vertex influence matrix"; break;
-case 999: mess="not yet implemented"; break;
-default: sprintf(mess=mess2,"Assert failed; error code %d\n",*i); break;
+case 100:
+    mess="Wrong version number in lowesd.  Probably typo in caller.";
+    break;
+case 101:
+    mess="d>dMAX in ehg131.  Need to recompile with increased dimensions.";
+    break;
+case 102:
+    mess="liv too small. (Discovered by lowesd)";
+    break;
+case 103:
+    mess="lv too small. (Discovered by lowesd)";
+    break;
+case 104:
+    mess="Span too small. Fewer data values than degrees of freedom.";
+    break;
+case 105:
+    mess="k>d2MAX in ehg136.  Need to recompile with increased dimensions.";
+    break;
+case 106:
+    mess="lwork too small";
+    break;
+case 107:
+    mess="Invalid value for kernel";
+    break;
+case 108:
+    mess="Invalid value for ideg";
+    break;
+case 109:
+    mess="lowstt only applies when kernel=1.";
+    break;
+case 110:
+    mess="Not enough extra workspace for robustness calculation";
+    break;
+case 120:
+    mess="Zero-width neighborhood. Make span bigger";
+    break;
+case 121:
+    mess="All data on boundary of neighborhood. make span bigger";
+    break;
+case 122:
+    mess="Extrapolation not allowed with blending";
+    break;
+case 123:
+    mess="ihat=1 (diag L) in l2fit only makes sense if z=x (eval=data).";
+    break;
+case 171:
+    mess="lowesd must be called first.";
+    break;
+case 172:
+    mess="lowesf must not come between lowesb and lowese, lowesr, or lowesl.";
+    break;
+case 173:
+    mess="lowesb must come before lowese, lowesr, or lowesl.";
+    break;
+case 174:
+    mess="lowesb need not be called twice.";
+    break;
+case 175:
+    mess="Need setLf=.true. for lowesl.";
+    break;
+case 180:
+    mess="nv>nvmax in cpvert.";
+    break;
+case 181:
+    mess="nt>20 in eval.";
+    break;
+case 182:
+    mess="svddc failed in l2fit.";
+    break;
+case 183:
+    mess="Did not find edge in vleaf.";
+    break;
+case 184:
+    mess="Zero-width cell found in vleaf.";
+    break;
+case 185:
+    mess="Trouble descending to leaf in vleaf.";
+    break;
+case 186:
+    mess="Insufficient workspace for lowesf.";
+    break;
+case 187:
+    mess="Insufficient stack space.";
+    break;
+case 188:
+    mess="lv too small for computing explicit L.";
+    break;
+case 191:
+    mess="Computed trace L was negative; something is wrong!";
+    break;
+case 192:
+    mess="Computed delta was negative; something is wrong!";
+    break;
+case 193:
+    mess="Workspace in loread appears to be corrupted.";
+    break;
+case 194:
+    mess="Trouble in l2fit/l2tr";
+    break;
+case 195:
+    mess="Only constant, linear, or quadratic local models allowed";
+    break;
+case 196:
+    mess="degree must be at least 1 for vertex influence matrix";
+    break;
+case 999:
+    mess="not yet implemented";
+    break;
+default:
+    sprintf(mess=mess2,"Assert failed; error code %d\n",*i);
+    break;
     }
-    printf(mess);
-    return(i);
-//    Recover(mess,NULL_ENTRY);  /* in /usr/s/current/src/qpe/debug.c */
+//    printf(mess);
+    error_status = 1;
+    error_message = mess;
 }
 
 void
@@ -315,7 +392,9 @@
         strcat(mess,num);
     }
     strcat(mess,"\n");
-    Warning(mess,NULL_ENTRY);
+//    printf(mess);
+    error_status = 1;
+    error_message = mess;
 }
 
 void
@@ -329,5 +408,7 @@
         strcat(mess,num);
     }
     strcat(mess,"\n");
-    Warning(mess,NULL_ENTRY);
+//    printf(mess);
+    error_status = 1;
+    error_message = mess;
 }

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/loessf.f
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/loessf.f	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/loessf.f	2007-03-19 23:50:21 UTC (rev 2850)
@@ -39,6 +39,8 @@
     5 continue
       return
       end
+C----------------------------------------------------------------------C
+C     cpvert
       subroutine ehg125(p,nv,v,vhit,nvmax,d,k,t,r,s,f,l,u)
       logical i1,i2,match
       integer d,execnt,h,i,i3,j,k,m,mm,nv,nvmax,p,r,s
@@ -104,6 +106,8 @@
       end if
       return
       end
+C-----------------------------------------------------------------------
+C     descend
       integer function ehg138(i,z,a,xi,lo,hi,ncmax)
       logical i1
       integer d,execnt,i,j,nc,ncmax
@@ -131,6 +135,9 @@
     4 ehg138=j
       return
       end
+
+C----------------------------------------------------------------------C
+C     select q-th smallest by partial sorting
       subroutine ehg106(il,ir,k,nk,p,pi,n)
       integer execnt,i,ii,il,ir,j,k,l,n,nk,r
       integer pi(n)
@@ -198,6 +205,9 @@
 c     bottom of while loop
     4 return
       end
+
+C----------------------------------------------------------------------C
+C     l2fit,l2tr computational kernel
       subroutine ehg127(q,n,d,nf,f,x,psi,y,rw,kernel,k,dist,eta,b,od,w,r
      +cond,sing,sigma,u,e,dgamma,qraux,work,tol,dd,tdeg,cdeg,s)
       integer column,d,dd,execnt,i,i3,i9,info,inorm2,j,jj,jpvt,k,kernel,
@@ -384,6 +394,9 @@
    27 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     lowesb after workspace expansion
       subroutine ehg131(x,y,rw,trl,diagl,kernel,k,n,d,nc,ncmax,vc,nv,nvm
      +ax,nf,f,a,c,hi,lo,pi,psi,v,vhit,vval,xi,dist,eta,b,ntol,fd,w,vval2
      +,rcond,sing,dd,tdeg,cdeg,lq,lf,setlf)
@@ -437,6 +450,9 @@
      +g,cdeg,lq,lf,setlf,vval)
       return
       end
+
+C----------------------------------------------------------------------C
+C     lowese after workspace expansion
       subroutine ehg133(n,d,vc,nvmax,nc,ncmax,a,c,hi,lo,v,vval,xi,m,z,s)
       integer d,execnt,i,i1,m,nc,ncmax,nv,nvmax,vc
       integer a(ncmax),c(vc,ncmax),hi(ncmax),lo(ncmax)
@@ -464,6 +480,9 @@
       iw(i)=j
       return
       end
+
+C----------------------------------------------------------------------C
+C     delta1,2 from trL
       subroutine ehg141(trl,n,deg,k,d,nsing,dk,delta1,delta2)
       integer d,deg,dk,k,n,nsing
       external ehg176
@@ -514,6 +533,9 @@
       delta2=n-trl*dexp(c1*z**c2*(1-z)**c3*c4)
       return
       end
+
+C----------------------------------------------------------------------C
+C     exact delta
       subroutine lowesc(n,l,ll,trl,delta1,delta2)
       integer execnt,i,j,n
       double precision delta1,delta2,trl
@@ -554,6 +576,9 @@
    10 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     compute derived k-d tree information
       subroutine ehg169(d,vc,nc,ncmax,nv,nvmax,v,a,xi,c,hi,lo)
       integer d,execnt,i,j,k,mc,mv,nc,ncmax,nv,nvmax,p,vc
       integer a(ncmax),c(vc,ncmax),hi(ncmax),lo(ncmax),novhit(1)
@@ -606,6 +631,9 @@
       end if
       return
       end
+
+C----------------------------------------------------------------------C
+C     loeval for delta
        DOUBLE PRECISION function ehg176(z)
        DOUBLE PRECISION z(*)
        integer d,vc,nv,nc
@@ -707,6 +735,9 @@
        data vval(1,10) /-4.1032D-2/
        ehg176=ehg128(z,d,nc,vc,a,xi,lo,hi,c,v,nv,vval)
        end
+
+C----------------------------------------------------------------------C
+C     approximate delta
       subroutine lowesa(trl,n,d,tau,nsing,delta1,delta2)
       integer d,dka,dkb,execnt,n,nsing,tau
       double precision alpha,d1a,d1b,d2a,d2b,delta1,delta2,trl
@@ -721,6 +752,9 @@
       delta2=(1-alpha)*d2a+alpha*d2b
       return
       end
+
+C----------------------------------------------------------------------C
+C     lowesl after workspace expansion
       subroutine ehg191(m,z,l,d,n,nf,nv,ncmax,vc,a,xi,lo,hi,c,v,nvmax,vv
      +al2,lf,lq)
       integer lq1,d,execnt,i,i1,i2,j,m,n,nc,ncmax,nf,nv,nvmax,p,vc
@@ -764,6 +798,9 @@
     3 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     trL approximation
       subroutine ehg196(tau,d,f,trl)
       integer d,dka,dkb,execnt,tau
       double precision alpha,f,trl,trla,trlb
@@ -777,6 +814,9 @@
       trl=(1-alpha)*trla+alpha*trlb
       return
       end
+
+C----------------------------------------------------------------------C
+C     for deg 1,2
       subroutine ehg197(deg,tau,d,f,dk,trl)
       integer d,deg,dk,tau
       double precision trl, f
@@ -787,6 +827,9 @@
       trl = dk*(1+max(0.d0,(g1-f)/f))
       return
       end
+
+C----------------------------------------------------------------------C
+C     lowesr after workspace expansion
       subroutine ehg192(y,d,n,nf,nv,nvmax,vval,lf,lq)
       integer d,execnt,i,i1,i2,j,n,nf,nv,nvmax
       integer lq(nvmax,nf)
@@ -810,6 +853,10 @@
     5 continue
       return
       end
+
+
+C----------------------------------------------------------------------C
+C     eval
       DOUBLE PRECISION function ehg128(z,d,ncmax,vc,a,xi,lo,hi,c,v,nvmax
      +,vval)
       logical i10,i2,i3,i4,i5,i6,i7,i8,i9
@@ -1147,6 +1194,10 @@
       ehg128=s
       return
       end
+
+
+C----------------------------------------------------------------------C
+C
       integer function ifloor(x)
       DOUBLE PRECISION x
       ifloor=x
@@ -1271,6 +1322,9 @@
     4 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     l2tr
       subroutine ehg139(v,nvmax,nv,n,d,nf,f,x,pi,psi,y,rw,trl,kernel,k,d
      +ist,phi,eta,b,od,w,diagl,vval2,ncmax,vc,a,xi,lo,hi,c,vhit,rcond,si
      +ng,dd,tdeg,cdeg,lq,lf,setlf,s)
@@ -1434,6 +1488,9 @@
       end if
       return
       end
+
+
+C----------------------------------------------------------------------C
       subroutine dqrdc(x,ldx,n,p,qraux,jpvt,work,job)
       integer ldx,n,p,job
       integer jpvt(1)
@@ -1641,6 +1698,8 @@
   200 continue
       return
       end
+
+C---------------------------------------------------------------------C
       integer function idamax(n,dx,incx)
 c
 c     finds the index of element having max. absolute value.
@@ -1678,6 +1737,9 @@
    30 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     build kd tree
       subroutine lowesb(xx,yy,ww,diagl,infl,iv,liv,lv,wv)
       logical infl,setlf
       integer execnt
@@ -1722,6 +1784,9 @@
       end if
       return
       end
+
+C----------------------------------------------------------------------C
+C     setup workspace
       subroutine lowesd(versio,iv,liv,lv,v,d,n,f,ideg,nvmax,setlf)
       logical setlf
       integer bound,d,execnt,i,i1,i2,ideg,j,liv,lv,n,ncmax,nf,nvmax,vc,v
@@ -1822,6 +1887,9 @@
       v(4)=1.d0
       return
       end
+
+C----------------------------------------------------------------------C
+C     evaluate smooth at z
       subroutine lowese(iv,liv,lv,wv,m,z,s)
       integer execnt,m
       integer iv(*)
@@ -1840,6 +1908,9 @@
      +8)),iv(iv(9)),iv(iv(10)),wv(iv(11)),wv(iv(13)),wv(iv(12)),m,z,s)
       return
       end
+
+C----------------------------------------------------------------------C
+C     slow smooth at z
       subroutine lowesf(xx,yy,ww,iv,liv,lv,wv,m,z,l,ihat,s)
       logical i1
       integer execnt,ihat,m,n
@@ -1866,6 +1937,9 @@
      +(4),iv(30),iv(33),iv(32),iv(41),s)
       return
       end
+
+C----------------------------------------------------------------------C
+C     explicit hat matrix mapping y to z
       subroutine lowesl(iv,liv,lv,wv,m,z,l)
       integer execnt,m,n
       integer iv(*)
@@ -1888,6 +1962,9 @@
      +24)),wv(iv(34)),iv(iv(25)))
       return
       end
+
+C----------------------------------------------------------------------C
+C     rebuild with new data values (does not change y)
       subroutine lowesr(yy,iv,liv,lv,wv)
       integer execnt
       integer iv(*)
@@ -1906,6 +1983,9 @@
      +)),iv(iv(25)))
       return
       end
+
+C----------------------------------------------------------------------C
+C     robustness weights
       subroutine lowesw(res,n,rw,pi)
       integer identi,execnt,i,i1,n,nh
       integer pi(n)
@@ -1957,6 +2037,9 @@
       end if
       return
       end
+
+C----------------------------------------------------------------------C
+C     pseudovalues
       subroutine lowesp(n,y,yhat,pwgts,rwgts,pi,ytilde)
       integer identi,execnt,i2,i3,i5,m,n
       integer pi(n)
@@ -2009,6 +2092,9 @@
     8 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     rbuild
       subroutine ehg124(ll,uu,d,n,nv,nc,ncmax,vc,x,pi,a,xi,lo,hi,c,v,vhi
      +t,nvmax,fc,fd,dd)
       logical i1,i2,i3,leaf
@@ -2117,6 +2203,9 @@
 c     bottom of while loop
     4 return
       end
+
+C----------------------------------------------------------------------C
+C     spread
       subroutine ehg129(l,u,d,x,pi,n,sigma)
       integer d,execnt,i,k,l,n,u
       integer pi(n)
@@ -2143,6 +2232,9 @@
     3 continue
       return
       end
+
+C----------------------------------------------------------------------C
+C     vleaf
       subroutine ehg137(z,kappa,leaf,nleaf,d,nv,nvmax,ncmax,vc,a,xi,lo,h
      +i,c,v)
       integer d,execnt,nc,ncmax,nleaf,p,stackt

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/misc.c
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/misc.c	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/misc.c	2007-03-19 23:50:21 UTC (rev 2850)
@@ -65,7 +65,7 @@
 
 double pf(double q, double df1, double df2)
 {
-    double    ibeta();
+    double ibeta();
     return(ibeta(q*df1/(df2+q*df1), df1/2, df2/2));
 }
 

Modified: trunk/Lib/sandbox/pyloess/sandbox/src/predict.c
===================================================================
--- trunk/Lib/sandbox/pyloess/sandbox/src/predict.c	2007-03-16 20:42:51 UTC (rev 2849)
+++ trunk/Lib/sandbox/pyloess/sandbox/src/predict.c	2007-03-19 23:50:21 UTC (rev 2850)
@@ -3,23 +3,34 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+
+extern char *error_message;
+extern int error_status;
+
 void
 predict(double *eval, int m, loess *lo, prediction *pre, int se)
 {
-    int    size_info[3];
-    void    pred_();
+    int  size_info[3];
+    void pred_();
 
     pre->fit = (double *) malloc(m * sizeof(double));
     pre->se_fit = (double *) malloc(m * sizeof(double));
     pre->residual_scale = lo->outputs.s;
     pre->df = (lo->outputs.one_delta * lo->outputs.one_delta) /
-lo->outputs.two_delta;
+              lo->outputs.two_delta;
 
     size_info[0] = lo->inputs.p;
     size_info[1] = lo->inputs.n;
     size_info[2] = m;
+    
+    error_status = 0;
+    lo->status.err_status = 0;
+    lo->status.err_msg = NULL;
 
-    pred_(lo->inputs.y, lo->inputs.x, eval, size_info, &lo->outputs.s,
+    pred_(lo->inputs.y,
+          lo->inputs.x, eval,
+          size_info,
+          &lo->outputs.s,
           lo->inputs.weights,
           lo->outputs.robust,
           &lo->model.span,
@@ -39,6 +50,11 @@
           &se,
           pre->fit,
           pre->se_fit);
+
+    if(error_status){
+        lo->status.err_status = error_status;
+        lo->status.err_msg = error_message;
+    }
 }
 
 void
@@ -52,7 +68,7 @@
     double  *x, *x_tmp, *x_evaluate, *L, new_cell, z, tmp, *fit_tmp,
             *temp, sum, mean;
     int    N, D, M, sum_drop_sqr = 0, sum_parametric = 0,
-	        nonparametric = 0, *order_parametric, *order_drop_sqr;
+            nonparametric = 0, *order_parametric, *order_drop_sqr;
     int     i, j, k, p, cut, comp();
 
     D = size_info[0];
@@ -83,85 +99,85 @@
                 p = k + j;
                 x_tmp[p] = x_[p] / divisor[i];
             }
-		}
-	}
-	j = D - 1;
-	for(i = 0; i < D; i++) {
+        }
+    }
+    j = D - 1;
+    for(i = 0; i < D; i++) {
         sum_drop_sqr = sum_drop_sqr + drop_square[i];
         sum_parametric = sum_parametric + parametric[i];
         if(parametric[i])
             order_parametric[j--] = i;
-		else
+        else
             order_parametric[nonparametric++] = i;
-	}
+    }
     for(i = 0; i < D; i++) {
         order_drop_sqr[i] = 2 - drop_square[order_parametric[i]];
-		k = i * M;
-		p = order_parametric[i] * M;
+        k = i * M;
+        p = order_parametric[i] * M;
         for(j = 0; j < M; j++)
-			x_evaluate[k + j] = new_x[p + j];
-		k = i * N;
-		p = order_parametric[i] * N;
+            x_evaluate[k + j] = new_x[p + j];
+        k = i * N;
+        p = order_parametric[i] * N;
         for(j = 0; j < N; j++)
             x[k + j] = x_tmp[p + j];
     }
-	for(i = 0; i < N; i++)
-		robust[i] = weights[i] * robust[i];
+    for(i = 0; i < N; i++)
+        robust[i] = weights[i] * robust[i];
 
-	if(!strcmp(*surface, "direct")) {
-	    if(*se) {
-	        loess_dfitse(y, x, x_evaluate, weights, robust,
+    if(!strcmp(*surface, "direct")) {
+        if(*se) {
+            loess_dfitse(y, x, x_evaluate, weights, robust,
                          !strcmp(*family, "gaussian"), span, degree,
                          &nonparametric, order_drop_sqr, &sum_drop_sqr,
                          &D, &N, &M, fit, L);
         }
-	    else {
-		    loess_dfit(y, x, x_evaluate, robust, span, degree,
+        else {
+            loess_dfit(y, x, x_evaluate, robust, span, degree,
                        &nonparametric, order_drop_sqr, &sum_drop_sqr,
-		               &D, &N, &M, fit);
+                       &D, &N, &M, fit);
         }
     }
-	else {
-	    loess_ifit(parameter, a, xi, vert, vval, &M, x_evaluate, fit);
-	    if(*se) {
+    else {
+        loess_ifit(parameter, a, xi, vert, vval, &M, x_evaluate, fit);
+        if(*se) {
             new_cell = (*span) * (*cell);
             fit_tmp = (double *) malloc(M * sizeof(double));
-	        loess_ise(y, x, x_evaluate, weights, span, degree,
-			&nonparametric, order_drop_sqr, &sum_drop_sqr,
-			&new_cell, &D, &N, &M, fit_tmp, L);
-			free(fit_tmp);
+            loess_ise(y, x, x_evaluate, weights, span, degree,
+                      &nonparametric, order_drop_sqr, &sum_drop_sqr,
+                      &new_cell, &D, &N, &M, fit_tmp, L);
+            free(fit_tmp);
         }
     }
-	if(*se) {
-	    for(i = 0; i < N; i++) {
-	        k = i * M;
-	        for(j = 0; j < M; j++) {
-		        p = k + j;
-		        L[p] = L[p] / weights[i];
-		        L[p] = L[p] * L[p];
+    if(*se) {
+        for(i = 0; i < N; i++) {
+            k = i * M;
+            for(j = 0; j < M; j++) {
+                p = k + j;
+                L[p] = L[p] / weights[i];
+                L[p] = L[p] * L[p];
             }
-		}
-		for(i = 0; i < M; i++) {
-		    tmp = 0;
-			for(j = 0; j < N; j++)
-		        tmp = tmp + L[i + j * M];
-			se_fit[i] = (*s) * sqrt(tmp);
-		}
-	}
-	free(x);
-	free(x_tmp);
-	free(x_evaluate);
-	free(L);
-	free(order_parametric);
-	free(order_drop_sqr);
-	free(temp);
+        }
+        for(i = 0; i < M; i++) {
+            tmp = 0;
+            for(j = 0; j < N; j++)
+                tmp = tmp + L[i + j * M];
+            se_fit[i] = (*s) * sqrt(tmp);
+        }
+    }
+    free(x);
+    free(x_tmp);
+    free(x_evaluate);
+    free(L);
+    free(order_parametric);
+    free(order_drop_sqr);
+    free(temp);
 }
 
 void
 pred_free_mem(prediction *pre)
 {
-	free(pre->fit);
-	free(pre->se_fit);
+    free(pre->fit);
+    free(pre->se_fit);
 }
 
 



More information about the Scipy-svn mailing list