diff --git a/scikits/learn/glm/enet_cd.py b/scikits/learn/glm/enet_cd.py
index 68280335c97ce9d6b1e137a34bde44d5c2c9e352..ef6ecafee725607714fb591566c71e7ddc98fea8 100644
--- a/scikits/learn/glm/enet_cd.py
+++ b/scikits/learn/glm/enet_cd.py
@@ -29,14 +29,17 @@ def enet_coordinate_descent(model, X, y, maxit):
     for n_iter in range(maxit):
         for ii in xrange(n_features): # Loop over coordinates
             w_ii = w[ii] # Store previous value
-            R[:n_samples] += w_ii * X[:, ii]
-            R[n_samples + ii] += w_ii * sqrt(beta)
+            if w_ii != 0.0:
+                R[:n_samples] += w_ii * X[:, ii]
+                R[n_samples + ii] += w_ii * sqrt(beta)
             tmp = (X[:, ii] * R[:n_samples]).sum()
             tmp += sqrt(beta) * R[n_samples + ii]
             w[ii] = np.sign(tmp) * np.maximum(abs(tmp) - alpha, 0) \
                     / (norm_cols_X[ii] + beta)
-            R[:n_samples] -= w[ii] * X[:, ii] # Update residual
-            R[n_samples + ii] -= w[ii] * sqrt(beta)
+
+            if w[ii] != 0.0:
+                R[:n_samples] -= w[ii] * X[:, ii] # Update residual
+                R[n_samples + ii] -= w[ii] * sqrt(beta)
 
         for callback in callbacks:
             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, beta=beta, R=R):
diff --git a/scikits/learn/glm/lasso_cd.py b/scikits/learn/glm/lasso_cd.py
index 12a1484ac51d2d17c97ce30d8c1df46fb8bff2a1..704edfdb9190dd5eae8434278da90b585d0f5661 100644
--- a/scikits/learn/glm/lasso_cd.py
+++ b/scikits/learn/glm/lasso_cd.py
@@ -24,11 +24,13 @@ def lasso_coordinate_descent(model, X, y, maxit):
     for n_iter in range(maxit):
         for ii in xrange(n_features): # Loop over coordinates
             w_ii = w[ii] # Store previous value
-            R += w_ii * X[:, ii]
+            if w_ii != 0.0:
+                R += w_ii * X[:, ii]
             tmp = (X[:, ii] * R).sum()
             w[ii] = np.sign(tmp) * np.maximum(abs(tmp) - alpha, 0) \
                     / norm_cols_X[ii]
-            R -= w[ii] * X[:, ii] # Update residual
+            if w[ii] != 0.0:
+                R -= w[ii] * X[:, ii] # Update residual
 
         for callback in callbacks:
             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, R=R):
diff --git a/scikits/learn/glm/src/enet_cd_fast.c b/scikits/learn/glm/src/enet_cd_fast.c
index 97b0889a778c4fcc309831355aaf38d707eee260..f4362599260f50e0fa5c8b261c1dac2a8d69624f 100644
--- a/scikits/learn/glm/src/enet_cd_fast.c
+++ b/scikits/learn/glm/src/enet_cd_fast.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.11.2 on Mon Mar 15 12:34:39 2010 */
+/* Generated by Cython 0.11.2 on Wed Mar 17 11:28:04 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -131,7 +131,7 @@
 #define __PYX_EXTERN_C extern
 #endif
 #include <math.h>
-#define __PYX_HAVE_API__scikits__learn__linreg__enet_cd_fast
+#define __PYX_HAVE_API__enet_cd_fast
 #include "stdlib.h"
 #include "numpy/arrayobject.h"
 #include "math.h"
@@ -693,7 +693,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-typedef __pyx_t_5numpy_float64_t __pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE;
+typedef __pyx_t_5numpy_float64_t __pyx_t_12enet_cd_fast_DOUBLE;
 /* Module declarations from python_buffer */
 
 /* Module declarations from stdlib */
@@ -707,14 +707,14 @@ static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
 static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
 /* Module declarations from cython */
 
-/* Module declarations from scikits.learn.linreg.enet_cd_fast */
+/* Module declarations from enet_cd_fast */
 
-static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double); /*proto*/
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE = { "scikits.learn.linreg.enet_cd_fast.DOUBLE", NULL, sizeof(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE), 'R' };
-#define __Pyx_MODULE_NAME "scikits.learn.linreg.enet_cd_fast"
-int __pyx_module_is_main_scikits__learn__linreg__enet_cd_fast = 0;
+static INLINE double __pyx_f_12enet_cd_fast_fsign(double); /*proto*/
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE = { "enet_cd_fast.DOUBLE", NULL, sizeof(__pyx_t_12enet_cd_fast_DOUBLE), 'R' };
+#define __Pyx_MODULE_NAME "enet_cd_fast"
+int __pyx_module_is_main_enet_cd_fast = 0;
 
-/* Implementation of scikits.learn.linreg.enet_cd_fast */
+/* Implementation of enet_cd_fast */
 static PyObject *__pyx_int_2;
 static PyObject *__pyx_int_0;
 static char __pyx_k___main__[] = "__main__";
@@ -817,7 +817,7 @@ static char __pyx_k_28[] = "Non-native byte order not supported";
 static char __pyx_k_29[] = "Format string allocated too short.";
 static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
 
-/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":18
+/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":18
  *     double rand()
  * 
  * cdef inline double fsign(double f):             # <<<<<<<<<<<<<<
@@ -825,12 +825,12 @@ static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
  *         return 0
  */
 
-static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double __pyx_v_f) {
+static INLINE double __pyx_f_12enet_cd_fast_fsign(double __pyx_v_f) {
   double __pyx_r;
   int __pyx_t_1;
   __Pyx_SetupRefcountContext("fsign");
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":19
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":19
  * 
  * cdef inline double fsign(double f):
  *     if f == 0:             # <<<<<<<<<<<<<<
@@ -840,7 +840,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
   __pyx_t_1 = (__pyx_v_f == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":20
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":20
  * cdef inline double fsign(double f):
  *     if f == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -852,7 +852,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
     goto __pyx_L3;
   }
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":21
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":21
  *     if f == 0:
  *         return 0
  *     elif f > 0:             # <<<<<<<<<<<<<<
@@ -862,7 +862,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
   __pyx_t_1 = (__pyx_v_f > 0);
   if (__pyx_t_1) {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":22
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":22
  *         return 0
  *     elif f > 0:
  *         return 1.0             # <<<<<<<<<<<<<<
@@ -875,7 +875,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
   }
   /*else*/ {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":24
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":24
  *         return 1.0
  *     else:
  *         return -1.0             # <<<<<<<<<<<<<<
@@ -893,7 +893,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
   return __pyx_r;
 }
 
-/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":30
+/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":30
  * @cython.boundscheck(False)
  * @cython.wraparound(False)
  * def enet_coordinate_descent(model,             # <<<<<<<<<<<<<<
@@ -901,9 +901,9 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(double
  *                             np.ndarray[DOUBLE, ndim=1] y,
  */
 
-static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate_descent[] = "Cython version of the coordinate descent algorithm\n        for Elastic-Net regression\n    ";
-static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pf_12enet_cd_fast_enet_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_12enet_cd_fast_enet_coordinate_descent[] = "Cython version of the coordinate descent algorithm\n        for Elastic-Net regression\n    ";
+static PyObject *__pyx_pf_12enet_cd_fast_enet_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_model = 0;
   PyArrayObject *__pyx_v_X = 0;
   PyArrayObject *__pyx_v_y = 0;
@@ -954,7 +954,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   unsigned int __pyx_t_9;
   unsigned int __pyx_t_10;
   unsigned int __pyx_t_11;
-  unsigned int __pyx_t_12;
+  int __pyx_t_12;
   unsigned int __pyx_t_13;
   unsigned int __pyx_t_14;
   unsigned int __pyx_t_15;
@@ -969,8 +969,9 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   unsigned int __pyx_t_24;
   unsigned int __pyx_t_25;
   unsigned int __pyx_t_26;
-  int __pyx_t_27;
-  int __pyx_t_28;
+  unsigned int __pyx_t_27;
+  unsigned int __pyx_t_28;
+  int __pyx_t_29;
   static PyObject **__pyx_pyargnames[] = {&__pyx_kp_model,&__pyx_kp_X,&__pyx_kp_y,&__pyx_kp_maxit,0};
   __Pyx_SetupRefcountContext("enet_coordinate_descent");
   __pyx_self = __pyx_self;
@@ -1028,7 +1029,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("enet_coordinate_descent", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("scikits.learn.linreg.enet_cd_fast.enet_coordinate_descent");
+  __Pyx_AddTraceback("enet_cd_fast.enet_coordinate_descent");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_v_callbacks = Py_None; __Pyx_INCREF(Py_None);
@@ -1043,18 +1044,18 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_X = __pyx_bstruct_X.strides[0]; __pyx_bstride_1_X = __pyx_bstruct_X.strides[1];
   __pyx_bshape_0_X = __pyx_bstruct_X.shape[0]; __pyx_bshape_1_X = __pyx_bstruct_X.shape[1];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_y = __pyx_bstruct_y.strides[0];
   __pyx_bshape_0_y = __pyx_bstruct_y.shape[0];
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":39
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":39
  * 
  *     # get the data information into easy vars
  *     cdef float alpha = model.alpha             # <<<<<<<<<<<<<<
@@ -1067,7 +1068,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_alpha = __pyx_t_2;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":40
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":40
  *     # get the data information into easy vars
  *     cdef float alpha = model.alpha
  *     cdef float beta = model.beta             # <<<<<<<<<<<<<<
@@ -1080,7 +1081,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_beta = __pyx_t_2;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":41
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":41
  *     cdef float alpha = model.alpha
  *     cdef float beta = model.beta
  *     cdef np.ndarray[DOUBLE, ndim=1] w = model.w             # <<<<<<<<<<<<<<
@@ -1093,7 +1094,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_t_3 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_3, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_3, &__Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_w = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_w.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
@@ -1104,7 +1105,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":42
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":42
  *     cdef float beta = model.beta
  *     cdef np.ndarray[DOUBLE, ndim=1] w = model.w
  *     callbacks = model.callbacks             # <<<<<<<<<<<<<<
@@ -1117,7 +1118,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_v_callbacks = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":44
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":44
  *     callbacks = model.callbacks
  * 
  *     cdef unsigned int nsamples = X.shape[0]             # <<<<<<<<<<<<<<
@@ -1126,7 +1127,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
  */
   __pyx_v_nsamples = (__pyx_v_X->dimensions[0]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":45
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":45
  * 
  *     cdef unsigned int nsamples = X.shape[0]
  *     cdef unsigned int nfeatures = X.shape[1]             # <<<<<<<<<<<<<<
@@ -1135,7 +1136,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
  */
   __pyx_v_nfeatures = (__pyx_v_X->dimensions[1]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":46
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":46
  *     cdef unsigned int nsamples = X.shape[0]
  *     cdef unsigned int nfeatures = X.shape[1]
  *     cdef unsigned int nclasses = w.shape[1]             # <<<<<<<<<<<<<<
@@ -1144,7 +1145,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
  */
   __pyx_v_nclasses = (__pyx_v_w->dimensions[1]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":49
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":49
  * 
  *     # compute norms of the columns of X
  *     cdef np.ndarray[DOUBLE, ndim=1] norm_cols_X = (X**2).sum(axis=0)             # <<<<<<<<<<<<<<
@@ -1167,7 +1168,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_norm_cols_X, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_norm_cols_X, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_norm_cols_X = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_norm_cols_X.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_norm_cols_X = __pyx_bstruct_norm_cols_X.strides[0];
@@ -1178,7 +1179,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_v_norm_cols_X = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":52
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":52
  * 
  *     # initial value of the residuals
  *     cdef np.ndarray[DOUBLE, ndim=1] R = np.empty(nfeatures + nsamples)             # <<<<<<<<<<<<<<
@@ -1205,7 +1206,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_R, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_R, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_12enet_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_R = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_R.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_R = __pyx_bstruct_R.strides[0];
@@ -1216,7 +1217,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_v_R = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":53
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":53
  *     # initial value of the residuals
  *     cdef np.ndarray[DOUBLE, ndim=1] R = np.empty(nfeatures + nsamples)
  *     R[:nsamples] = y - np.dot(X, w)             # <<<<<<<<<<<<<<
@@ -1246,7 +1247,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   if (PySequence_SetSlice(((PyObject *)__pyx_v_R), 0, __pyx_v_nsamples, __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":54
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":54
  *     cdef np.ndarray[DOUBLE, ndim=1] R = np.empty(nfeatures + nsamples)
  *     R[:nsamples] = y - np.dot(X, w)
  *     R[nsamples:] = - sqrt(beta) * w             # <<<<<<<<<<<<<<
@@ -1261,7 +1262,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   if (PySequence_SetSlice(((PyObject *)__pyx_v_R), __pyx_v_nsamples, PY_SSIZE_T_MAX, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":62
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":62
  *     cdef unsigned int n_iter
  * 
  *     for callback in callbacks:             # <<<<<<<<<<<<<<
@@ -1293,7 +1294,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
     __pyx_v_callback = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":63
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":63
  * 
  *     for callback in callbacks:
  *         callback(0) # Init callback             # <<<<<<<<<<<<<<
@@ -1312,7 +1313,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":65
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":65
  *         callback(0) # Init callback
  * 
  *     goon = True             # <<<<<<<<<<<<<<
@@ -1325,7 +1326,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   __pyx_v_goon = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":66
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":66
  * 
  *     goon = True
  *     for n_iter in range(maxit):             # <<<<<<<<<<<<<<
@@ -1335,7 +1336,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
   for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_maxit; __pyx_t_9+=1) {
     __pyx_v_n_iter = __pyx_t_9;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":67
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":67
  *     goon = True
  *     for n_iter in range(maxit):
  *         for ii in xrange(nfeatures): # Loop over coordinates             # <<<<<<<<<<<<<<
@@ -1345,50 +1346,63 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
     for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_v_nfeatures; __pyx_t_10+=1) {
       __pyx_v_ii = __pyx_t_10;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":68
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":68
  *     for n_iter in range(maxit):
  *         for ii in xrange(nfeatures): # Loop over coordinates
  *             w_ii = w[ii] # Store previous value             # <<<<<<<<<<<<<<
  * 
- *             # R += w_ii * X[:,ii]
+ *             if w_ii != 0.0:
  */
       __pyx_t_11 = __pyx_v_ii;
-      __pyx_v_w_ii = (*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_11, __pyx_bstride_0_w));
+      __pyx_v_w_ii = (*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_11, __pyx_bstride_0_w));
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":71
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":70
+ *             w_ii = w[ii] # Store previous value
  * 
- *             # R += w_ii * X[:,ii]
- *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
- *                 R[jj] += w_ii * X[jj,ii]
- *             R[nsamples+ii] += w_ii * sqrt(beta)
- */
-      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_v_nsamples; __pyx_t_12+=1) {
-        __pyx_v_jj = __pyx_t_12;
-
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":72
- *             # R += w_ii * X[:,ii]
- *             for jj in range(nsamples):
- *                 R[jj] += w_ii * X[jj,ii]             # <<<<<<<<<<<<<<
- *             R[nsamples+ii] += w_ii * sqrt(beta)
+ *             if w_ii != 0.0:             # <<<<<<<<<<<<<<
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):
+ */
+      __pyx_t_12 = (__pyx_v_w_ii != 0.0);
+      if (__pyx_t_12) {
+
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":72
+ *             if w_ii != 0.0:
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):             # <<<<<<<<<<<<<<
+ *                     R[jj] += w_ii * X[jj,ii]
+ *                 R[nsamples+ii] += w_ii * sqrt(beta)
+ */
+        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_v_nsamples; __pyx_t_13+=1) {
+          __pyx_v_jj = __pyx_t_13;
+
+          /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":73
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):
+ *                     R[jj] += w_ii * X[jj,ii]             # <<<<<<<<<<<<<<
+ *                 R[nsamples+ii] += w_ii * sqrt(beta)
  * 
  */
-        __pyx_t_13 = __pyx_v_jj;
-        __pyx_t_14 = __pyx_v_ii;
-        __pyx_t_15 = __pyx_v_jj;
-        *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_15, __pyx_bstride_0_R) += (__pyx_v_w_ii * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_13, __pyx_bstride_0_X, __pyx_t_14, __pyx_bstride_1_X)));
-      }
+          __pyx_t_14 = __pyx_v_jj;
+          __pyx_t_15 = __pyx_v_ii;
+          __pyx_t_16 = __pyx_v_jj;
+          *__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_16, __pyx_bstride_0_R) += (__pyx_v_w_ii * (*__Pyx_BufPtrStrided2d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_14, __pyx_bstride_0_X, __pyx_t_15, __pyx_bstride_1_X)));
+        }
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":73
- *             for jj in range(nsamples):
- *                 R[jj] += w_ii * X[jj,ii]
- *             R[nsamples+ii] += w_ii * sqrt(beta)             # <<<<<<<<<<<<<<
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":74
+ *                 for jj in range(nsamples):
+ *                     R[jj] += w_ii * X[jj,ii]
+ *                 R[nsamples+ii] += w_ii * sqrt(beta)             # <<<<<<<<<<<<<<
  * 
  *             # tmp = (X[:,ii]*R).sum()
  */
-      __pyx_t_12 = (__pyx_v_nsamples + __pyx_v_ii);
-      *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_12, __pyx_bstride_0_R) += (__pyx_v_w_ii * sqrt(__pyx_v_beta));
+        __pyx_t_13 = (__pyx_v_nsamples + __pyx_v_ii);
+        *__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_13, __pyx_bstride_0_R) += (__pyx_v_w_ii * sqrt(__pyx_v_beta));
+        goto __pyx_L12;
+      }
+      __pyx_L12:;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":76
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":77
  * 
  *             # tmp = (X[:,ii]*R).sum()
  *             tmp = 0.0             # <<<<<<<<<<<<<<
@@ -1397,86 +1411,100 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
  */
       __pyx_v_tmp = 0.0;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":77
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":78
  *             # tmp = (X[:,ii]*R).sum()
  *             tmp = 0.0
  *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
  *                 tmp += R[jj] * X[jj,ii]
  * 
  */
-      for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_v_nsamples; __pyx_t_16+=1) {
-        __pyx_v_jj = __pyx_t_16;
+      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_v_nsamples; __pyx_t_17+=1) {
+        __pyx_v_jj = __pyx_t_17;
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":78
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":79
  *             tmp = 0.0
  *             for jj in range(nsamples):
  *                 tmp += R[jj] * X[jj,ii]             # <<<<<<<<<<<<<<
  * 
  *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) \
  */
-        __pyx_t_17 = __pyx_v_jj;
         __pyx_t_18 = __pyx_v_jj;
-        __pyx_t_19 = __pyx_v_ii;
-        __pyx_v_tmp += ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_17, __pyx_bstride_0_R)) * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_18, __pyx_bstride_0_X, __pyx_t_19, __pyx_bstride_1_X)));
+        __pyx_t_19 = __pyx_v_jj;
+        __pyx_t_20 = __pyx_v_ii;
+        __pyx_v_tmp += ((*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_18, __pyx_bstride_0_R)) * (*__Pyx_BufPtrStrided2d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_19, __pyx_bstride_0_X, __pyx_t_20, __pyx_bstride_1_X)));
       }
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":81
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":82
  * 
  *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) \
  *                     / (norm_cols_X[ii] + beta)             # <<<<<<<<<<<<<<
  * 
- *             # R -=  w[ii] * X[:,ii] # Update residual
+ *             if w[ii] != 0.0:
  */
-      __pyx_t_16 = __pyx_v_ii;
+      __pyx_t_17 = __pyx_v_ii;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":80
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":81
  *                 tmp += R[jj] * X[jj,ii]
  * 
  *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) \             # <<<<<<<<<<<<<<
  *                     / (norm_cols_X[ii] + beta)
  * 
  */
-      __pyx_t_20 = __pyx_v_ii;
-      *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_20, __pyx_bstride_0_w) = ((__pyx_f_7scikits_5learn_6linreg_12enet_cd_fast_fsign(__pyx_v_tmp) * fmax((fabs(__pyx_v_tmp) - __pyx_v_alpha), 0)) / ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_norm_cols_X.buf, __pyx_t_16, __pyx_bstride_0_norm_cols_X)) + __pyx_v_beta));
+      __pyx_t_21 = __pyx_v_ii;
+      *__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_21, __pyx_bstride_0_w) = ((__pyx_f_12enet_cd_fast_fsign(__pyx_v_tmp) * fmax((fabs(__pyx_v_tmp) - __pyx_v_alpha), 0)) / ((*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_norm_cols_X.buf, __pyx_t_17, __pyx_bstride_0_norm_cols_X)) + __pyx_v_beta));
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":84
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":84
+ *                     / (norm_cols_X[ii] + beta)
  * 
- *             # R -=  w[ii] * X[:,ii] # Update residual
- *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
- *                 R[jj] -=  w[ii] * X[jj,ii] # Update residual
- *             R[nsamples+ii] -= w[ii] * sqrt(beta)
- */
-      for (__pyx_t_21 = 0; __pyx_t_21 < __pyx_v_nsamples; __pyx_t_21+=1) {
-        __pyx_v_jj = __pyx_t_21;
-
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":85
- *             # R -=  w[ii] * X[:,ii] # Update residual
- *             for jj in range(nsamples):
- *                 R[jj] -=  w[ii] * X[jj,ii] # Update residual             # <<<<<<<<<<<<<<
- *             R[nsamples+ii] -= w[ii] * sqrt(beta)
+ *             if w[ii] != 0.0:             # <<<<<<<<<<<<<<
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):
+ */
+      __pyx_t_22 = __pyx_v_ii;
+      __pyx_t_12 = ((*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_22, __pyx_bstride_0_w)) != 0.0);
+      if (__pyx_t_12) {
+
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":86
+ *             if w[ii] != 0.0:
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):             # <<<<<<<<<<<<<<
+ *                     R[jj] -=  w[ii] * X[jj,ii] # Update residual
+ *                 R[nsamples+ii] -= w[ii] * sqrt(beta)
+ */
+        for (__pyx_t_23 = 0; __pyx_t_23 < __pyx_v_nsamples; __pyx_t_23+=1) {
+          __pyx_v_jj = __pyx_t_23;
+
+          /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":87
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):
+ *                     R[jj] -=  w[ii] * X[jj,ii] # Update residual             # <<<<<<<<<<<<<<
+ *                 R[nsamples+ii] -= w[ii] * sqrt(beta)
  * 
  */
-        __pyx_t_22 = __pyx_v_ii;
-        __pyx_t_23 = __pyx_v_jj;
-        __pyx_t_24 = __pyx_v_ii;
-        __pyx_t_25 = __pyx_v_jj;
-        *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_25, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_22, __pyx_bstride_0_w)) * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_23, __pyx_bstride_0_X, __pyx_t_24, __pyx_bstride_1_X)));
-      }
+          __pyx_t_24 = __pyx_v_ii;
+          __pyx_t_25 = __pyx_v_jj;
+          __pyx_t_26 = __pyx_v_ii;
+          __pyx_t_27 = __pyx_v_jj;
+          *__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_27, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_24, __pyx_bstride_0_w)) * (*__Pyx_BufPtrStrided2d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_25, __pyx_bstride_0_X, __pyx_t_26, __pyx_bstride_1_X)));
+        }
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":86
- *             for jj in range(nsamples):
- *                 R[jj] -=  w[ii] * X[jj,ii] # Update residual
- *             R[nsamples+ii] -= w[ii] * sqrt(beta)             # <<<<<<<<<<<<<<
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":88
+ *                 for jj in range(nsamples):
+ *                     R[jj] -=  w[ii] * X[jj,ii] # Update residual
+ *                 R[nsamples+ii] -= w[ii] * sqrt(beta)             # <<<<<<<<<<<<<<
  * 
  *         for callback in callbacks:
  */
-      __pyx_t_21 = __pyx_v_ii;
-      __pyx_t_26 = (__pyx_v_nsamples + __pyx_v_ii);
-      *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_26, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_21, __pyx_bstride_0_w)) * sqrt(__pyx_v_beta));
+        __pyx_t_23 = __pyx_v_ii;
+        __pyx_t_28 = (__pyx_v_nsamples + __pyx_v_ii);
+        *__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_28, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_12enet_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_23, __pyx_bstride_0_w)) * sqrt(__pyx_v_beta));
+        goto __pyx_L17;
+      }
+      __pyx_L17:;
     }
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":88
- *             R[nsamples+ii] -= w[ii] * sqrt(beta)
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":90
+ *                 R[nsamples+ii] -= w[ii] * sqrt(beta)
  * 
  *         for callback in callbacks:             # <<<<<<<<<<<<<<
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, beta=beta, R=R):
@@ -1485,7 +1513,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
     if (PyList_CheckExact(__pyx_v_callbacks) || PyTuple_CheckExact(__pyx_v_callbacks)) {
       __pyx_t_8 = 0; __pyx_t_1 = __pyx_v_callbacks; __Pyx_INCREF(__pyx_t_1);
     } else {
-      __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_callbacks); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_callbacks); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
     }
     for (;;) {
@@ -1498,7 +1526,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
       } else {
         __pyx_t_4 = PyIter_Next(__pyx_t_1);
         if (!__pyx_t_4) {
-          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           break;
         }
         __Pyx_GOTREF(__pyx_t_4);
@@ -1507,76 +1535,76 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
       __pyx_v_callback = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":89
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":91
  * 
  *         for callback in callbacks:
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, beta=beta, R=R):             # <<<<<<<<<<<<<<
  *                 goon *= False
  * 
  */
-      __pyx_t_4 = PyLong_FromUnsignedLong(__pyx_v_n_iter); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyLong_FromUnsignedLong(__pyx_v_n_iter); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_4 = 0;
-      __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_1));
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_X, ((PyObject *)__pyx_v_X)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_y, ((PyObject *)__pyx_v_y)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_w, ((PyObject *)__pyx_v_w)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_alpha); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_X, ((PyObject *)__pyx_v_X)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_y, ((PyObject *)__pyx_v_y)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_w, ((PyObject *)__pyx_v_w)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_alpha); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_alpha, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_alpha, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_beta); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_beta); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_beta, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_beta, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_R, ((PyObject *)__pyx_v_R)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_v_callback, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_R, ((PyObject *)__pyx_v_R)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_v_callback, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
-      __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_27 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_28 = (!__pyx_t_27);
-      if (__pyx_t_28) {
+      __pyx_t_29 = (!__pyx_t_12);
+      if (__pyx_t_29) {
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":90
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":92
  *         for callback in callbacks:
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, beta=beta, R=R):
  *                 goon *= False             # <<<<<<<<<<<<<<
  * 
  *         if not goon:
  */
-        __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __pyx_1 = PyNumber_InPlaceMultiply(__pyx_v_goon, __pyx_t_4); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_1 = PyNumber_InPlaceMultiply(__pyx_v_goon, __pyx_t_4); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_1);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_DECREF(__pyx_v_goon);
         __pyx_v_goon = __pyx_1;
         __pyx_1 = 0;
-        goto __pyx_L20;
+        goto __pyx_L22;
       }
-      __pyx_L20:;
+      __pyx_L22:;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":92
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":94
  *                 goon *= False
  * 
  *         if not goon:             # <<<<<<<<<<<<<<
  *             break
  * 
  */
-    __pyx_t_28 = __Pyx_PyObject_IsTrue(__pyx_v_goon); if (unlikely(__pyx_t_28 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_27 = (!__pyx_t_28);
-    if (__pyx_t_27) {
+    __pyx_t_29 = __Pyx_PyObject_IsTrue(__pyx_v_goon); if (unlikely(__pyx_t_29 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = (!__pyx_t_29);
+    if (__pyx_t_12) {
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":93
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":95
  * 
  *         if not goon:
  *             break             # <<<<<<<<<<<<<<
@@ -1584,13 +1612,13 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
  *     return w
  */
       goto __pyx_L9_break;
-      goto __pyx_L21;
+      goto __pyx_L23;
     }
-    __pyx_L21:;
+    __pyx_L23:;
   }
   __pyx_L9_break:;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":95
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":97
  *             break
  * 
  *     return w             # <<<<<<<<<<<<<<
@@ -1615,7 +1643,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("scikits.learn.linreg.enet_cd_fast.enet_coordinate_descent");
+  __Pyx_AddTraceback("enet_cd_fast.enet_coordinate_descent");
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -3189,7 +3217,7 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
 }
 
 static struct PyMethodDef __pyx_methods[] = {
-  {__Pyx_NAMESTR("enet_coordinate_descent"), (PyCFunction)__pyx_pf_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate_descent, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7scikits_5learn_6linreg_12enet_cd_fast_enet_coordinate_descent)},
+  {__Pyx_NAMESTR("enet_coordinate_descent"), (PyCFunction)__pyx_pf_12enet_cd_fast_enet_coordinate_descent, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_12enet_cd_fast_enet_coordinate_descent)},
   {0, 0, 0, 0}
 };
 
@@ -3313,7 +3341,7 @@ PyMODINIT_FUNC PyInit_enet_cd_fast(void)
   __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
   if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  if (__pyx_module_is_main_scikits__learn__linreg__enet_cd_fast) {
+  if (__pyx_module_is_main_enet_cd_fast) {
     if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_kp___main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   }
   /*--- Builtin init code ---*/
@@ -3328,7 +3356,7 @@ PyMODINIT_FUNC PyInit_enet_cd_fast(void)
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":7
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":7
  * 
  * cimport numpy as np
  * import numpy as np             # <<<<<<<<<<<<<<
@@ -3340,7 +3368,7 @@ PyMODINIT_FUNC PyInit_enet_cd_fast(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_kp_np, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/enet_cd_fast.pyx":8
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/enet_cd_fast.pyx":8
  * cimport numpy as np
  * import numpy as np
  * import scipy.linalg as linalg             # <<<<<<<<<<<<<<
@@ -3368,7 +3396,7 @@ PyMODINIT_FUNC PyInit_enet_cd_fast(void)
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("scikits.learn.linreg.enet_cd_fast");
+  __Pyx_AddTraceback("enet_cd_fast");
   Py_DECREF(__pyx_m); __pyx_m = 0;
   __pyx_L0:;
   __Pyx_FinishRefcountContext();
diff --git a/scikits/learn/glm/src/enet_cd_fast.pyx b/scikits/learn/glm/src/enet_cd_fast.pyx
index 673753d443bdce1af69b1339908217ac1e0d762c..b7dd3f5439bd288030546ad5270137f7ac390e8b 100644
--- a/scikits/learn/glm/src/enet_cd_fast.pyx
+++ b/scikits/learn/glm/src/enet_cd_fast.pyx
@@ -67,10 +67,11 @@ def enet_coordinate_descent(model,
         for ii in xrange(nfeatures): # Loop over coordinates
             w_ii = w[ii] # Store previous value
 
-            # R += w_ii * X[:,ii]
-            for jj in range(nsamples):
-                R[jj] += w_ii * X[jj,ii]
-            R[nsamples+ii] += w_ii * sqrt(beta)
+            if w_ii != 0.0:
+                # R += w_ii * X[:,ii]
+                for jj in range(nsamples):
+                    R[jj] += w_ii * X[jj,ii]
+                R[nsamples+ii] += w_ii * sqrt(beta)
 
             # tmp = (X[:,ii]*R).sum()
             tmp = 0.0
@@ -80,10 +81,11 @@ def enet_coordinate_descent(model,
             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) \
                     / (norm_cols_X[ii] + beta)
 
-            # R -=  w[ii] * X[:,ii] # Update residual
-            for jj in range(nsamples):
-                R[jj] -=  w[ii] * X[jj,ii] # Update residual
-            R[nsamples+ii] -= w[ii] * sqrt(beta)
+            if w[ii] != 0.0:
+                # R -=  w[ii] * X[:,ii] # Update residual
+                for jj in range(nsamples):
+                    R[jj] -=  w[ii] * X[jj,ii] # Update residual
+                R[nsamples+ii] -= w[ii] * sqrt(beta)
 
         for callback in callbacks:
             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, beta=beta, R=R):
diff --git a/scikits/learn/glm/src/lasso_cd_fast.c b/scikits/learn/glm/src/lasso_cd_fast.c
index 380df926c835e562e6af976b06f15ccd324dde6b..680eea1365a6666d7286c35e6ee5c56811053f77 100644
--- a/scikits/learn/glm/src/lasso_cd_fast.c
+++ b/scikits/learn/glm/src/lasso_cd_fast.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.11.2 on Mon Mar 15 12:03:21 2010 */
+/* Generated by Cython 0.11.2 on Wed Mar 17 11:28:40 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -131,7 +131,7 @@
 #define __PYX_EXTERN_C extern
 #endif
 #include <math.h>
-#define __PYX_HAVE_API__scikits__learn__linreg__lasso_cd_fast
+#define __PYX_HAVE_API__lasso_cd_fast
 #include "stdlib.h"
 #include "numpy/arrayobject.h"
 #include "math.h"
@@ -693,7 +693,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-typedef __pyx_t_5numpy_float64_t __pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE;
+typedef __pyx_t_5numpy_float64_t __pyx_t_13lasso_cd_fast_DOUBLE;
 /* Module declarations from python_buffer */
 
 /* Module declarations from stdlib */
@@ -707,14 +707,14 @@ static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
 static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
 /* Module declarations from cython */
 
-/* Module declarations from scikits.learn.linreg.lasso_cd_fast */
+/* Module declarations from lasso_cd_fast */
 
-static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(double); /*proto*/
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE = { "scikits.learn.linreg.lasso_cd_fast.DOUBLE", NULL, sizeof(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE), 'R' };
-#define __Pyx_MODULE_NAME "scikits.learn.linreg.lasso_cd_fast"
-int __pyx_module_is_main_scikits__learn__linreg__lasso_cd_fast = 0;
+static INLINE double __pyx_f_13lasso_cd_fast_fsign(double); /*proto*/
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE = { "lasso_cd_fast.DOUBLE", NULL, sizeof(__pyx_t_13lasso_cd_fast_DOUBLE), 'R' };
+#define __Pyx_MODULE_NAME "lasso_cd_fast"
+int __pyx_module_is_main_lasso_cd_fast = 0;
 
-/* Implementation of scikits.learn.linreg.lasso_cd_fast */
+/* Implementation of lasso_cd_fast */
 static PyObject *__pyx_int_2;
 static PyObject *__pyx_int_0;
 static char __pyx_k___main__[] = "__main__";
@@ -813,7 +813,7 @@ static char __pyx_k_28[] = "Non-native byte order not supported";
 static char __pyx_k_29[] = "Format string allocated too short.";
 static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
 
-/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":18
+/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":18
  *     double rand()
  * 
  * cdef inline double fsign(double f):             # <<<<<<<<<<<<<<
@@ -821,12 +821,12 @@ static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
  *         return 0
  */
 
-static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(double __pyx_v_f) {
+static INLINE double __pyx_f_13lasso_cd_fast_fsign(double __pyx_v_f) {
   double __pyx_r;
   int __pyx_t_1;
   __Pyx_SetupRefcountContext("fsign");
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":19
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":19
  * 
  * cdef inline double fsign(double f):
  *     if f == 0:             # <<<<<<<<<<<<<<
@@ -836,7 +836,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
   __pyx_t_1 = (__pyx_v_f == 0);
   if (__pyx_t_1) {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":20
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":20
  * cdef inline double fsign(double f):
  *     if f == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -848,7 +848,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
     goto __pyx_L3;
   }
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":21
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":21
  *     if f == 0:
  *         return 0
  *     elif f > 0:             # <<<<<<<<<<<<<<
@@ -858,7 +858,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
   __pyx_t_1 = (__pyx_v_f > 0);
   if (__pyx_t_1) {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":22
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":22
  *         return 0
  *     elif f > 0:
  *         return 1.0             # <<<<<<<<<<<<<<
@@ -871,7 +871,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
   }
   /*else*/ {
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":24
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":24
  *         return 1.0
  *     else:
  *         return -1.0             # <<<<<<<<<<<<<<
@@ -889,7 +889,7 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
   return __pyx_r;
 }
 
-/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":30
+/* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":30
  * @cython.boundscheck(False)
  * @cython.wraparound(False)
  * def lasso_coordinate_descent(model,             # <<<<<<<<<<<<<<
@@ -897,9 +897,9 @@ static INLINE double __pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(doubl
  *                             np.ndarray[DOUBLE, ndim=1] y,
  */
 
-static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordinate_descent[] = "Cython version of the coordinate descent algorithm\n        for Lasso regression\n    ";
-static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+static PyObject *__pyx_pf_13lasso_cd_fast_lasso_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_13lasso_cd_fast_lasso_coordinate_descent[] = "Cython version of the coordinate descent algorithm\n        for Lasso regression\n    ";
+static PyObject *__pyx_pf_13lasso_cd_fast_lasso_coordinate_descent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_model = 0;
   PyArrayObject *__pyx_v_X = 0;
   PyArrayObject *__pyx_v_y = 0;
@@ -949,7 +949,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   unsigned int __pyx_t_9;
   unsigned int __pyx_t_10;
   unsigned int __pyx_t_11;
-  unsigned int __pyx_t_12;
+  int __pyx_t_12;
   unsigned int __pyx_t_13;
   unsigned int __pyx_t_14;
   unsigned int __pyx_t_15;
@@ -962,8 +962,9 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   unsigned int __pyx_t_22;
   unsigned int __pyx_t_23;
   unsigned int __pyx_t_24;
-  int __pyx_t_25;
-  int __pyx_t_26;
+  unsigned int __pyx_t_25;
+  unsigned int __pyx_t_26;
+  int __pyx_t_27;
   static PyObject **__pyx_pyargnames[] = {&__pyx_kp_model,&__pyx_kp_X,&__pyx_kp_y,&__pyx_kp_maxit,0};
   __Pyx_SetupRefcountContext("lasso_coordinate_descent");
   __pyx_self = __pyx_self;
@@ -1021,7 +1022,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_L5_argtuple_error:;
   __Pyx_RaiseArgtupleInvalid("lasso_coordinate_descent", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
-  __Pyx_AddTraceback("scikits.learn.linreg.lasso_cd_fast.lasso_coordinate_descent");
+  __Pyx_AddTraceback("lasso_cd_fast.lasso_coordinate_descent");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_v_callbacks = Py_None; __Pyx_INCREF(Py_None);
@@ -1036,18 +1037,18 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_X = __pyx_bstruct_X.strides[0]; __pyx_bstride_1_X = __pyx_bstruct_X.strides[1];
   __pyx_bshape_0_X = __pyx_bstruct_X.shape[0]; __pyx_bshape_1_X = __pyx_bstruct_X.shape[1];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_y = __pyx_bstruct_y.strides[0];
   __pyx_bshape_0_y = __pyx_bstruct_y.shape[0];
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":39
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":39
  * 
  *     # get the data information into easy vars
  *     cdef float alpha = model.alpha             # <<<<<<<<<<<<<<
@@ -1060,7 +1061,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_alpha = __pyx_t_2;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":40
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":40
  *     # get the data information into easy vars
  *     cdef float alpha = model.alpha
  *     cdef np.ndarray[DOUBLE, ndim=1] w = model.w             # <<<<<<<<<<<<<<
@@ -1073,7 +1074,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_t_3 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_3, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_3, &__Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_w = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_w.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
@@ -1084,7 +1085,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":41
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":41
  *     cdef float alpha = model.alpha
  *     cdef np.ndarray[DOUBLE, ndim=1] w = model.w
  *     callbacks = model.callbacks             # <<<<<<<<<<<<<<
@@ -1097,7 +1098,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_v_callbacks = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":43
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":43
  *     callbacks = model.callbacks
  * 
  *     cdef unsigned int nsamples = X.shape[0]             # <<<<<<<<<<<<<<
@@ -1106,7 +1107,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
  */
   __pyx_v_nsamples = (__pyx_v_X->dimensions[0]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":44
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":44
  * 
  *     cdef unsigned int nsamples = X.shape[0]
  *     cdef unsigned int nfeatures = X.shape[1]             # <<<<<<<<<<<<<<
@@ -1115,7 +1116,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
  */
   __pyx_v_nfeatures = (__pyx_v_X->dimensions[1]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":45
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":45
  *     cdef unsigned int nsamples = X.shape[0]
  *     cdef unsigned int nfeatures = X.shape[1]
  *     cdef unsigned int nclasses = w.shape[1]             # <<<<<<<<<<<<<<
@@ -1124,7 +1125,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
  */
   __pyx_v_nclasses = (__pyx_v_w->dimensions[1]);
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":47
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":47
  *     cdef unsigned int nclasses = w.shape[1]
  * 
  *     cdef np.ndarray[DOUBLE, ndim=1] norm_cols_X = (X**2).sum(axis=0) # Compute norms of the columns of X             # <<<<<<<<<<<<<<
@@ -1147,7 +1148,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_norm_cols_X, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_norm_cols_X, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_norm_cols_X = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_norm_cols_X.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_norm_cols_X = __pyx_bstruct_norm_cols_X.strides[0];
@@ -1158,7 +1159,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_v_norm_cols_X = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":48
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":48
  * 
  *     cdef np.ndarray[DOUBLE, ndim=1] norm_cols_X = (X**2).sum(axis=0) # Compute norms of the columns of X
  *     cdef np.ndarray[DOUBLE, ndim=1] R = y - np.dot(X, w) # Init residual             # <<<<<<<<<<<<<<
@@ -1189,7 +1190,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_R, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_R, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_13lasso_cd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) {
       __pyx_v_R = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_R.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_R = __pyx_bstruct_R.strides[0];
@@ -1200,7 +1201,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_v_R = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":56
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":56
  *     cdef unsigned int n_iter
  * 
  *     for callback in callbacks:             # <<<<<<<<<<<<<<
@@ -1232,7 +1233,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
     __pyx_v_callback = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":57
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":57
  * 
  *     for callback in callbacks:
  *         callback(0) # Init callback             # <<<<<<<<<<<<<<
@@ -1251,7 +1252,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":59
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":59
  *         callback(0) # Init callback
  * 
  *     goon = True             # <<<<<<<<<<<<<<
@@ -1264,7 +1265,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   __pyx_v_goon = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":60
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":60
  * 
  *     goon = True
  *     for n_iter in range(maxit):             # <<<<<<<<<<<<<<
@@ -1274,7 +1275,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
   for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_v_maxit; __pyx_t_9+=1) {
     __pyx_v_n_iter = __pyx_t_9;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":61
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":61
  *     goon = True
  *     for n_iter in range(maxit):
  *         for ii in xrange(nfeatures): # Loop over coordinates             # <<<<<<<<<<<<<<
@@ -1284,40 +1285,53 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
     for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_v_nfeatures; __pyx_t_10+=1) {
       __pyx_v_ii = __pyx_t_10;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":62
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":62
  *     for n_iter in range(maxit):
  *         for ii in xrange(nfeatures): # Loop over coordinates
  *             w_ii = w[ii] # Store previous value             # <<<<<<<<<<<<<<
  * 
- *             # R += w_ii * X[:,ii]
+ *             if w_ii != 0.0:
  */
       __pyx_t_11 = __pyx_v_ii;
-      __pyx_v_w_ii = (*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_11, __pyx_bstride_0_w));
+      __pyx_v_w_ii = (*__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_11, __pyx_bstride_0_w));
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":65
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":64
+ *             w_ii = w[ii] # Store previous value
  * 
- *             # R += w_ii * X[:,ii]
- *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
- *                 R[jj] += w_ii * X[jj, ii]
+ *             if w_ii != 0.0:             # <<<<<<<<<<<<<<
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):
+ */
+      __pyx_t_12 = (__pyx_v_w_ii != 0.0);
+      if (__pyx_t_12) {
+
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":66
+ *             if w_ii != 0.0:
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):             # <<<<<<<<<<<<<<
+ *                     R[jj] += w_ii * X[jj, ii]
  * 
  */
-      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_v_nsamples; __pyx_t_12+=1) {
-        __pyx_v_jj = __pyx_t_12;
+        for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_v_nsamples; __pyx_t_13+=1) {
+          __pyx_v_jj = __pyx_t_13;
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":66
- *             # R += w_ii * X[:,ii]
- *             for jj in range(nsamples):
- *                 R[jj] += w_ii * X[jj, ii]             # <<<<<<<<<<<<<<
+          /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":67
+ *                 # R += w_ii * X[:,ii]
+ *                 for jj in range(nsamples):
+ *                     R[jj] += w_ii * X[jj, ii]             # <<<<<<<<<<<<<<
  * 
  *             # tmp = (X[:,ii]*R).sum()
  */
-        __pyx_t_13 = __pyx_v_jj;
-        __pyx_t_14 = __pyx_v_ii;
-        __pyx_t_15 = __pyx_v_jj;
-        *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_15, __pyx_bstride_0_R) += (__pyx_v_w_ii * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_13, __pyx_bstride_0_X, __pyx_t_14, __pyx_bstride_1_X)));
+          __pyx_t_14 = __pyx_v_jj;
+          __pyx_t_15 = __pyx_v_ii;
+          __pyx_t_16 = __pyx_v_jj;
+          *__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_16, __pyx_bstride_0_R) += (__pyx_v_w_ii * (*__Pyx_BufPtrStrided2d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_14, __pyx_bstride_0_X, __pyx_t_15, __pyx_bstride_1_X)));
+        }
+        goto __pyx_L12;
       }
+      __pyx_L12:;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":69
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":70
  * 
  *             # tmp = (X[:,ii]*R).sum()
  *             tmp = 0.0             # <<<<<<<<<<<<<<
@@ -1326,67 +1340,81 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
  */
       __pyx_v_tmp = 0.0;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":70
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":71
  *             # tmp = (X[:,ii]*R).sum()
  *             tmp = 0.0
  *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
  *                 tmp += R[jj] * X[jj, ii]
  * 
  */
-      for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_v_nsamples; __pyx_t_12+=1) {
-        __pyx_v_jj = __pyx_t_12;
+      for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_v_nsamples; __pyx_t_13+=1) {
+        __pyx_v_jj = __pyx_t_13;
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":71
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":72
  *             tmp = 0.0
  *             for jj in range(nsamples):
  *                 tmp += R[jj] * X[jj, ii]             # <<<<<<<<<<<<<<
  * 
  *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) / norm_cols_X[ii]
  */
-        __pyx_t_16 = __pyx_v_jj;
         __pyx_t_17 = __pyx_v_jj;
-        __pyx_t_18 = __pyx_v_ii;
-        __pyx_v_tmp += ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_16, __pyx_bstride_0_R)) * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_17, __pyx_bstride_0_X, __pyx_t_18, __pyx_bstride_1_X)));
+        __pyx_t_18 = __pyx_v_jj;
+        __pyx_t_19 = __pyx_v_ii;
+        __pyx_v_tmp += ((*__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_17, __pyx_bstride_0_R)) * (*__Pyx_BufPtrStrided2d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_18, __pyx_bstride_0_X, __pyx_t_19, __pyx_bstride_1_X)));
       }
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":73
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":74
  *                 tmp += R[jj] * X[jj, ii]
  * 
  *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) / norm_cols_X[ii]             # <<<<<<<<<<<<<<
  * 
- *             # R -=  w[ii] * X[:,ii] # Update residual
+ *             if w[ii] != 0.0:
  */
-      __pyx_t_12 = __pyx_v_ii;
-      __pyx_t_19 = __pyx_v_ii;
-      *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_19, __pyx_bstride_0_w) = ((__pyx_f_7scikits_5learn_6linreg_13lasso_cd_fast_fsign(__pyx_v_tmp) * fmax((fabs(__pyx_v_tmp) - __pyx_v_alpha), 0)) / (*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_norm_cols_X.buf, __pyx_t_12, __pyx_bstride_0_norm_cols_X)));
+      __pyx_t_13 = __pyx_v_ii;
+      __pyx_t_20 = __pyx_v_ii;
+      *__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_20, __pyx_bstride_0_w) = ((__pyx_f_13lasso_cd_fast_fsign(__pyx_v_tmp) * fmax((fabs(__pyx_v_tmp) - __pyx_v_alpha), 0)) / (*__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_norm_cols_X.buf, __pyx_t_13, __pyx_bstride_0_norm_cols_X)));
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":76
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":76
+ *             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) / norm_cols_X[ii]
  * 
- *             # R -=  w[ii] * X[:,ii] # Update residual
- *             for jj in range(nsamples):             # <<<<<<<<<<<<<<
- *                 R[jj] -=  w[ii] * X[jj, ii] # Update residual
+ *             if w[ii] != 0.0:             # <<<<<<<<<<<<<<
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):
+ */
+      __pyx_t_21 = __pyx_v_ii;
+      __pyx_t_12 = ((*__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_21, __pyx_bstride_0_w)) != 0.0);
+      if (__pyx_t_12) {
+
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":78
+ *             if w[ii] != 0.0:
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):             # <<<<<<<<<<<<<<
+ *                     R[jj] -=  w[ii] * X[jj, ii] # Update residual
  * 
  */
-      for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_v_nsamples; __pyx_t_20+=1) {
-        __pyx_v_jj = __pyx_t_20;
+        for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_v_nsamples; __pyx_t_22+=1) {
+          __pyx_v_jj = __pyx_t_22;
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":77
- *             # R -=  w[ii] * X[:,ii] # Update residual
- *             for jj in range(nsamples):
- *                 R[jj] -=  w[ii] * X[jj, ii] # Update residual             # <<<<<<<<<<<<<<
+          /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":79
+ *                 # R -=  w[ii] * X[:,ii] # Update residual
+ *                 for jj in range(nsamples):
+ *                     R[jj] -=  w[ii] * X[jj, ii] # Update residual             # <<<<<<<<<<<<<<
  * 
  *         for callback in callbacks:
  */
-        __pyx_t_21 = __pyx_v_ii;
-        __pyx_t_22 = __pyx_v_jj;
-        __pyx_t_23 = __pyx_v_ii;
-        __pyx_t_24 = __pyx_v_jj;
-        *__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_24, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_21, __pyx_bstride_0_w)) * (*__Pyx_BufPtrStrided2d(__pyx_t_7scikits_5learn_6linreg_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_22, __pyx_bstride_0_X, __pyx_t_23, __pyx_bstride_1_X)));
+          __pyx_t_23 = __pyx_v_ii;
+          __pyx_t_24 = __pyx_v_jj;
+          __pyx_t_25 = __pyx_v_ii;
+          __pyx_t_26 = __pyx_v_jj;
+          *__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_R.buf, __pyx_t_26, __pyx_bstride_0_R) -= ((*__Pyx_BufPtrStrided1d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_w.buf, __pyx_t_23, __pyx_bstride_0_w)) * (*__Pyx_BufPtrStrided2d(__pyx_t_13lasso_cd_fast_DOUBLE *, __pyx_bstruct_X.buf, __pyx_t_24, __pyx_bstride_0_X, __pyx_t_25, __pyx_bstride_1_X)));
+        }
+        goto __pyx_L17;
       }
+      __pyx_L17:;
     }
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":79
- *                 R[jj] -=  w[ii] * X[jj, ii] # Update residual
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":81
+ *                     R[jj] -=  w[ii] * X[jj, ii] # Update residual
  * 
  *         for callback in callbacks:             # <<<<<<<<<<<<<<
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, R=R):
@@ -1395,7 +1423,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
     if (PyList_CheckExact(__pyx_v_callbacks) || PyTuple_CheckExact(__pyx_v_callbacks)) {
       __pyx_t_8 = 0; __pyx_t_4 = __pyx_v_callbacks; __Pyx_INCREF(__pyx_t_4);
     } else {
-      __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_callbacks); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_callbacks); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
     }
     for (;;) {
@@ -1408,7 +1436,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
       } else {
         __pyx_t_1 = PyIter_Next(__pyx_t_4);
         if (!__pyx_t_1) {
-          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           break;
         }
         __Pyx_GOTREF(__pyx_t_1);
@@ -1417,72 +1445,72 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
       __pyx_v_callback = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":80
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":82
  * 
  *         for callback in callbacks:
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, R=R):             # <<<<<<<<<<<<<<
  *                 goon *= False
  * 
  */
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_iter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_iter); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_6));
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_1));
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_X, ((PyObject *)__pyx_v_X)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_y, ((PyObject *)__pyx_v_y)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_w, ((PyObject *)__pyx_v_w)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_alpha); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_X, ((PyObject *)__pyx_v_X)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_y, ((PyObject *)__pyx_v_y)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_w, ((PyObject *)__pyx_v_w)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_alpha); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_alpha, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_alpha, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (PyDict_SetItem(__pyx_1, __pyx_kp_R, ((PyObject *)__pyx_v_R)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_1 = PyEval_CallObjectWithKeywords(__pyx_v_callback, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyDict_SetItem(__pyx_1, __pyx_kp_R, ((PyObject *)__pyx_v_R)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyEval_CallObjectWithKeywords(__pyx_v_callback, ((PyObject *)__pyx_t_6), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
-      __pyx_t_25 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_25 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_26 = (!__pyx_t_25);
-      if (__pyx_t_26) {
+      __pyx_t_27 = (!__pyx_t_12);
+      if (__pyx_t_27) {
 
-        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":81
+        /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":83
  *         for callback in callbacks:
  *             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, R=R):
  *                 goon *= False             # <<<<<<<<<<<<<<
  * 
  *         if not goon:
  */
-        __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_1 = PyNumber_InPlaceMultiply(__pyx_v_goon, __pyx_t_1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_1 = PyNumber_InPlaceMultiply(__pyx_v_goon, __pyx_t_1); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_1);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_v_goon);
         __pyx_v_goon = __pyx_1;
         __pyx_1 = 0;
-        goto __pyx_L20;
+        goto __pyx_L22;
       }
-      __pyx_L20:;
+      __pyx_L22:;
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":83
+    /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":85
  *                 goon *= False
  * 
  *         if not goon:             # <<<<<<<<<<<<<<
  *             break
  * 
  */
-    __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_v_goon); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_25 = (!__pyx_t_26);
-    if (__pyx_t_25) {
+    __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_v_goon); if (unlikely(__pyx_t_27 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = (!__pyx_t_27);
+    if (__pyx_t_12) {
 
-      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":84
+      /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":86
  * 
  *         if not goon:
  *             break             # <<<<<<<<<<<<<<
@@ -1490,13 +1518,13 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
  *     return w
  */
       goto __pyx_L9_break;
-      goto __pyx_L21;
+      goto __pyx_L23;
     }
-    __pyx_L21:;
+    __pyx_L23:;
   }
   __pyx_L9_break:;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":86
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":88
  *             break
  * 
  *     return w             # <<<<<<<<<<<<<<
@@ -1521,7 +1549,7 @@ static PyObject *__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordina
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("scikits.learn.linreg.lasso_cd_fast.lasso_coordinate_descent");
+  __Pyx_AddTraceback("lasso_cd_fast.lasso_coordinate_descent");
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
@@ -3095,7 +3123,7 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
 }
 
 static struct PyMethodDef __pyx_methods[] = {
-  {__Pyx_NAMESTR("lasso_coordinate_descent"), (PyCFunction)__pyx_pf_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordinate_descent, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7scikits_5learn_6linreg_13lasso_cd_fast_lasso_coordinate_descent)},
+  {__Pyx_NAMESTR("lasso_coordinate_descent"), (PyCFunction)__pyx_pf_13lasso_cd_fast_lasso_coordinate_descent, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_13lasso_cd_fast_lasso_coordinate_descent)},
   {0, 0, 0, 0}
 };
 
@@ -3217,7 +3245,7 @@ PyMODINIT_FUNC PyInit_lasso_cd_fast(void)
   __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
   if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  if (__pyx_module_is_main_scikits__learn__linreg__lasso_cd_fast) {
+  if (__pyx_module_is_main_lasso_cd_fast) {
     if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_kp___main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   }
   /*--- Builtin init code ---*/
@@ -3232,7 +3260,7 @@ PyMODINIT_FUNC PyInit_lasso_cd_fast(void)
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":7
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":7
  * 
  * cimport numpy as np
  * import numpy as np             # <<<<<<<<<<<<<<
@@ -3244,7 +3272,7 @@ PyMODINIT_FUNC PyInit_lasso_cd_fast(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_kp_np, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/linreg/lasso_cd_fast.pyx":8
+  /* "/Users/alex/work/src/scikit-learn/trunk/scikits/learn/glm/src/lasso_cd_fast.pyx":8
  * cimport numpy as np
  * import numpy as np
  * import scipy.linalg as linalg             # <<<<<<<<<<<<<<
@@ -3272,7 +3300,7 @@ PyMODINIT_FUNC PyInit_lasso_cd_fast(void)
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("scikits.learn.linreg.lasso_cd_fast");
+  __Pyx_AddTraceback("lasso_cd_fast");
   Py_DECREF(__pyx_m); __pyx_m = 0;
   __pyx_L0:;
   __Pyx_FinishRefcountContext();
diff --git a/scikits/learn/glm/src/lasso_cd_fast.pyx b/scikits/learn/glm/src/lasso_cd_fast.pyx
index 45b31eea0a17edc607fb3c6bc59609c465d3233d..30cf99636cf6dd63988ea9742f43495ed73278af 100644
--- a/scikits/learn/glm/src/lasso_cd_fast.pyx
+++ b/scikits/learn/glm/src/lasso_cd_fast.pyx
@@ -61,9 +61,10 @@ def lasso_coordinate_descent(model,
         for ii in xrange(nfeatures): # Loop over coordinates
             w_ii = w[ii] # Store previous value
 
-            # R += w_ii * X[:,ii]
-            for jj in range(nsamples):
-                R[jj] += w_ii * X[jj, ii]
+            if w_ii != 0.0:
+                # R += w_ii * X[:,ii]
+                for jj in range(nsamples):
+                    R[jj] += w_ii * X[jj, ii]
 
             # tmp = (X[:,ii]*R).sum()
             tmp = 0.0
@@ -72,9 +73,10 @@ def lasso_coordinate_descent(model,
 
             w[ii] = fsign(tmp) * fmax(fabs(tmp) - alpha, 0) / norm_cols_X[ii]
 
-            # R -=  w[ii] * X[:,ii] # Update residual
-            for jj in range(nsamples):
-                R[jj] -=  w[ii] * X[jj, ii] # Update residual
+            if w[ii] != 0.0:
+                # R -=  w[ii] * X[:,ii] # Update residual
+                for jj in range(nsamples):
+                    R[jj] -=  w[ii] * X[jj, ii] # Update residual
 
         for callback in callbacks:
             if not callback(n_iter, X=X, y=y, w=w, alpha=alpha, R=R):