diff --git a/doc/modules/sgd.rst b/doc/modules/sgd.rst
index 49810950c341596ffd96fdc3bd8b7212fd4692db..1bc6b59353be765965c9043e4e347005e65a2a25 100644
--- a/doc/modules/sgd.rst
+++ b/doc/modules/sgd.rst
@@ -64,7 +64,7 @@ for the training samples::
     >>> clf.fit(X, y)
     SGDClassifier(alpha=0.0001, class_weight=None, eta0=0.0, fit_intercept=True,
            learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
-           penalty='l2', power_t=0.5, rho=1.0, seed=0, shuffle=False,
+           penalty='l2', power_t=0.5, rho=0.85, seed=0, shuffle=False,
            verbose=0)
 
 After being fitted, the model can then be used to predict new values::
diff --git a/examples/linear_model/plot_sgd_separating_hyperplane.py b/examples/linear_model/plot_sgd_separating_hyperplane.py
index 9080e255533912d8c295cfac3da5fa8aaff8f253..b55b27dc9139064132092141139c02851f1192bd 100644
--- a/examples/linear_model/plot_sgd_separating_hyperplane.py
+++ b/examples/linear_model/plot_sgd_separating_hyperplane.py
@@ -42,4 +42,3 @@ pl.scatter(X[:,0], X[:,1], c=Y)
 
 pl.axis('tight')
 pl.show()
-
diff --git a/sklearn/linear_model/base.py b/sklearn/linear_model/base.py
index 95d16e1b6d04d9104bde4f2a87a3b8fcf4505a7c..8ef5e866b816c51a65d30b62f3f674aa979e1923 100644
--- a/sklearn/linear_model/base.py
+++ b/sklearn/linear_model/base.py
@@ -164,19 +164,22 @@ class BaseSGD(BaseEstimator):
                  power_t=0.5, class_weight=None):
         self.loss = str(loss)
         self.penalty = str(penalty)
+        self._set_loss_function(self.loss)
+        self._set_penalty_type(self.penalty)
+
         self.alpha = float(alpha)
         self.rho = float(rho)
+        if self.rho < 0.0 or self.rho > 1.0:
+            raise ValueError("rho must be in [0, 1]")
         self.fit_intercept = bool(fit_intercept)
         self.n_iter = int(n_iter)
         if self.n_iter <= 0:
-            raise ValueError("n_iter must be greater than zero.")
+            raise ValueError("n_iter must be greater than zero")
         if not isinstance(shuffle, bool):
             raise ValueError("shuffle must be either True or False")
         self.shuffle = bool(shuffle)
         self.seed = seed
         self.verbose = int(verbose)
-        self._set_loss_function(self.loss)
-        self._set_penalty_type(self.penalty)
 
         self.learning_rate = str(learning_rate)
         self._set_learning_rate(self.learning_rate)
@@ -203,10 +206,6 @@ class BaseSGD(BaseEstimator):
         penalty_types = {"l2": 2, "l1": 1, "elasticnet": 3}
         try:
             self.penalty_type = penalty_types[penalty]
-            if self.penalty_type == 2:
-                self.rho = 1.0
-            elif self.penalty_type == 1:
-                self.rho = 0.0
         except KeyError:
             raise ValueError("Penalty %s is not supported. " % penalty)
 
diff --git a/sklearn/linear_model/sgd_fast.c b/sklearn/linear_model/sgd_fast.c
index c6b1a7ac712a7b5fd005eb98d51d630990a0cec5..a638c9e1ac7e748290b3ccb4c9cc8aeb8ef0da54 100644
--- a/sklearn/linear_model/sgd_fast.c
+++ b/sklearn/linear_model/sgd_fast.c
@@ -1,11 +1,9 @@
-/* Generated by Cython 0.15.1+ on Fri Nov  4 21:49:02 2011 */
+/* Generated by Cython 0.15 on Tue Nov 15 20:42:18 2011 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
 #else
 
 #include <stddef.h> /* For offsetof */
@@ -36,6 +34,12 @@
   #define PY_LONG_LONG LONG_LONG
 #endif
 
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
+  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#endif
+
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
@@ -84,14 +88,8 @@
 
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #endif
 
 #if PY_MAJOR_VERSION >= 3
@@ -103,16 +101,6 @@
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
 
-/* new Py3.3 unicode representation (PEP 393) */
-#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_GET_LENGTH)
-  #define CYTHON_PEP393_ENABLED
-  #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
-#else
-  #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-#endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -279,7 +267,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
+# elif defined(__ICC) || defined(__INTEL_COMPILER)
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -815,6 +803,7 @@ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log {
 static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;
 
 
+
 /* "sklearn/linear_model/sgd_fast.pyx":174
  * 
  * 
@@ -882,9 +871,6 @@ static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_vt
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
 
-#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
-#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
-
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
@@ -902,20 +888,15 @@ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
-#define IS_UNSIGNED(type) (((type) -1) > 0)
 
 /* Run-time type information about structs used with buffers */
 struct __Pyx_StructField_;
 
-#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0)
-
 typedef struct {
   const char* name; /* for error messages only */
   struct __Pyx_StructField_* fields;
   size_t size;     /* sizeof(type) */
   char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
-  char is_unsigned;
-  int flags;
 } __Pyx_TypeInfo;
 
 typedef struct __Pyx_StructField_ {
@@ -929,26 +910,13 @@ typedef struct {
   size_t parent_offset;
 } __Pyx_BufFmt_StackElem;
 
-typedef struct {
-  __Pyx_StructField root;
-  __Pyx_BufFmt_StackElem* head;
-  size_t fmt_offset;
-  size_t new_count, enc_count;
-  int is_complex;
-  char enc_type;
-  char new_packmode;
-  char enc_packmode;
-} __Pyx_BufFmt_Context;
-
 
-static CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj,
-    __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
+static CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
 static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
 
-
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
-static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
 
+static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
 
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
@@ -1006,29 +974,22 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    PyObject *r;
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (likely(i >= 0)) {
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            return m->sq_item(o, i);
-        }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
     }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    else {
+        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    }
+    return r;
 }
 
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
@@ -1038,23 +999,6 @@ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
 
 static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
-/* structs for buffer access */
-
-typedef struct {
-  Py_ssize_t shape, strides, suboffsets;
-} __Pyx_Buf_DimInfo;
-
-typedef struct {
-  size_t refcount;
-  Py_buffer pybuffer;
-} __Pyx_Buffer;
-
-typedef struct {
-  __Pyx_Buffer *rcbuffer;
-  char *data;
-  __Pyx_Buf_DimInfo diminfo[32];
-} __Pyx_LocalBuf_ND;
-
 #if PY_MAJOR_VERSION < 3
 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
 static void __Pyx_ReleaseBuffer(Py_buffer *view);
@@ -1063,13 +1007,11 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view);
 #define __Pyx_ReleaseBuffer PyBuffer_Release
 #endif
 
-Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+Py_ssize_t __Pyx_zeros[] = {0, 0};
+Py_ssize_t __Pyx_minusones[] = {-1, -1};
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
-
 static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/
 #if PY_MAJOR_VERSION >= 3
 static PyObject* __pyx_print = 0;
@@ -1252,6 +1194,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, cha
 static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/
 static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/
 
+/* Module declarations from 'cython.cython.view' */
+
 /* Module declarations from 'cython' */
 
 /* Module declarations from 'sklearn.linear_model.sgd_fast' */
@@ -1268,8 +1212,8 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double
 static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *, double *, unsigned int, unsigned int); /*proto*/
 static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *, double, double *, unsigned int, unsigned int, double); /*proto*/
 static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *, double, double *, unsigned int, double); /*proto*/
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), 'R', 0, 0 };
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), 'I', IS_UNSIGNED(__pyx_t_5numpy_int32_t), 0 };
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t = { "float64_t", NULL, sizeof(__pyx_t_5numpy_float64_t), 'R' };
+static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t = { "int32_t", NULL, sizeof(__pyx_t_5numpy_int32_t), 'I' };
 #define __Pyx_MODULE_NAME "sklearn.linear_model.sgd_fast"
 int __pyx_module_is_main_sklearn__linear_model__sgd_fast = 0;
 
@@ -1289,8 +1233,7 @@ static char __pyx_k_10[] = "Non-native byte order not supported";
 static char __pyx_k_12[] = "unknown dtype code in numpy.pxd (%d)";
 static char __pyx_k_13[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_16[] = "Format string allocated too short.";
-static char __pyx_k_20[] = "/home/lars/src/scikit-learn/sklearn/linear_model/sgd_fast.pyx";
-static char __pyx_k_21[] = "sklearn.linear_model.sgd_fast";
+static char __pyx_k_18[] = "sklearn.linear_model.sgd_fast";
 static char __pyx_k__B[] = "B";
 static char __pyx_k__H[] = "H";
 static char __pyx_k__I[] = "I";
@@ -1309,8 +1252,6 @@ static char __pyx_k__i[] = "i";
 static char __pyx_k__l[] = "l";
 static char __pyx_k__p[] = "p";
 static char __pyx_k__q[] = "q";
-static char __pyx_k__t[] = "t";
-static char __pyx_k__u[] = "u";
 static char __pyx_k__w[] = "w";
 static char __pyx_k__y[] = "y";
 static char __pyx_k__Zd[] = "Zd";
@@ -1319,20 +1260,15 @@ static char __pyx_k__Zg[] = "Zg";
 static char __pyx_k__np[] = "np";
 static char __pyx_k__any[] = "any";
 static char __pyx_k__dot[] = "dot";
-static char __pyx_k__eta[] = "eta";
 static char __pyx_k__rho[] = "rho";
 static char __pyx_k__sys[] = "sys";
 static char __pyx_k__eta0[] = "eta0";
 static char __pyx_k__loss[] = "loss";
 static char __pyx_k__seed[] = "seed";
 static char __pyx_k__time[] = "time";
-static char __pyx_k__typw[] = "typw";
 static char __pyx_k__alpha[] = "alpha";
-static char __pyx_k__count[] = "count";
 static char __pyx_k__dloss[] = "dloss";
 static char __pyx_k__dtype[] = "dtype";
-static char __pyx_k__epoch[] = "epoch";
-static char __pyx_k__index[] = "index";
 static char __pyx_k__int32[] = "int32";
 static char __pyx_k__isinf[] = "isinf";
 static char __pyx_k__isnan[] = "isnan";
@@ -1340,55 +1276,37 @@ static char __pyx_k__numpy[] = "numpy";
 static char __pyx_k__order[] = "order";
 static char __pyx_k__range[] = "range";
 static char __pyx_k__shape[] = "shape";
-static char __pyx_k__wnorm[] = "wnorm";
 static char __pyx_k__zeros[] = "zeros";
 static char __pyx_k__arange[] = "arange";
 static char __pyx_k__n_iter[] = "n_iter";
-static char __pyx_k__offset[] = "offset";
 static char __pyx_k__random[] = "random";
-static char __pyx_k__stride[] = "stride";
-static char __pyx_k__update[] = "update";
-static char __pyx_k__wscale[] = "wscale";
 static char __pyx_k__xrange[] = "xrange";
 static char __pyx_k__float64[] = "float64";
 static char __pyx_k__nonzero[] = "nonzero";
 static char __pyx_k__power_t[] = "power_t";
 static char __pyx_k__shuffle[] = "shuffle";
-static char __pyx_k__sumloss[] = "sumloss";
-static char __pyx_k__t_start[] = "t_start";
 static char __pyx_k__verbose[] = "verbose";
 static char __pyx_k____main__[] = "__main__";
 static char __pyx_k____test__[] = "__test__";
 static char __pyx_k__intercept[] = "intercept";
-static char __pyx_k__n_samples[] = "n_samples";
 static char __pyx_k__plain_sgd[] = "plain_sgd";
 static char __pyx_k__ValueError[] = "ValueError";
-static char __pyx_k__X_data_ptr[] = "X_data_ptr";
-static char __pyx_k__Y_data_ptr[] = "Y_data_ptr";
-static char __pyx_k__n_features[] = "n_features";
-static char __pyx_k__q_data_ptr[] = "q_data_ptr";
-static char __pyx_k__sample_idx[] = "sample_idx";
-static char __pyx_k__w_data_ptr[] = "w_data_ptr";
 static char __pyx_k__weight_neg[] = "weight_neg";
 static char __pyx_k__weight_pos[] = "weight_pos";
 static char __pyx_k__RandomState[] = "RandomState";
 static char __pyx_k__RuntimeError[] = "RuntimeError";
-static char __pyx_k__class_weight[] = "class_weight";
 static char __pyx_k__penalty_type[] = "penalty_type";
 static char __pyx_k__fit_intercept[] = "fit_intercept";
 static char __pyx_k__learning_rate[] = "learning_rate";
 static char __pyx_k__sample_weight[] = "sample_weight";
-static char __pyx_k__index_data_ptr[] = "index_data_ptr";
-static char __pyx_k__sample_weight_data[] = "sample_weight_data";
 static char __pyx_k__NotImplementedError[] = "NotImplementedError";
 static PyObject *__pyx_kp_s_1;
 static PyObject *__pyx_kp_u_10;
 static PyObject *__pyx_kp_u_12;
 static PyObject *__pyx_kp_u_13;
 static PyObject *__pyx_kp_u_16;
+static PyObject *__pyx_n_s_18;
 static PyObject *__pyx_kp_s_2;
-static PyObject *__pyx_kp_s_20;
-static PyObject *__pyx_n_s_21;
 static PyObject *__pyx_kp_s_3;
 static PyObject *__pyx_kp_s_4;
 static PyObject *__pyx_kp_u_6;
@@ -1398,73 +1316,47 @@ static PyObject *__pyx_n_s__RandomState;
 static PyObject *__pyx_n_s__RuntimeError;
 static PyObject *__pyx_n_s__ValueError;
 static PyObject *__pyx_n_s__X;
-static PyObject *__pyx_n_s__X_data_ptr;
 static PyObject *__pyx_n_s__Y;
-static PyObject *__pyx_n_s__Y_data_ptr;
 static PyObject *__pyx_n_s____main__;
 static PyObject *__pyx_n_s____test__;
 static PyObject *__pyx_n_s__alpha;
 static PyObject *__pyx_n_s__any;
 static PyObject *__pyx_n_s__arange;
 static PyObject *__pyx_n_s__c;
-static PyObject *__pyx_n_s__class_weight;
-static PyObject *__pyx_n_s__count;
 static PyObject *__pyx_n_s__dloss;
 static PyObject *__pyx_n_s__dot;
 static PyObject *__pyx_n_s__dtype;
-static PyObject *__pyx_n_s__epoch;
-static PyObject *__pyx_n_s__eta;
 static PyObject *__pyx_n_s__eta0;
 static PyObject *__pyx_n_s__fit_intercept;
 static PyObject *__pyx_n_s__float64;
-static PyObject *__pyx_n_s__i;
-static PyObject *__pyx_n_s__index;
-static PyObject *__pyx_n_s__index_data_ptr;
 static PyObject *__pyx_n_s__int32;
 static PyObject *__pyx_n_s__intercept;
 static PyObject *__pyx_n_s__isinf;
 static PyObject *__pyx_n_s__isnan;
 static PyObject *__pyx_n_s__learning_rate;
 static PyObject *__pyx_n_s__loss;
-static PyObject *__pyx_n_s__n_features;
 static PyObject *__pyx_n_s__n_iter;
-static PyObject *__pyx_n_s__n_samples;
 static PyObject *__pyx_n_s__nonzero;
 static PyObject *__pyx_n_s__np;
 static PyObject *__pyx_n_s__numpy;
-static PyObject *__pyx_n_s__offset;
 static PyObject *__pyx_n_s__order;
 static PyObject *__pyx_n_s__p;
 static PyObject *__pyx_n_s__penalty_type;
 static PyObject *__pyx_n_s__plain_sgd;
 static PyObject *__pyx_n_s__power_t;
-static PyObject *__pyx_n_s__q;
-static PyObject *__pyx_n_s__q_data_ptr;
 static PyObject *__pyx_n_s__random;
 static PyObject *__pyx_n_s__range;
 static PyObject *__pyx_n_s__rho;
-static PyObject *__pyx_n_s__sample_idx;
 static PyObject *__pyx_n_s__sample_weight;
-static PyObject *__pyx_n_s__sample_weight_data;
 static PyObject *__pyx_n_s__seed;
 static PyObject *__pyx_n_s__shape;
 static PyObject *__pyx_n_s__shuffle;
-static PyObject *__pyx_n_s__stride;
-static PyObject *__pyx_n_s__sumloss;
 static PyObject *__pyx_n_s__sys;
-static PyObject *__pyx_n_s__t;
-static PyObject *__pyx_n_s__t_start;
 static PyObject *__pyx_n_s__time;
-static PyObject *__pyx_n_s__typw;
-static PyObject *__pyx_n_s__u;
-static PyObject *__pyx_n_s__update;
 static PyObject *__pyx_n_s__verbose;
 static PyObject *__pyx_n_s__w;
-static PyObject *__pyx_n_s__w_data_ptr;
 static PyObject *__pyx_n_s__weight_neg;
 static PyObject *__pyx_n_s__weight_pos;
-static PyObject *__pyx_n_s__wnorm;
-static PyObject *__pyx_n_s__wscale;
 static PyObject *__pyx_n_s__xrange;
 static PyObject *__pyx_n_s__y;
 static PyObject *__pyx_n_s__zeros;
@@ -1476,8 +1368,6 @@ static PyObject *__pyx_k_tuple_11;
 static PyObject *__pyx_k_tuple_14;
 static PyObject *__pyx_k_tuple_15;
 static PyObject *__pyx_k_tuple_17;
-static PyObject *__pyx_k_tuple_18;
-static PyObject *__pyx_k_codeobj_19;
 
 /* "sklearn/linear_model/sgd_fast.pyx":34
  *     """Base class for convex loss functions"""
@@ -1488,7 +1378,7 @@ static PyObject *__pyx_k_codeobj_19;
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -1512,7 +1402,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(CYTH
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -1579,43 +1469,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1653,7 +1537,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -1677,7 +1561,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(CYT
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -1744,43 +1628,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_1dlos
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1818,7 +1696,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_1dlos
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -1842,7 +1720,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(CYTHON
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -1908,43 +1786,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(Py
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1982,7 +1854,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(Py
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2006,7 +1878,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(CYTHO
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -2072,43 +1944,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_1dloss(
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 75; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2146,7 +2012,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_1dloss(
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2170,7 +2036,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(CY
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -2236,43 +2102,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_los
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2310,7 +2170,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_los
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -2334,7 +2194,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(C
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -2400,43 +2260,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_1dl
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2474,7 +2328,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_1dl
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -2500,7 +2354,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(CYT
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -2619,43 +2473,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2693,7 +2541,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -2719,7 +2567,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(CY
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -2838,43 +2686,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1dlo
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2930,7 +2772,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2__r
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));
@@ -2962,7 +2804,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2__r
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -2988,7 +2830,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(CYTHON_UNUSE
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -3083,43 +2925,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(PyObject
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3157,7 +2993,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(PyObject
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -3183,7 +3019,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(CYTHON_UNUS
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -3278,43 +3114,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_1dloss(PyObje
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3370,7 +3200,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2__reduce__(P
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));
@@ -3402,7 +3232,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2__reduce__(P
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -3428,7 +3258,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(CYTHON_UNUSED
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -3546,43 +3376,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(PyObject *
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3620,7 +3444,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(PyObject *
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -3646,7 +3470,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(CYTHON_UNUSED
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -3764,43 +3588,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_1dloss(PyObject
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3856,7 +3674,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2__reduce__(PyO
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));
@@ -3888,7 +3706,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2__reduce__(PyO
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3912,7 +3730,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(CYTHO
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -3975,43 +3793,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(P
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4049,7 +3861,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(P
  */
 
 static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
+static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4073,7 +3885,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(CYTH
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -4136,43 +3948,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1dloss
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4228,7 +4034,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2__red
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));
@@ -4270,33 +4076,28 @@ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(PyObject *
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__c,0};
   __Pyx_RefNannySetupContext("__init__");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[1] = {0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
-      }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_c = values[0];
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_c = values[0];
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_c = PyTuple_GET_ITEM(__pyx_args, 0);
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4363,7 +4164,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss(struct __pyx
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -4398,7 +4199,14 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss(struct __pyx
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_v_abs_r = fabs(__pyx_v_r);
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_abs_r = __pyx_t_5;
 
   /* "sklearn/linear_model/sgd_fast.pyx":192
  *         cdef double r = p - y
@@ -4469,43 +4277,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_1loss(PyObjec
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("loss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4570,7 +4372,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss(struct __py
       __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
@@ -4605,7 +4407,14 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss(struct __py
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_v_abs_r = fabs(__pyx_v_r);
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_abs_r = __pyx_t_5;
 
   /* "sklearn/linear_model/sgd_fast.pyx":200
  *         cdef double r = p - y  # FIXME y - p
@@ -4698,43 +4507,37 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2dloss(PyObje
   int __pyx_clineno = 0;
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
   __Pyx_RefNannySetupContext("dloss");
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-      }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-      __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4793,12 +4596,12 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_3__reduce__(P
   __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));
@@ -4881,18 +4684,26 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   double __pyx_v_u;
   double __pyx_v_typw;
   PyObject *__pyx_v_t_start = NULL;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_X;
-  __Pyx_Buffer __pyx_pybuffer_X;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_index;
-  __Pyx_Buffer __pyx_pybuffer_index;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_sample_weight;
-  __Pyx_Buffer __pyx_pybuffer_sample_weight;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_Y;
-  __Pyx_Buffer __pyx_pybuffer_Y;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_q;
-  __Pyx_Buffer __pyx_pybuffer_q;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_w;
-  __Pyx_Buffer __pyx_pybuffer_w;
+  Py_buffer __pyx_bstruct_X;
+  Py_ssize_t __pyx_bstride_0_X = 0;
+  Py_ssize_t __pyx_bstride_1_X = 0;
+  Py_ssize_t __pyx_bshape_0_X = 0;
+  Py_ssize_t __pyx_bshape_1_X = 0;
+  Py_buffer __pyx_bstruct_index;
+  Py_ssize_t __pyx_bstride_0_index = 0;
+  Py_ssize_t __pyx_bshape_0_index = 0;
+  Py_buffer __pyx_bstruct_sample_weight;
+  Py_ssize_t __pyx_bstride_0_sample_weight = 0;
+  Py_ssize_t __pyx_bshape_0_sample_weight = 0;
+  Py_buffer __pyx_bstruct_Y;
+  Py_ssize_t __pyx_bstride_0_Y = 0;
+  Py_ssize_t __pyx_bshape_0_Y = 0;
+  Py_buffer __pyx_bstruct_q;
+  Py_ssize_t __pyx_bstride_0_q = 0;
+  Py_ssize_t __pyx_bshape_0_q = 0;
+  Py_buffer __pyx_bstruct_w;
+  Py_ssize_t __pyx_bstride_0_w = 0;
+  Py_ssize_t __pyx_bshape_0_w = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -4924,193 +4735,148 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__w,&__pyx_n_s__intercept,&__pyx_n_s__loss,&__pyx_n_s__penalty_type,&__pyx_n_s__alpha,&__pyx_n_s__rho,&__pyx_n_s__X,&__pyx_n_s__Y,&__pyx_n_s__n_iter,&__pyx_n_s__fit_intercept,&__pyx_n_s__verbose,&__pyx_n_s__shuffle,&__pyx_n_s__seed,&__pyx_n_s__weight_pos,&__pyx_n_s__weight_neg,&__pyx_n_s__sample_weight,&__pyx_n_s__learning_rate,&__pyx_n_s__eta0,&__pyx_n_s__power_t,0};
   __Pyx_RefNannySetupContext("plain_sgd");
   __pyx_self = __pyx_self;
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[19] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
-        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
-        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
-        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
-        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
-        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
-        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
-        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
-        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
-        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
-        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
-        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
-        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
+      case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
+      case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
+      case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
+      case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
+      case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
+      case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
+      case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+      case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+      case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+      case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+      case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+      case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+      case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+      case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+      case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+      case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
-        if (likely(values[2])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
-        if (likely(values[3])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  4:
-        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
-        if (likely(values[4])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  5:
-        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
-        if (likely(values[5])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  6:
-        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X);
-        if (likely(values[6])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  7:
-        values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
-        if (likely(values[7])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  8:
-        values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
-        if (likely(values[8])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  9:
-        values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
-        if (likely(values[9])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 10:
-        values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
-        if (likely(values[10])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 11:
-        values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
-        if (likely(values[11])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 12:
-        values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed);
-        if (likely(values[12])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 13:
-        values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos);
-        if (likely(values[13])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 14:
-        values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg);
-        if (likely(values[14])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 15:
-        values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_weight);
-        if (likely(values[15])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 16:
-        values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate);
-        if (likely(values[16])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 17:
-        values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0);
-        if (likely(values[17])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 18:
-        values[18] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t);
-        if (likely(values[18])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 18); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+      case  2:
+      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
+      if (likely(values[2])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      case  3:
+      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
+      if (likely(values[3])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  4:
+      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
+      if (likely(values[4])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  5:
+      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
+      if (likely(values[5])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  6:
+      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X);
+      if (likely(values[6])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  7:
+      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
+      if (likely(values[7])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  8:
+      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
+      if (likely(values[8])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  9:
+      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
+      if (likely(values[9])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 10:
+      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
+      if (likely(values[10])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 11:
+      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
+      if (likely(values[11])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 12:
+      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed);
+      if (likely(values[12])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 13:
+      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos);
+      if (likely(values[13])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 14:
+      values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg);
+      if (likely(values[14])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 15:
+      values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_weight);
+      if (likely(values[15])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 16:
+      values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate);
+      if (likely(values[16])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 17:
+      values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0);
+      if (likely(values[17])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 18:
+      values[18] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t);
+      if (likely(values[18])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 19, 19, 18); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      __pyx_v_w = ((PyArrayObject *)values[0]);
-      __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)values[2]);
-      __pyx_v_penalty_type = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_rho = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_X = ((PyArrayObject *)values[6]);
-      __pyx_v_Y = ((PyArrayObject *)values[7]);
-      __pyx_v_n_iter = __Pyx_PyInt_AsInt(values[8]); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(values[9]); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_verbose = __Pyx_PyInt_AsInt(values[10]); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_shuffle = __Pyx_PyInt_AsInt(values[11]); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_seed = __Pyx_PyInt_AsInt(values[12]); if (unlikely((__pyx_v_seed == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_sample_weight = ((PyArrayObject *)values[15]);
-      __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[16]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[17]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[18]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 19) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
-      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
-      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
-      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
-      values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
-      values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
-      values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
-      values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
-      values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
-      values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
-      values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
-      values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
-      values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_w = ((PyArrayObject *)values[0]);
     __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -5131,6 +4897,28 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[16]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[17]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[18]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 19) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_w = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 0));
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)PyTuple_GET_ITEM(__pyx_args, 2));
+    __pyx_v_penalty_type = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 3)); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_alpha = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 4)); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_rho = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 5)); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_X = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 6));
+    __pyx_v_Y = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 7));
+    __pyx_v_n_iter = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 8)); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 9)); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_verbose = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 10)); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_shuffle = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 11)); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_seed = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 12)); if (unlikely((__pyx_v_seed == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 13)); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 14)); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_sample_weight = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 15));
+    __pyx_v_learning_rate = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 16)); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_eta0 = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 17)); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_power_t = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 18)); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -5141,30 +4929,12 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __pyx_pybuffer_index.pybuffer.buf = NULL;
-  __pyx_pybuffer_index.refcount = 0;
-  __pyx_pybuffernd_index.data = NULL;
-  __pyx_pybuffernd_index.rcbuffer = &__pyx_pybuffer_index;
-  __pyx_pybuffer_q.pybuffer.buf = NULL;
-  __pyx_pybuffer_q.refcount = 0;
-  __pyx_pybuffernd_q.data = NULL;
-  __pyx_pybuffernd_q.rcbuffer = &__pyx_pybuffer_q;
-  __pyx_pybuffer_w.pybuffer.buf = NULL;
-  __pyx_pybuffer_w.refcount = 0;
-  __pyx_pybuffernd_w.data = NULL;
-  __pyx_pybuffernd_w.rcbuffer = &__pyx_pybuffer_w;
-  __pyx_pybuffer_X.pybuffer.buf = NULL;
-  __pyx_pybuffer_X.refcount = 0;
-  __pyx_pybuffernd_X.data = NULL;
-  __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X;
-  __pyx_pybuffer_Y.pybuffer.buf = NULL;
-  __pyx_pybuffer_Y.refcount = 0;
-  __pyx_pybuffernd_Y.data = NULL;
-  __pyx_pybuffernd_Y.rcbuffer = &__pyx_pybuffer_Y;
-  __pyx_pybuffer_sample_weight.pybuffer.buf = NULL;
-  __pyx_pybuffer_sample_weight.refcount = 0;
-  __pyx_pybuffernd_sample_weight.data = NULL;
-  __pyx_pybuffernd_sample_weight.rcbuffer = &__pyx_pybuffer_sample_weight;
+  __pyx_bstruct_index.buf = NULL;
+  __pyx_bstruct_q.buf = NULL;
+  __pyx_bstruct_w.buf = NULL;
+  __pyx_bstruct_X.buf = NULL;
+  __pyx_bstruct_Y.buf = NULL;
+  __pyx_bstruct_sample_weight.buf = NULL;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, "X", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -5172,24 +4942,28 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+  __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1];
+  __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_pybuffernd_Y.rcbuffer->pybuffer, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_Y, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_Y.diminfo[0].strides = __pyx_pybuffernd_Y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Y.diminfo[0].shape = __pyx_pybuffernd_Y.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
+  __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer, (PyObject*)__pyx_v_sample_weight, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_sample_weight, (PyObject*)__pyx_v_sample_weight, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_sample_weight.diminfo[0].strides = __pyx_pybuffernd_sample_weight.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sample_weight.diminfo[0].shape = __pyx_pybuffernd_sample_weight.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_sample_weight = __pyx_bstruct_sample_weight.strides[0];
+  __pyx_bshape_0_sample_weight = __pyx_bstruct_sample_weight.shape[0];
 
   /* "sklearn/linear_model/sgd_fast.pyx":286
  * 
@@ -5269,7 +5043,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -5290,7 +5064,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -5299,10 +5073,11 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_index.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
-      __pyx_v_index = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_index.rcbuffer->pybuffer.buf = NULL;
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_int32_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+      __pyx_v_index = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_index.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
+    } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
+      __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
   }
   __pyx_t_6 = 0;
@@ -5454,10 +5229,11 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __pyx_t_7 = ((PyArrayObject *)Py_None);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
-      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_q.rcbuffer->pybuffer.buf = NULL;
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_q.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];
+    } else {__pyx_bstride_0_q = __pyx_bstruct_q.strides[0];
+      __pyx_bshape_0_q = __pyx_bstruct_q.shape[0];
     }
   }
   __pyx_t_7 = 0;
@@ -5498,12 +5274,12 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     __pyx_t_5 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
     __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
@@ -5517,7 +5293,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -5526,18 +5302,19 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
-      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
+      __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
       if (unlikely(__pyx_t_9 < 0)) {
         PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
-        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
           Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
           __Pyx_RaiseBufferFallbackError();
         } else {
           PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
         }
       }
-      __pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];
+      __pyx_bstride_0_q = __pyx_bstruct_q.strides[0];
+      __pyx_bshape_0_q = __pyx_bstruct_q.shape[0];
       if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_t_7 = 0;
@@ -5562,20 +5339,68 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  *         q_data_ptr = <double *> q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
  * 
- *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ *     if penalty_type == L2:
  */
   __pyx_v_u = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":328
+  /* "sklearn/linear_model/sgd_fast.pyx":330
+ *     if penalty_type == L2:
+ *         rho = 1.0
+ *     elif penalty_type == L1:             # <<<<<<<<<<<<<<
+ *         rho = 0.0
+ * 
+ */
+  switch (__pyx_v_penalty_type) {
+
+    /* "sklearn/linear_model/sgd_fast.pyx":328
  *     cdef double u = 0.0
  * 
+ *     if penalty_type == L2:             # <<<<<<<<<<<<<<
+ *         rho = 1.0
+ *     elif penalty_type == L1:
+ */
+    case 2:
+
+    /* "sklearn/linear_model/sgd_fast.pyx":329
+ * 
+ *     if penalty_type == L2:
+ *         rho = 1.0             # <<<<<<<<<<<<<<
+ *     elif penalty_type == L1:
+ *         rho = 0.0
+ */
+    __pyx_v_rho = 1.0;
+    break;
+
+    /* "sklearn/linear_model/sgd_fast.pyx":330
+ *     if penalty_type == L2:
+ *         rho = 1.0
+ *     elif penalty_type == L1:             # <<<<<<<<<<<<<<
+ *         rho = 0.0
+ * 
+ */
+    case 1:
+
+    /* "sklearn/linear_model/sgd_fast.pyx":331
+ *         rho = 1.0
+ *     elif penalty_type == L1:
+ *         rho = 0.0             # <<<<<<<<<<<<<<
+ * 
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ */
+    __pyx_v_rho = 0.0;
+    break;
+  }
+
+  /* "sklearn/linear_model/sgd_fast.pyx":333
+ *         rho = 0.0
+ * 
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
  * 
  *     if learning_rate == OPTIMAL:
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "sklearn/linear_model/sgd_fast.pyx":330
+  /* "sklearn/linear_model/sgd_fast.pyx":335
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  * 
  *     if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -5585,7 +5410,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __pyx_t_8 = (__pyx_v_learning_rate == 2);
   if (__pyx_t_8) {
 
-    /* "sklearn/linear_model/sgd_fast.pyx":332
+    /* "sklearn/linear_model/sgd_fast.pyx":337
  *     if learning_rate == OPTIMAL:
  *         # computing eta0, the initial learning rate
  *         eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -5597,7 +5422,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   }
   /*else*/ {
 
-    /* "sklearn/linear_model/sgd_fast.pyx":334
+    /* "sklearn/linear_model/sgd_fast.pyx":339
  *         eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     else:
  *         eta = eta0             # <<<<<<<<<<<<<<
@@ -5608,7 +5433,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   }
   __pyx_L7:;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":336
+  /* "sklearn/linear_model/sgd_fast.pyx":341
  *         eta = eta0
  * 
  *     if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -5618,7 +5443,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __pyx_t_8 = (__pyx_v_learning_rate == 2);
   if (__pyx_t_8) {
 
-    /* "sklearn/linear_model/sgd_fast.pyx":338
+    /* "sklearn/linear_model/sgd_fast.pyx":343
  *     if learning_rate == OPTIMAL:
  *         # initialize t such that eta at first example equals eta0
  *         t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -5630,7 +5455,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   }
   /*else*/ {
 
-    /* "sklearn/linear_model/sgd_fast.pyx":340
+    /* "sklearn/linear_model/sgd_fast.pyx":345
  *         t = 1.0 / (eta0 * alpha)
  *     else:
  *         t = 1.0             # <<<<<<<<<<<<<<
@@ -5641,22 +5466,22 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   }
   __pyx_L8:;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":342
+  /* "sklearn/linear_model/sgd_fast.pyx":347
  *         t = 1.0
  * 
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:
  */
-  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_v_t_start = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":343
+  /* "sklearn/linear_model/sgd_fast.pyx":348
  * 
  *     t_start = time()
  *     for epoch in xrange(n_iter):             # <<<<<<<<<<<<<<
@@ -5667,7 +5492,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {
     __pyx_v_epoch = __pyx_t_13;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":344
+    /* "sklearn/linear_model/sgd_fast.pyx":349
  *     t_start = time()
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -5677,25 +5502,25 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":345
+      /* "sklearn/linear_model/sgd_fast.pyx":350
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)
  */
-      __pyx_t_3 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 345; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       goto __pyx_L11;
     }
     __pyx_L11:;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":346
+    /* "sklearn/linear_model/sgd_fast.pyx":351
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
@@ -5704,41 +5529,41 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
     if (__pyx_v_shuffle) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":347
+      /* "sklearn/linear_model/sgd_fast.pyx":352
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)             # <<<<<<<<<<<<<<
  *         for i in xrange(n_samples):
  *             sample_idx = index_data_ptr[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__RandomState); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__RandomState); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_seed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_seed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_v_index));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_index));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_index));
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -5747,7 +5572,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     }
     __pyx_L12:;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":348
+    /* "sklearn/linear_model/sgd_fast.pyx":353
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)
  *         for i in xrange(n_samples):             # <<<<<<<<<<<<<<
@@ -5758,7 +5583,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
       __pyx_v_i = __pyx_t_15;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":349
+      /* "sklearn/linear_model/sgd_fast.pyx":354
  *             np.random.RandomState(seed).shuffle(index)
  *         for i in xrange(n_samples):
  *             sample_idx = index_data_ptr[i]             # <<<<<<<<<<<<<<
@@ -5767,7 +5592,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_sample_idx = (__pyx_v_index_data_ptr[__pyx_v_i]);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":352
+      /* "sklearn/linear_model/sgd_fast.pyx":357
  * 
  *             # row offset in elem
  *             offset = sample_idx * stride             # <<<<<<<<<<<<<<
@@ -5776,7 +5601,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_offset = (__pyx_v_sample_idx * __pyx_v_stride);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":353
+      /* "sklearn/linear_model/sgd_fast.pyx":358
  *             # row offset in elem
  *             offset = sample_idx * stride
  *             y = Y_data_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -5785,7 +5610,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_y = (__pyx_v_Y_data_ptr[__pyx_v_sample_idx]);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":356
+      /* "sklearn/linear_model/sgd_fast.pyx":361
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<
@@ -5794,7 +5619,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       switch (__pyx_v_learning_rate) {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":354
+        /* "sklearn/linear_model/sgd_fast.pyx":359
  *             offset = sample_idx * stride
  *             y = Y_data_ptr[sample_idx]
  *             if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -5803,7 +5628,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
         case 2:
 
-        /* "sklearn/linear_model/sgd_fast.pyx":355
+        /* "sklearn/linear_model/sgd_fast.pyx":360
  *             y = Y_data_ptr[sample_idx]
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5813,7 +5638,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
         break;
 
-        /* "sklearn/linear_model/sgd_fast.pyx":356
+        /* "sklearn/linear_model/sgd_fast.pyx":361
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<
@@ -5822,7 +5647,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
         case 3:
 
-        /* "sklearn/linear_model/sgd_fast.pyx":357
+        /* "sklearn/linear_model/sgd_fast.pyx":362
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:
  *                 eta = eta0 / pow(t, power_t)             # <<<<<<<<<<<<<<
@@ -5833,7 +5658,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         break;
       }
 
-      /* "sklearn/linear_model/sgd_fast.pyx":359
+      /* "sklearn/linear_model/sgd_fast.pyx":364
  *                 eta = eta0 / pow(t, power_t)
  *             p = (dot(w_data_ptr, X_data_ptr, offset, n_features) * wscale
  *                 ) + intercept             # <<<<<<<<<<<<<<
@@ -5842,7 +5667,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_p = ((__pyx_f_7sklearn_12linear_model_8sgd_fast_dot(__pyx_v_w_data_ptr, __pyx_v_X_data_ptr, __pyx_v_offset, __pyx_v_n_features) * __pyx_v_wscale) + __pyx_v_intercept);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":360
+      /* "sklearn/linear_model/sgd_fast.pyx":365
  *             p = (dot(w_data_ptr, X_data_ptr, offset, n_features) * wscale
  *                 ) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -5851,7 +5676,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_sumloss = (__pyx_v_sumloss + ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "sklearn/linear_model/sgd_fast.pyx":361
+      /* "sklearn/linear_model/sgd_fast.pyx":366
  *                 ) + intercept
  *             sumloss += loss.loss(p, y)
  *             if y > 0:             # <<<<<<<<<<<<<<
@@ -5861,7 +5686,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       __pyx_t_8 = (__pyx_v_y > 0.0);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":362
+        /* "sklearn/linear_model/sgd_fast.pyx":367
  *             sumloss += loss.loss(p, y)
  *             if y > 0:
  *                 class_weight = weight_pos             # <<<<<<<<<<<<<<
@@ -5873,7 +5698,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       }
       /*else*/ {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":364
+        /* "sklearn/linear_model/sgd_fast.pyx":369
  *                 class_weight = weight_pos
  *             else:
  *                 class_weight = weight_neg             # <<<<<<<<<<<<<<
@@ -5884,7 +5709,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       }
       __pyx_L15:;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":366
+      /* "sklearn/linear_model/sgd_fast.pyx":371
  *                 class_weight = weight_neg
  *             update = eta * loss.dloss(p, y) * class_weight * \
  *                 sample_weight_data[sample_idx]             # <<<<<<<<<<<<<<
@@ -5893,7 +5718,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_update = (((__pyx_v_eta * ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0)) * __pyx_v_class_weight) * (__pyx_v_sample_weight_data[__pyx_v_sample_idx]));
 
-      /* "sklearn/linear_model/sgd_fast.pyx":367
+      /* "sklearn/linear_model/sgd_fast.pyx":372
  *             update = eta * loss.dloss(p, y) * class_weight * \
  *                 sample_weight_data[sample_idx]
  *             if update != 0.0:             # <<<<<<<<<<<<<<
@@ -5903,7 +5728,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       __pyx_t_8 = (__pyx_v_update != 0.0);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":368
+        /* "sklearn/linear_model/sgd_fast.pyx":373
  *                 sample_weight_data[sample_idx]
  *             if update != 0.0:
  *                 add(w_data_ptr, wscale, X_data_ptr, offset, n_features, -update)             # <<<<<<<<<<<<<<
@@ -5912,7 +5737,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
         __pyx_f_7sklearn_12linear_model_8sgd_fast_add(__pyx_v_w_data_ptr, __pyx_v_wscale, __pyx_v_X_data_ptr, __pyx_v_offset, __pyx_v_n_features, (-__pyx_v_update));
 
-        /* "sklearn/linear_model/sgd_fast.pyx":369
+        /* "sklearn/linear_model/sgd_fast.pyx":374
  *             if update != 0.0:
  *                 add(w_data_ptr, wscale, X_data_ptr, offset, n_features, -update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
@@ -5922,7 +5747,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         __pyx_t_8 = (__pyx_v_fit_intercept == 1);
         if (__pyx_t_8) {
 
-          /* "sklearn/linear_model/sgd_fast.pyx":370
+          /* "sklearn/linear_model/sgd_fast.pyx":375
  *                 add(w_data_ptr, wscale, X_data_ptr, offset, n_features, -update)
  *                 if fit_intercept == 1:
  *                     intercept -= update             # <<<<<<<<<<<<<<
@@ -5937,7 +5762,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       }
       __pyx_L16:;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":371
+      /* "sklearn/linear_model/sgd_fast.pyx":376
  *                 if fit_intercept == 1:
  *                     intercept -= update
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
@@ -5947,7 +5772,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       __pyx_t_8 = (__pyx_v_penalty_type != 1);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":372
+        /* "sklearn/linear_model/sgd_fast.pyx":377
  *                     intercept -= update
  *             if penalty_type != L1:
  *                 wscale *= (1.0 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
@@ -5956,7 +5781,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
         __pyx_v_wscale = (__pyx_v_wscale * (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha)));
 
-        /* "sklearn/linear_model/sgd_fast.pyx":373
+        /* "sklearn/linear_model/sgd_fast.pyx":378
  *             if penalty_type != L1:
  *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
@@ -5966,42 +5791,43 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         __pyx_t_8 = (__pyx_v_wscale < 1e-9);
         if (__pyx_t_8) {
 
-          /* "sklearn/linear_model/sgd_fast.pyx":374
+          /* "sklearn/linear_model/sgd_fast.pyx":379
  *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-          __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_16 = ((PyArrayObject *)__pyx_t_3);
           {
             __Pyx_BufFmt_StackElem __pyx_stack[1];
-            __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
-            __pyx_t_17 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
+            __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+            __pyx_t_17 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
             if (unlikely(__pyx_t_17 < 0)) {
               PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10);
-              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
                 Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10);
                 __Pyx_RaiseBufferFallbackError();
               } else {
                 PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10);
               }
             }
-            __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
-            if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+            __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
+            if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_t_16 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
           __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "sklearn/linear_model/sgd_fast.pyx":375
+          /* "sklearn/linear_model/sgd_fast.pyx":380
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
@@ -6016,7 +5842,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       }
       __pyx_L18:;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":376
+      /* "sklearn/linear_model/sgd_fast.pyx":381
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -6027,7 +5853,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         case 1:
         case 3:
 
-        /* "sklearn/linear_model/sgd_fast.pyx":377
+        /* "sklearn/linear_model/sgd_fast.pyx":382
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
@@ -6036,7 +5862,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
         __pyx_v_u = (__pyx_v_u + (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "sklearn/linear_model/sgd_fast.pyx":378
+        /* "sklearn/linear_model/sgd_fast.pyx":383
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1.0 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr, n_features, u)             # <<<<<<<<<<<<<<
@@ -6047,7 +5873,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
         break;
       }
 
-      /* "sklearn/linear_model/sgd_fast.pyx":379
+      /* "sklearn/linear_model/sgd_fast.pyx":384
  *                 u += ((1.0 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr, n_features, u)
  *             t += 1             # <<<<<<<<<<<<<<
@@ -6056,7 +5882,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  */
       __pyx_v_t = (__pyx_v_t + 1.0);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":380
+      /* "sklearn/linear_model/sgd_fast.pyx":385
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr, n_features, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
@@ -6066,7 +5892,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       __pyx_v_count = (__pyx_v_count + 1);
     }
 
-    /* "sklearn/linear_model/sgd_fast.pyx":383
+    /* "sklearn/linear_model/sgd_fast.pyx":388
  * 
  *         # report epoch information
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -6076,101 +5902,101 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":384
+      /* "sklearn/linear_model/sgd_fast.pyx":389
  *         # report epoch information
  *         if verbose > 0:
  *             wnorm = sqrt(np.dot(w, w) * wscale * wscale)             # <<<<<<<<<<<<<<
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyNumber_Multiply(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Multiply(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":386
+      /* "sklearn/linear_model/sgd_fast.pyx":391
  *             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,             # <<<<<<<<<<<<<<
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,
  */
-      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":387
+      /* "sklearn/linear_model/sgd_fast.pyx":392
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  *                                                     w.nonzero()[0].shape[0],             # <<<<<<<<<<<<<<
  *                                                     intercept, count,
  *                                                     sumloss / count))
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":388
+      /* "sklearn/linear_model/sgd_fast.pyx":393
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,             # <<<<<<<<<<<<<<
  *                                                     sumloss / count))
  *             print("Total training time: %.2f seconds." % (time() - t_start))
  */
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
 
-      /* "sklearn/linear_model/sgd_fast.pyx":389
+      /* "sklearn/linear_model/sgd_fast.pyx":394
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,
  *                                                     sumloss / count))             # <<<<<<<<<<<<<<
  *             print("Total training time: %.2f seconds." % (time() - t_start))
  * 
  */
-      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_19));
       PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_3);
@@ -6186,165 +6012,165 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
       __pyx_t_4 = 0;
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_19)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_19)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":390
+      /* "sklearn/linear_model/sgd_fast.pyx":395
  *                                                     intercept, count,
  *                                                     sumloss / count))
  *             print("Total training time: %.2f seconds." % (time() - t_start))             # <<<<<<<<<<<<<<
  * 
  *         # floating-point under-/overflow check.
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_19 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_2); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_2); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_19));
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_19)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_19)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
       goto __pyx_L20;
     }
     __pyx_L20:;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":393
+    /* "sklearn/linear_model/sgd_fast.pyx":398
  * 
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \             # <<<<<<<<<<<<<<
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")
  */
-    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_19));
     __Pyx_INCREF(((PyObject *)__pyx_v_w));
     PyTuple_SET_ITEM(__pyx_t_19, 0, ((PyObject *)__pyx_v_w));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_19));
     PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":394
+      /* "sklearn/linear_model/sgd_fast.pyx":399
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "sklearn/linear_model/sgd_fast.pyx":393
+      /* "sklearn/linear_model/sgd_fast.pyx":398
  * 
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \             # <<<<<<<<<<<<<<
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_20) {
 
-        /* "sklearn/linear_model/sgd_fast.pyx":394
+        /* "sklearn/linear_model/sgd_fast.pyx":399
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  */
-        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_19);
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_19));
         PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         if (!__pyx_t_21) {
-          __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_19 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_19 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_4));
           PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __pyx_t_23 = __pyx_t_22;
         } else {
@@ -6360,59 +6186,60 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
     }
     if (__pyx_t_20) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":395
+      /* "sklearn/linear_model/sgd_fast.pyx":400
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L21;
     }
     __pyx_L21:;
   }
 
-  /* "sklearn/linear_model/sgd_fast.pyx":397
+  /* "sklearn/linear_model/sgd_fast.pyx":402
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_16 = ((PyArrayObject *)__pyx_t_4);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
     if (unlikely(__pyx_t_9 < 0)) {
       PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
-      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
         Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
         __Pyx_RaiseBufferFallbackError();
       } else {
         PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
       }
     }
-    __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
-    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+    __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_16 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
   __pyx_v_w = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":398
+  /* "sklearn/linear_model/sgd_fast.pyx":403
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -6420,10 +6247,10 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_w));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
@@ -6445,23 +6272,23 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   __Pyx_XDECREF(__pyx_t_19);
   { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
     __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_index.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_sample_weight);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_Y);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
   __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.plain_sgd", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_index.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_sample_weight);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_Y);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
   __pyx_L2:;
   __Pyx_XDECREF((PyObject *)__pyx_v_index);
   __Pyx_XDECREF((PyObject *)__pyx_v_q);
@@ -6472,7 +6299,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(PyObject *
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast.pyx":401
+/* "sklearn/linear_model/sgd_fast.pyx":406
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -6486,7 +6313,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("max");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":402
+  /* "sklearn/linear_model/sgd_fast.pyx":407
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
@@ -6507,7 +6334,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast.pyx":405
+/* "sklearn/linear_model/sgd_fast.pyx":410
  * 
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
@@ -6521,7 +6348,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("min");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":406
+  /* "sklearn/linear_model/sgd_fast.pyx":411
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
@@ -6542,7 +6369,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast.pyx":409
+/* "sklearn/linear_model/sgd_fast.pyx":414
  * 
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr,             # <<<<<<<<<<<<<<
@@ -6559,7 +6386,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *__pyx_v_w_da
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("dot");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":411
+  /* "sklearn/linear_model/sgd_fast.pyx":416
  * cdef double dot(double *w_data_ptr, double *X_data_ptr,
  *                 unsigned int offset, unsigned int n_features):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -6568,7 +6395,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *__pyx_v_w_da
  */
   __pyx_v_sum = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":413
+  /* "sklearn/linear_model/sgd_fast.pyx":418
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j in xrange(n_features):             # <<<<<<<<<<<<<<
@@ -6579,7 +6406,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *__pyx_v_w_da
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":414
+    /* "sklearn/linear_model/sgd_fast.pyx":419
  *     cdef int j
  *     for j in xrange(n_features):
  *         sum += w_data_ptr[j] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -6589,7 +6416,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *__pyx_v_w_da
     __pyx_v_sum = (__pyx_v_sum + ((__pyx_v_w_data_ptr[__pyx_v_j]) * (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)])));
   }
 
-  /* "sklearn/linear_model/sgd_fast.pyx":415
+  /* "sklearn/linear_model/sgd_fast.pyx":420
  *     for j in xrange(n_features):
  *         sum += w_data_ptr[j] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
@@ -6605,7 +6432,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_dot(double *__pyx_v_w_da
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast.pyx":418
+/* "sklearn/linear_model/sgd_fast.pyx":423
  * 
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
@@ -6625,7 +6452,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
   unsigned int __pyx_t_3;
   __Pyx_RefNannySetupContext("add");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":423
+  /* "sklearn/linear_model/sgd_fast.pyx":428
  *     cdef unsigned j
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -6634,7 +6461,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":424
+  /* "sklearn/linear_model/sgd_fast.pyx":429
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -6643,7 +6470,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":425
+  /* "sklearn/linear_model/sgd_fast.pyx":430
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j in xrange(n_features):             # <<<<<<<<<<<<<<
@@ -6654,7 +6481,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":426
+    /* "sklearn/linear_model/sgd_fast.pyx":431
  *     cdef double xsqnorm = 0.0
  *     for j in xrange(n_features):
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -6663,7 +6490,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "sklearn/linear_model/sgd_fast.pyx":427
+    /* "sklearn/linear_model/sgd_fast.pyx":432
  *     for j in xrange(n_features):
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[j] * val)             # <<<<<<<<<<<<<<
@@ -6672,7 +6499,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
  */
     __pyx_v_innerprod = (__pyx_v_innerprod + ((__pyx_v_w_data_ptr[__pyx_v_j]) * __pyx_v_val));
 
-    /* "sklearn/linear_model/sgd_fast.pyx":428
+    /* "sklearn/linear_model/sgd_fast.pyx":433
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[j] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -6681,7 +6508,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
  */
     __pyx_v_xsqnorm = (__pyx_v_xsqnorm + (__pyx_v_val * __pyx_v_val));
 
-    /* "sklearn/linear_model/sgd_fast.pyx":429
+    /* "sklearn/linear_model/sgd_fast.pyx":434
  *         innerprod += (w_data_ptr[j] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[j] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -6692,7 +6519,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
     (__pyx_v_w_data_ptr[__pyx_t_3]) = ((__pyx_v_w_data_ptr[__pyx_t_3]) + (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale)));
   }
 
-  /* "sklearn/linear_model/sgd_fast.pyx":432
+  /* "sklearn/linear_model/sgd_fast.pyx":437
  * 
  *     # TODO this is needed for PEGASOS only
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
@@ -6708,7 +6535,7 @@ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_add(double *__pyx_v_w_da
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast.pyx":435
+/* "sklearn/linear_model/sgd_fast.pyx":440
  * 
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
@@ -6726,7 +6553,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
   unsigned int __pyx_t_4;
   __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":445
+  /* "sklearn/linear_model/sgd_fast.pyx":450
  *     Empirical results look better this way...
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -6735,7 +6562,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
  */
   __pyx_v_z = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":446
+  /* "sklearn/linear_model/sgd_fast.pyx":451
  *     """
  *     cdef double z = 0.0
  *     cdef unsigned j = 0             # <<<<<<<<<<<<<<
@@ -6744,7 +6571,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
  */
   __pyx_v_j = 0;
 
-  /* "sklearn/linear_model/sgd_fast.pyx":447
+  /* "sklearn/linear_model/sgd_fast.pyx":452
  *     cdef double z = 0.0
  *     cdef unsigned j = 0
  *     for j in xrange(n_features):             # <<<<<<<<<<<<<<
@@ -6755,7 +6582,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":448
+    /* "sklearn/linear_model/sgd_fast.pyx":453
  *     cdef unsigned j = 0
  *     for j in xrange(n_features):
  *         z = w_data_ptr[j]             # <<<<<<<<<<<<<<
@@ -6764,7 +6591,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_j]);
 
-    /* "sklearn/linear_model/sgd_fast.pyx":449
+    /* "sklearn/linear_model/sgd_fast.pyx":454
  *     for j in xrange(n_features):
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0.0:             # <<<<<<<<<<<<<<
@@ -6774,7 +6601,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
     __pyx_t_3 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0.0);
     if (__pyx_t_3) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":450
+      /* "sklearn/linear_model/sgd_fast.pyx":455
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0.0:
  *             w_data_ptr[j] = max(0.0, w_data_ptr[j] - ((u + q_data_ptr[j])             # <<<<<<<<<<<<<<
@@ -6785,7 +6612,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
       goto __pyx_L5;
     }
 
-    /* "sklearn/linear_model/sgd_fast.pyx":452
+    /* "sklearn/linear_model/sgd_fast.pyx":457
  *             w_data_ptr[j] = max(0.0, w_data_ptr[j] - ((u + q_data_ptr[j])
  *                                                         / wscale))
  *         elif (wscale * w_data_ptr[j]) < 0.0:             # <<<<<<<<<<<<<<
@@ -6795,7 +6622,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
     __pyx_t_3 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0.0);
     if (__pyx_t_3) {
 
-      /* "sklearn/linear_model/sgd_fast.pyx":453
+      /* "sklearn/linear_model/sgd_fast.pyx":458
  *                                                         / wscale))
  *         elif (wscale * w_data_ptr[j]) < 0.0:
  *             w_data_ptr[j] = min(0.0, w_data_ptr[j] + ((u - q_data_ptr[j])             # <<<<<<<<<<<<<<
@@ -6807,7 +6634,7 @@ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(double *__pyx_v_
     }
     __pyx_L5:;
 
-    /* "sklearn/linear_model/sgd_fast.pyx":455
+    /* "sklearn/linear_model/sgd_fast.pyx":460
  *             w_data_ptr[j] = min(0.0, w_data_ptr[j] + ((u - q_data_ptr[j])
  *                                                         / wscale))
  *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))             # <<<<<<<<<<<<<<
@@ -7519,7 +7346,7 @@ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_
       __Pyx_GOTREF(((PyObject *)__pyx_t_8));
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_8));
       __pyx_t_8 = 0;
@@ -8552,7 +8379,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(((PyObject *)__pyx_t_5));
         __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
         __pyx_t_5 = 0;
@@ -10148,9 +9975,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},
   {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0},
   {&__pyx_kp_u_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 1, 0, 0},
+  {&__pyx_n_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 1},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
-  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},
-  {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1},
   {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},
   {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0},
   {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},
@@ -10160,73 +9986,47 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},
   {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},
   {&__pyx_n_s__X, __pyx_k__X, sizeof(__pyx_k__X), 0, 0, 1, 1},
-  {&__pyx_n_s__X_data_ptr, __pyx_k__X_data_ptr, sizeof(__pyx_k__X_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__Y, __pyx_k__Y, sizeof(__pyx_k__Y), 0, 0, 1, 1},
-  {&__pyx_n_s__Y_data_ptr, __pyx_k__Y_data_ptr, sizeof(__pyx_k__Y_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
   {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
   {&__pyx_n_s__alpha, __pyx_k__alpha, sizeof(__pyx_k__alpha), 0, 0, 1, 1},
   {&__pyx_n_s__any, __pyx_k__any, sizeof(__pyx_k__any), 0, 0, 1, 1},
   {&__pyx_n_s__arange, __pyx_k__arange, sizeof(__pyx_k__arange), 0, 0, 1, 1},
   {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},
-  {&__pyx_n_s__class_weight, __pyx_k__class_weight, sizeof(__pyx_k__class_weight), 0, 0, 1, 1},
-  {&__pyx_n_s__count, __pyx_k__count, sizeof(__pyx_k__count), 0, 0, 1, 1},
   {&__pyx_n_s__dloss, __pyx_k__dloss, sizeof(__pyx_k__dloss), 0, 0, 1, 1},
   {&__pyx_n_s__dot, __pyx_k__dot, sizeof(__pyx_k__dot), 0, 0, 1, 1},
   {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1},
-  {&__pyx_n_s__epoch, __pyx_k__epoch, sizeof(__pyx_k__epoch), 0, 0, 1, 1},
-  {&__pyx_n_s__eta, __pyx_k__eta, sizeof(__pyx_k__eta), 0, 0, 1, 1},
   {&__pyx_n_s__eta0, __pyx_k__eta0, sizeof(__pyx_k__eta0), 0, 0, 1, 1},
   {&__pyx_n_s__fit_intercept, __pyx_k__fit_intercept, sizeof(__pyx_k__fit_intercept), 0, 0, 1, 1},
   {&__pyx_n_s__float64, __pyx_k__float64, sizeof(__pyx_k__float64), 0, 0, 1, 1},
-  {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},
-  {&__pyx_n_s__index, __pyx_k__index, sizeof(__pyx_k__index), 0, 0, 1, 1},
-  {&__pyx_n_s__index_data_ptr, __pyx_k__index_data_ptr, sizeof(__pyx_k__index_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__int32, __pyx_k__int32, sizeof(__pyx_k__int32), 0, 0, 1, 1},
   {&__pyx_n_s__intercept, __pyx_k__intercept, sizeof(__pyx_k__intercept), 0, 0, 1, 1},
   {&__pyx_n_s__isinf, __pyx_k__isinf, sizeof(__pyx_k__isinf), 0, 0, 1, 1},
   {&__pyx_n_s__isnan, __pyx_k__isnan, sizeof(__pyx_k__isnan), 0, 0, 1, 1},
   {&__pyx_n_s__learning_rate, __pyx_k__learning_rate, sizeof(__pyx_k__learning_rate), 0, 0, 1, 1},
   {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 0, 0, 1, 1},
-  {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1},
   {&__pyx_n_s__n_iter, __pyx_k__n_iter, sizeof(__pyx_k__n_iter), 0, 0, 1, 1},
-  {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1},
   {&__pyx_n_s__nonzero, __pyx_k__nonzero, sizeof(__pyx_k__nonzero), 0, 0, 1, 1},
   {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},
   {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},
-  {&__pyx_n_s__offset, __pyx_k__offset, sizeof(__pyx_k__offset), 0, 0, 1, 1},
   {&__pyx_n_s__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1},
   {&__pyx_n_s__p, __pyx_k__p, sizeof(__pyx_k__p), 0, 0, 1, 1},
   {&__pyx_n_s__penalty_type, __pyx_k__penalty_type, sizeof(__pyx_k__penalty_type), 0, 0, 1, 1},
   {&__pyx_n_s__plain_sgd, __pyx_k__plain_sgd, sizeof(__pyx_k__plain_sgd), 0, 0, 1, 1},
   {&__pyx_n_s__power_t, __pyx_k__power_t, sizeof(__pyx_k__power_t), 0, 0, 1, 1},
-  {&__pyx_n_s__q, __pyx_k__q, sizeof(__pyx_k__q), 0, 0, 1, 1},
-  {&__pyx_n_s__q_data_ptr, __pyx_k__q_data_ptr, sizeof(__pyx_k__q_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__random, __pyx_k__random, sizeof(__pyx_k__random), 0, 0, 1, 1},
   {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},
   {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 0, 0, 1, 1},
-  {&__pyx_n_s__sample_idx, __pyx_k__sample_idx, sizeof(__pyx_k__sample_idx), 0, 0, 1, 1},
   {&__pyx_n_s__sample_weight, __pyx_k__sample_weight, sizeof(__pyx_k__sample_weight), 0, 0, 1, 1},
-  {&__pyx_n_s__sample_weight_data, __pyx_k__sample_weight_data, sizeof(__pyx_k__sample_weight_data), 0, 0, 1, 1},
   {&__pyx_n_s__seed, __pyx_k__seed, sizeof(__pyx_k__seed), 0, 0, 1, 1},
   {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},
   {&__pyx_n_s__shuffle, __pyx_k__shuffle, sizeof(__pyx_k__shuffle), 0, 0, 1, 1},
-  {&__pyx_n_s__stride, __pyx_k__stride, sizeof(__pyx_k__stride), 0, 0, 1, 1},
-  {&__pyx_n_s__sumloss, __pyx_k__sumloss, sizeof(__pyx_k__sumloss), 0, 0, 1, 1},
   {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},
-  {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1},
-  {&__pyx_n_s__t_start, __pyx_k__t_start, sizeof(__pyx_k__t_start), 0, 0, 1, 1},
   {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},
-  {&__pyx_n_s__typw, __pyx_k__typw, sizeof(__pyx_k__typw), 0, 0, 1, 1},
-  {&__pyx_n_s__u, __pyx_k__u, sizeof(__pyx_k__u), 0, 0, 1, 1},
-  {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1},
   {&__pyx_n_s__verbose, __pyx_k__verbose, sizeof(__pyx_k__verbose), 0, 0, 1, 1},
   {&__pyx_n_s__w, __pyx_k__w, sizeof(__pyx_k__w), 0, 0, 1, 1},
-  {&__pyx_n_s__w_data_ptr, __pyx_k__w_data_ptr, sizeof(__pyx_k__w_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__weight_neg, __pyx_k__weight_neg, sizeof(__pyx_k__weight_neg), 0, 0, 1, 1},
   {&__pyx_n_s__weight_pos, __pyx_k__weight_pos, sizeof(__pyx_k__weight_pos), 0, 0, 1, 1},
-  {&__pyx_n_s__wnorm, __pyx_k__wnorm, sizeof(__pyx_k__wnorm), 0, 0, 1, 1},
-  {&__pyx_n_s__wscale, __pyx_k__wscale, sizeof(__pyx_k__wscale), 0, 0, 1, 1},
   {&__pyx_n_s__xrange, __pyx_k__xrange, sizeof(__pyx_k__xrange), 0, 0, 1, 1},
   {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1},
   {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1},
@@ -10235,11 +10035,11 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
 static int __Pyx_InitCachedBuiltins(void) {
   __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #if PY_MAJOR_VERSION >= 3
-  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #else
-  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
-  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
@@ -10251,15 +10051,15 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
 
-  /* "sklearn/linear_model/sgd_fast.pyx":395
+  /* "sklearn/linear_model/sgd_fast.pyx":400
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_5);
+  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_5));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
   PyTuple_SET_ITEM(__pyx_k_tuple_5, 0, ((PyObject *)__pyx_kp_s_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
@@ -10273,7 +10073,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
   __pyx_k_tuple_7 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_7);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
   PyTuple_SET_ITEM(__pyx_k_tuple_7, 0, ((PyObject *)__pyx_kp_u_6));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
@@ -10287,7 +10087,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             info.buf = PyArray_DATA(self)
  */
   __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_9);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_9));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_8));
   PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8));
@@ -10301,7 +10101,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 elif t == NPY_UBYTE:       f = "B"
  */
   __pyx_k_tuple_11 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, ((PyObject *)__pyx_kp_u_10));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
@@ -10315,7 +10115,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if ((child.byteorder == '>' and little_endian) or
  */
   __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_14);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_14));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_13));
   PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_13));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13));
@@ -10329,7 +10129,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             # complain instead, BUT: < and > in format strings also imply
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_15);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_u_10));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
@@ -10343,164 +10143,11 @@ static int __Pyx_InitCachedConstants(void) {
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
   __pyx_k_tuple_17 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_17);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_16));
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_kp_u_16));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_16));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
-
-  /* "sklearn/linear_model/sgd_fast.pyx":214
- * @cython.wraparound(False)
- * @cython.cdivision(True)
- * def plain_sgd(np.ndarray[np.float64_t, ndim=1, mode='c'] w,             # <<<<<<<<<<<<<<
- *               double intercept,
- *               LossFunction loss,
- */
-  __pyx_k_tuple_18 = PyTuple_New(47); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_18);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__w));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__intercept));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__loss));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__loss));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__loss));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__penalty_type));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__penalty_type));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__penalty_type));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__alpha));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__alpha));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__alpha));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__rho));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__rho));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rho));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__X));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__Y));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__Y));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__Y));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_iter));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__n_iter));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_iter));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__fit_intercept));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__fit_intercept));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fit_intercept));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__verbose));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__verbose));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__verbose));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__shuffle));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__shuffle));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__shuffle));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__seed));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__seed));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__seed));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_pos));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__weight_pos));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_pos));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_neg));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__weight_neg));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_neg));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__sample_weight));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__learning_rate));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__learning_rate));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__learning_rate));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta0));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__eta0));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta0));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__power_t));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__power_t));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__power_t));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__n_samples));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_features));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__n_features));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_features));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__stride));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__stride));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__stride));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__w_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__w_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__X_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__Y_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__Y_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__Y_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight_data));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__sample_weight_data));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight_data));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__index));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__index));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__index));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__index_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__index_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__index_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__offset));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 28, ((PyObject *)__pyx_n_s__offset));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__offset));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__wscale));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 29, ((PyObject *)__pyx_n_s__wscale));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wscale));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 30, ((PyObject *)__pyx_n_s__eta));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__p));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 31, ((PyObject *)__pyx_n_s__p));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__p));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__update));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 32, ((PyObject *)__pyx_n_s__update));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__update));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sumloss));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 33, ((PyObject *)__pyx_n_s__sumloss));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sumloss));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__wnorm));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 34, ((PyObject *)__pyx_n_s__wnorm));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wnorm));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__t));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 35, ((PyObject *)__pyx_n_s__t));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__y));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 36, ((PyObject *)__pyx_n_s__y));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__class_weight));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 37, ((PyObject *)__pyx_n_s__class_weight));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__class_weight));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__count));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 38, ((PyObject *)__pyx_n_s__count));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__count));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__epoch));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 39, ((PyObject *)__pyx_n_s__epoch));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__epoch));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 40, ((PyObject *)__pyx_n_s__i));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_idx));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 41, ((PyObject *)__pyx_n_s__sample_idx));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_idx));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__q));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 42, ((PyObject *)__pyx_n_s__q));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__q_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 43, ((PyObject *)__pyx_n_s__q_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__u));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 44, ((PyObject *)__pyx_n_s__u));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__u));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__typw));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 45, ((PyObject *)__pyx_n_s__typw));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__typw));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__t_start));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 46, ((PyObject *)__pyx_n_s__t_start));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t_start));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18));
-  __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(19, 0, 47, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__plain_sgd, 214, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -10540,8 +10187,8 @@ PyMODINIT_FUNC PyInit_sgd_fast(void)
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __pyx_binding_PyCFunctionType_USED
+  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -10688,18 +10335,14 @@ PyMODINIT_FUNC PyInit_sgd_fast(void)
  * cimport numpy as np
  */
   __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__time));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__time));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__time));
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__time);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__time, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -10712,7 +10355,7 @@ PyMODINIT_FUNC PyInit_sgd_fast(void)
  *               double intercept,
  *               LossFunction loss,
  */
-  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_8sgd_fast_plain_sgd, NULL, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_8sgd_fast_plain_sgd, NULL, __pyx_n_s_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__plain_sgd, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -11084,11 +10727,22 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
         name, type->tp_name, Py_TYPE(obj)->tp_name);
     return 0;
 }
+
 static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
   unsigned int n = 1;
   return *(unsigned char*)(&n) != 0;
 }
 
+typedef struct {
+  __Pyx_StructField root;
+  __Pyx_BufFmt_StackElem* head;
+  size_t fmt_offset;
+  size_t new_count, enc_count;
+  int is_complex;
+  char enc_type;
+  char new_packmode;
+  char enc_packmode;
+} __Pyx_BufFmt_Context;
 
 static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
                               __Pyx_BufFmt_StackElem* stack,
@@ -11243,7 +10897,6 @@ static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {
   }
 }
 
-
 static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {
   if (ctx->head == NULL || ctx->head->field == &ctx->root) {
     const char* expected;
@@ -11463,7 +11116,7 @@ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const cha
                          "Does not understand character buffer dtype format string ('%c')", *ts);
             return NULL;
           }
-          ctx->new_count = (size_t)number;
+          ctx->new_count = (size_t)number; 
         }
     }
   }
@@ -11477,10 +11130,7 @@ static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
   buf->suboffsets = __Pyx_minusones;
 }
 
-static CYTHON_INLINE int __Pyx_GetBufferAndValidate(
-        Py_buffer* buf, PyObject* obj,  __Pyx_TypeInfo* dtype, int flags,
-        int nd, int cast, __Pyx_BufFmt_StackElem* stack)
-{
+static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) {
   if (obj == Py_None || obj == NULL) {
     __Pyx_ZeroBuffer(buf);
     return 0;
@@ -11518,8 +11168,6 @@ static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
   __Pyx_ReleaseBuffer(info);
 }
 
-
-
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
     if (unlikely(!type)) {
         PyErr_Format(PyExc_SystemError, "Missing type object");
@@ -11531,6 +11179,7 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
                  Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
+
 static void __Pyx_RaiseBufferFallbackError(void) {
   PyErr_Format(PyExc_ValueError,
      "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!");
@@ -11569,11 +11218,11 @@ static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
   if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags);
   #endif
   if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pf_5numpy_7ndarray___getbuffer__(obj, view, flags);
-        else {
-          PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name);
+  else {
+  PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name);
   return -1;
     }
-       }
+}
 
 static void __Pyx_ReleaseBuffer(Py_buffer *view) {
   PyObject* obj = view->obj;
@@ -11581,8 +11230,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
     #if PY_VERSION_HEX >= 0x02060000
     if (PyObject_CheckBuffer(obj)) {PyBuffer_Release(view); return;}
     #endif
-if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray_1__releasebuffer__(obj, view);
-    
+    if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray_1__releasebuffer__(obj, view);
     Py_DECREF(obj);
     view->obj = NULL;
   }
@@ -11638,15 +11286,6 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
-#if PY_MAJOR_VERSION < 3
-    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
-                 PyString_AsString(name));
-#else
-    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
-#endif
-}
-
 #if PY_MAJOR_VERSION < 3
 static PyObject *__Pyx_GetStdout(void) {
     PyObject *f = PySys_GetObject((char *)"stdout");
@@ -12492,7 +12131,11 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class
     py_module = __Pyx_ImportModule(module_name);
     if (!py_module)
         goto bad;
-    py_name = __Pyx_PyIdentifier_FromString(class_name);
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(class_name);
+    #else
+    py_name = PyUnicode_FromString(class_name);
+    #endif
     if (!py_name)
         goto bad;
     result = PyObject_GetAttr(py_module, py_name);
@@ -12538,7 +12181,11 @@ static PyObject *__Pyx_ImportModule(const char *name) {
     PyObject *py_name = 0;
     PyObject *py_module = 0;
 
-    py_name = __Pyx_PyIdentifier_FromString(name);
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(name);
+    #else
+    py_name = PyUnicode_FromString(name);
+    #endif
     if (!py_name)
         goto bad;
     py_module = PyImport_Import(py_name);
@@ -12585,9 +12232,11 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
     if (!py_funcname) goto bad;
     py_globals = PyModule_GetDict(__pyx_m);
     if (!py_globals) goto bad;
-    py_code = __Pyx_PyCode_New(
+    py_code = PyCode_New(
         0,            /*int argcount,*/
+        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
+        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
diff --git a/sklearn/linear_model/sgd_fast.pyx b/sklearn/linear_model/sgd_fast.pyx
index 1c023948e34cc8b94cab6009fba7720ded13d88d..15cc40b0c6133f4efc5d91e2d9323aff16ced1e1 100644
--- a/sklearn/linear_model/sgd_fast.pyx
+++ b/sklearn/linear_model/sgd_fast.pyx
@@ -325,6 +325,11 @@ def plain_sgd(np.ndarray[np.float64_t, ndim=1, mode='c'] w,
         q_data_ptr = <double *> q.data
     cdef double u = 0.0
 
+    if penalty_type == L2:
+        rho = 1.0
+    elif penalty_type == L1:
+        rho = 0.0
+
     cdef double typw = sqrt(1.0 / sqrt(alpha))
 
     if learning_rate == OPTIMAL:
diff --git a/sklearn/linear_model/sgd_fast_sparse.c b/sklearn/linear_model/sgd_fast_sparse.c
index e8c8942806c7fb738b309e8aaf3349445c99deda..5aa0950e3d6b78b012747e8c60de7802b45e6c2f 100644
--- a/sklearn/linear_model/sgd_fast_sparse.c
+++ b/sklearn/linear_model/sgd_fast_sparse.c
@@ -1,11 +1,9 @@
-/* Generated by Cython 0.15.1+ on Fri Nov  4 21:50:24 2011 */
+/* Generated by Cython 0.15 on Tue Nov 15 20:42:25 2011 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
 #else
 
 #include <stddef.h> /* For offsetof */
@@ -36,6 +34,12 @@
   #define PY_LONG_LONG LONG_LONG
 #endif
 
+#if PY_VERSION_HEX < 0x02040000
+  #define METH_COEXIST 0
+  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)
+  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)
+#endif
+
 #if PY_VERSION_HEX < 0x02050000
   typedef int Py_ssize_t;
   #define PY_SSIZE_T_MAX INT_MAX
@@ -84,14 +88,8 @@
 
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
 #endif
 
 #if PY_MAJOR_VERSION >= 3
@@ -103,16 +101,6 @@
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
 
-/* new Py3.3 unicode representation (PEP 393) */
-#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_GET_LENGTH)
-  #define CYTHON_PEP393_ENABLED
-  #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
-#else
-  #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u)
-  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-#endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
   #define PyStringObject               PyUnicodeObject
@@ -279,7 +267,7 @@
 #   else
 #     define CYTHON_UNUSED
 #   endif
-# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
+# elif defined(__ICC) || defined(__INTEL_COMPILER)
 #   define CYTHON_UNUSED __attribute__ ((__unused__))
 # else
 #   define CYTHON_UNUSED
@@ -816,6 +804,7 @@ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log {
 static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;
 
 
+
 /* "sgd_fast.pxd":48
  *     cpdef double dloss(self, double p, double y)
  * 
@@ -883,9 +872,6 @@ static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_vt
   #define __Pyx_XGIVEREF(r)
 #endif /* CYTHON_REFNANNY */
 
-#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
-#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
-
 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
 static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
@@ -898,20 +884,15 @@ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],
 
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact); /*proto*/
-#define IS_UNSIGNED(type) (((type) -1) > 0)
 
 /* Run-time type information about structs used with buffers */
 struct __Pyx_StructField_;
 
-#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0)
-
 typedef struct {
   const char* name; /* for error messages only */
   struct __Pyx_StructField_* fields;
   size_t size;     /* sizeof(type) */
   char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
-  char is_unsigned;
-  int flags;
 } __Pyx_TypeInfo;
 
 typedef struct __Pyx_StructField_ {
@@ -925,26 +906,13 @@ typedef struct {
   size_t parent_offset;
 } __Pyx_BufFmt_StackElem;
 
-typedef struct {
-  __Pyx_StructField root;
-  __Pyx_BufFmt_StackElem* head;
-  size_t fmt_offset;
-  size_t new_count, enc_count;
-  int is_complex;
-  char enc_type;
-  char new_packmode;
-  char enc_packmode;
-} __Pyx_BufFmt_Context;
-
 
-static CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj,
-    __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
+static CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
 static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
 
-
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
-static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
 
+static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
 
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
@@ -1002,29 +970,22 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
-    if (PyList_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    PyObject *r;
+    if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+        r = PyList_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (PyTuple_CheckExact(o)) {
-        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
-        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, n);
-            Py_INCREF(r);
-            return r;
-        }
+    else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
     }
-    else if (likely(i >= 0)) {
-        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
-        if (likely(m && m->sq_item)) {
-            return m->sq_item(o, i);
-        }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
     }
-    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    else {
+        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
+    }
+    return r;
 }
 
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
@@ -1039,23 +1000,6 @@ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
 
 static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
-/* structs for buffer access */
-
-typedef struct {
-  Py_ssize_t shape, strides, suboffsets;
-} __Pyx_Buf_DimInfo;
-
-typedef struct {
-  size_t refcount;
-  Py_buffer pybuffer;
-} __Pyx_Buffer;
-
-typedef struct {
-  __Pyx_Buffer *rcbuffer;
-  char *data;
-  __Pyx_Buf_DimInfo diminfo[32];
-} __Pyx_LocalBuf_ND;
-
 #if PY_MAJOR_VERSION < 3
 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
 static void __Pyx_ReleaseBuffer(Py_buffer *view);
@@ -1064,13 +1008,11 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view);
 #define __Pyx_ReleaseBuffer PyBuffer_Release
 #endif
 
-Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
+Py_ssize_t __Pyx_zeros[] = {0};
+Py_ssize_t __Pyx_minusones[] = {-1};
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
-
 static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/
 #if PY_MAJOR_VERSION >= 3
 static PyObject* __pyx_print = 0;
@@ -1250,6 +1192,8 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, cha
 static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/
 static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/
 
+/* Module declarations from 'cython.cython.view' */
+
 /* Module declarations from 'cython' */
 
 /* Module declarations from 'sklearn.linear_model.sgd_fast' */
@@ -1268,8 +1212,8 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_mi
 static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *, double *, int *, int, int); /*proto*/
 static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *, double, double *, int *, int, int, double); /*proto*/
 static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *, double, double *, int *, int, int, double); /*proto*/
-static __Pyx_TypeInfo __Pyx_TypeInfo_double = { "double", NULL, sizeof(double), 'R', 0, 0 };
-static __Pyx_TypeInfo __Pyx_TypeInfo_int = { "int", NULL, sizeof(int), 'I', IS_UNSIGNED(int), 0 };
+static __Pyx_TypeInfo __Pyx_TypeInfo_double = { "double", NULL, sizeof(double), 'R' };
+static __Pyx_TypeInfo __Pyx_TypeInfo_int = { "int", NULL, sizeof(int), 'I' };
 #define __Pyx_MODULE_NAME "sklearn.linear_model.sgd_fast_sparse"
 int __pyx_module_is_main_sklearn__linear_model__sgd_fast_sparse = 0;
 
@@ -1288,8 +1232,7 @@ static char __pyx_k_10[] = "Non-native byte order not supported";
 static char __pyx_k_12[] = "unknown dtype code in numpy.pxd (%d)";
 static char __pyx_k_13[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_16[] = "Format string allocated too short.";
-static char __pyx_k_20[] = "/home/lars/src/scikit-learn/sklearn/linear_model/sgd_fast_sparse.pyx";
-static char __pyx_k_21[] = "sklearn.linear_model.sgd_fast_sparse";
+static char __pyx_k_18[] = "sklearn.linear_model.sgd_fast_sparse";
 static char __pyx_k__B[] = "B";
 static char __pyx_k__H[] = "H";
 static char __pyx_k__I[] = "I";
@@ -1305,32 +1248,22 @@ static char __pyx_k__g[] = "g";
 static char __pyx_k__h[] = "h";
 static char __pyx_k__i[] = "i";
 static char __pyx_k__l[] = "l";
-static char __pyx_k__p[] = "p";
 static char __pyx_k__q[] = "q";
-static char __pyx_k__t[] = "t";
-static char __pyx_k__u[] = "u";
 static char __pyx_k__w[] = "w";
-static char __pyx_k__y[] = "y";
 static char __pyx_k__Zd[] = "Zd";
 static char __pyx_k__Zf[] = "Zf";
 static char __pyx_k__Zg[] = "Zg";
 static char __pyx_k__np[] = "np";
 static char __pyx_k__any[] = "any";
 static char __pyx_k__dot[] = "dot";
-static char __pyx_k__eta[] = "eta";
 static char __pyx_k__rho[] = "rho";
 static char __pyx_k__sys[] = "sys";
 static char __pyx_k__eta0[] = "eta0";
 static char __pyx_k__loss[] = "loss";
 static char __pyx_k__seed[] = "seed";
 static char __pyx_k__time[] = "time";
-static char __pyx_k__typw[] = "typw";
-static char __pyx_k__xnnz[] = "xnnz";
 static char __pyx_k__alpha[] = "alpha";
-static char __pyx_k__count[] = "count";
 static char __pyx_k__dtype[] = "dtype";
-static char __pyx_k__epoch[] = "epoch";
-static char __pyx_k__index[] = "index";
 static char __pyx_k__int32[] = "int32";
 static char __pyx_k__isinf[] = "isinf";
 static char __pyx_k__isnan[] = "isnan";
@@ -1338,58 +1271,39 @@ static char __pyx_k__numpy[] = "numpy";
 static char __pyx_k__order[] = "order";
 static char __pyx_k__range[] = "range";
 static char __pyx_k__shape[] = "shape";
-static char __pyx_k__wnorm[] = "wnorm";
 static char __pyx_k__zeros[] = "zeros";
 static char __pyx_k__X_data[] = "X_data";
 static char __pyx_k__arange[] = "arange";
 static char __pyx_k__n_iter[] = "n_iter";
-static char __pyx_k__offset[] = "offset";
 static char __pyx_k__random[] = "random";
-static char __pyx_k__update[] = "update";
-static char __pyx_k__wscale[] = "wscale";
 static char __pyx_k__xrange[] = "xrange";
 static char __pyx_k__float64[] = "float64";
 static char __pyx_k__nonzero[] = "nonzero";
 static char __pyx_k__power_t[] = "power_t";
 static char __pyx_k__shuffle[] = "shuffle";
-static char __pyx_k__sumloss[] = "sumloss";
-static char __pyx_k__t_start[] = "t_start";
 static char __pyx_k__verbose[] = "verbose";
 static char __pyx_k__X_indptr[] = "X_indptr";
 static char __pyx_k____main__[] = "__main__";
 static char __pyx_k____test__[] = "__test__";
 static char __pyx_k__X_indices[] = "X_indices";
 static char __pyx_k__intercept[] = "intercept";
-static char __pyx_k__n_samples[] = "n_samples";
 static char __pyx_k__plain_sgd[] = "plain_sgd";
 static char __pyx_k__ValueError[] = "ValueError";
-static char __pyx_k__X_data_ptr[] = "X_data_ptr";
-static char __pyx_k__Y_data_ptr[] = "Y_data_ptr";
-static char __pyx_k__n_features[] = "n_features";
-static char __pyx_k__q_data_ptr[] = "q_data_ptr";
-static char __pyx_k__sample_idx[] = "sample_idx";
-static char __pyx_k__w_data_ptr[] = "w_data_ptr";
 static char __pyx_k__weight_neg[] = "weight_neg";
 static char __pyx_k__weight_pos[] = "weight_pos";
 static char __pyx_k__RandomState[] = "RandomState";
 static char __pyx_k__RuntimeError[] = "RuntimeError";
-static char __pyx_k__X_indptr_ptr[] = "X_indptr_ptr";
-static char __pyx_k__class_weight[] = "class_weight";
 static char __pyx_k__penalty_type[] = "penalty_type";
-static char __pyx_k__X_indices_ptr[] = "X_indices_ptr";
 static char __pyx_k__fit_intercept[] = "fit_intercept";
 static char __pyx_k__learning_rate[] = "learning_rate";
 static char __pyx_k__sample_weight[] = "sample_weight";
-static char __pyx_k__index_data_ptr[] = "index_data_ptr";
-static char __pyx_k__sample_weight_data[] = "sample_weight_data";
 static PyObject *__pyx_kp_s_1;
 static PyObject *__pyx_kp_u_10;
 static PyObject *__pyx_kp_u_12;
 static PyObject *__pyx_kp_u_13;
 static PyObject *__pyx_kp_u_16;
+static PyObject *__pyx_n_s_18;
 static PyObject *__pyx_kp_s_2;
-static PyObject *__pyx_kp_s_20;
-static PyObject *__pyx_n_s_21;
 static PyObject *__pyx_kp_s_3;
 static PyObject *__pyx_kp_s_4;
 static PyObject *__pyx_kp_u_6;
@@ -1398,78 +1312,48 @@ static PyObject *__pyx_n_s__RandomState;
 static PyObject *__pyx_n_s__RuntimeError;
 static PyObject *__pyx_n_s__ValueError;
 static PyObject *__pyx_n_s__X_data;
-static PyObject *__pyx_n_s__X_data_ptr;
 static PyObject *__pyx_n_s__X_indices;
-static PyObject *__pyx_n_s__X_indices_ptr;
 static PyObject *__pyx_n_s__X_indptr;
-static PyObject *__pyx_n_s__X_indptr_ptr;
 static PyObject *__pyx_n_s__Y;
-static PyObject *__pyx_n_s__Y_data_ptr;
 static PyObject *__pyx_n_s____main__;
 static PyObject *__pyx_n_s____test__;
 static PyObject *__pyx_n_s__alpha;
 static PyObject *__pyx_n_s__any;
 static PyObject *__pyx_n_s__arange;
 static PyObject *__pyx_n_s__c;
-static PyObject *__pyx_n_s__class_weight;
-static PyObject *__pyx_n_s__count;
 static PyObject *__pyx_n_s__dot;
 static PyObject *__pyx_n_s__dtype;
-static PyObject *__pyx_n_s__epoch;
-static PyObject *__pyx_n_s__eta;
 static PyObject *__pyx_n_s__eta0;
 static PyObject *__pyx_n_s__fit_intercept;
 static PyObject *__pyx_n_s__float64;
-static PyObject *__pyx_n_s__i;
-static PyObject *__pyx_n_s__index;
-static PyObject *__pyx_n_s__index_data_ptr;
 static PyObject *__pyx_n_s__int32;
 static PyObject *__pyx_n_s__intercept;
 static PyObject *__pyx_n_s__isinf;
 static PyObject *__pyx_n_s__isnan;
 static PyObject *__pyx_n_s__learning_rate;
 static PyObject *__pyx_n_s__loss;
-static PyObject *__pyx_n_s__n_features;
 static PyObject *__pyx_n_s__n_iter;
-static PyObject *__pyx_n_s__n_samples;
 static PyObject *__pyx_n_s__nonzero;
 static PyObject *__pyx_n_s__np;
 static PyObject *__pyx_n_s__numpy;
-static PyObject *__pyx_n_s__offset;
 static PyObject *__pyx_n_s__order;
-static PyObject *__pyx_n_s__p;
 static PyObject *__pyx_n_s__penalty_type;
 static PyObject *__pyx_n_s__plain_sgd;
 static PyObject *__pyx_n_s__power_t;
-static PyObject *__pyx_n_s__q;
-static PyObject *__pyx_n_s__q_data_ptr;
 static PyObject *__pyx_n_s__random;
 static PyObject *__pyx_n_s__range;
 static PyObject *__pyx_n_s__rho;
-static PyObject *__pyx_n_s__sample_idx;
 static PyObject *__pyx_n_s__sample_weight;
-static PyObject *__pyx_n_s__sample_weight_data;
 static PyObject *__pyx_n_s__seed;
 static PyObject *__pyx_n_s__shape;
 static PyObject *__pyx_n_s__shuffle;
-static PyObject *__pyx_n_s__sumloss;
 static PyObject *__pyx_n_s__sys;
-static PyObject *__pyx_n_s__t;
-static PyObject *__pyx_n_s__t_start;
 static PyObject *__pyx_n_s__time;
-static PyObject *__pyx_n_s__typw;
-static PyObject *__pyx_n_s__u;
-static PyObject *__pyx_n_s__update;
 static PyObject *__pyx_n_s__verbose;
 static PyObject *__pyx_n_s__w;
-static PyObject *__pyx_n_s__w_data_ptr;
 static PyObject *__pyx_n_s__weight_neg;
 static PyObject *__pyx_n_s__weight_pos;
-static PyObject *__pyx_n_s__wnorm;
-static PyObject *__pyx_n_s__wscale;
-static PyObject *__pyx_n_s__xnnz;
 static PyObject *__pyx_n_s__xrange;
-static PyObject *__pyx_n_s__y;
 static PyObject *__pyx_n_s__zeros;
 static PyObject *__pyx_int_15;
 static PyObject *__pyx_k_tuple_5;
@@ -1479,8 +1363,6 @@ static PyObject *__pyx_k_tuple_11;
 static PyObject *__pyx_k_tuple_14;
 static PyObject *__pyx_k_tuple_15;
 static PyObject *__pyx_k_tuple_17;
-static PyObject *__pyx_k_tuple_18;
-static PyObject *__pyx_k_codeobj_19;
 
 /* "sklearn/linear_model/sgd_fast_sparse.pyx":34
  * @cython.wraparound(False)
@@ -1545,22 +1427,30 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   double __pyx_v_u;
   double __pyx_v_typw;
   PyObject *__pyx_v_t_start = NULL;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_index;
-  __Pyx_Buffer __pyx_pybuffer_index;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_X_data;
-  __Pyx_Buffer __pyx_pybuffer_X_data;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_sample_weight;
-  __Pyx_Buffer __pyx_pybuffer_sample_weight;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_X_indices;
-  __Pyx_Buffer __pyx_pybuffer_X_indices;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_X_indptr;
-  __Pyx_Buffer __pyx_pybuffer_X_indptr;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_Y;
-  __Pyx_Buffer __pyx_pybuffer_Y;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_q;
-  __Pyx_Buffer __pyx_pybuffer_q;
-  __Pyx_LocalBuf_ND __pyx_pybuffernd_w;
-  __Pyx_Buffer __pyx_pybuffer_w;
+  Py_buffer __pyx_bstruct_index;
+  Py_ssize_t __pyx_bstride_0_index = 0;
+  Py_ssize_t __pyx_bshape_0_index = 0;
+  Py_buffer __pyx_bstruct_X_data;
+  Py_ssize_t __pyx_bstride_0_X_data = 0;
+  Py_ssize_t __pyx_bshape_0_X_data = 0;
+  Py_buffer __pyx_bstruct_sample_weight;
+  Py_ssize_t __pyx_bstride_0_sample_weight = 0;
+  Py_ssize_t __pyx_bshape_0_sample_weight = 0;
+  Py_buffer __pyx_bstruct_X_indices;
+  Py_ssize_t __pyx_bstride_0_X_indices = 0;
+  Py_ssize_t __pyx_bshape_0_X_indices = 0;
+  Py_buffer __pyx_bstruct_X_indptr;
+  Py_ssize_t __pyx_bstride_0_X_indptr = 0;
+  Py_ssize_t __pyx_bshape_0_X_indptr = 0;
+  Py_buffer __pyx_bstruct_Y;
+  Py_ssize_t __pyx_bstride_0_Y = 0;
+  Py_ssize_t __pyx_bshape_0_Y = 0;
+  Py_buffer __pyx_bstruct_q;
+  Py_ssize_t __pyx_bstride_0_q = 0;
+  Py_ssize_t __pyx_bshape_0_q = 0;
+  Py_buffer __pyx_bstruct_w;
+  Py_ssize_t __pyx_bstride_0_w = 0;
+  Py_ssize_t __pyx_bshape_0_w = 0;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -1592,211 +1482,162 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__w,&__pyx_n_s__intercept,&__pyx_n_s__loss,&__pyx_n_s__penalty_type,&__pyx_n_s__alpha,&__pyx_n_s__rho,&__pyx_n_s__X_data,&__pyx_n_s__X_indices,&__pyx_n_s__X_indptr,&__pyx_n_s__Y,&__pyx_n_s__n_iter,&__pyx_n_s__fit_intercept,&__pyx_n_s__verbose,&__pyx_n_s__shuffle,&__pyx_n_s__seed,&__pyx_n_s__weight_pos,&__pyx_n_s__weight_neg,&__pyx_n_s__sample_weight,&__pyx_n_s__learning_rate,&__pyx_n_s__eta0,&__pyx_n_s__power_t,0};
   __Pyx_RefNannySetupContext("plain_sgd");
   __pyx_self = __pyx_self;
-  {
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[21] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    if (unlikely(__pyx_kwds)) {
-      Py_ssize_t kw_args;
-      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
-      switch (pos_args) {
-        case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
-        case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
-        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
-        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
-        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
-        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
-        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
-        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
-        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
-        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
-        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
-        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
-        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
-        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
-        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
-        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-        case  0: break;
-        default: goto __pyx_L5_argtuple_error;
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case 21: values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
+      case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
+      case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
+      case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
+      case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
+      case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
+      case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
+      case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
+      case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
+      case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
+      case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
+      case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
+      case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
+      case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
+      case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
+      case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
+      case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
+      case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
+      case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
+      case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
+      case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
+      case  0: break;
+      default: goto __pyx_L5_argtuple_error;
+    }
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      case  0:
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
+      if (likely(values[0])) kw_args--;
+      else goto __pyx_L5_argtuple_error;
+      case  1:
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
+      if (likely(values[1])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      kw_args = PyDict_Size(__pyx_kwds);
-      switch (pos_args) {
-        case  0:
-        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
-        if (likely(values[0])) kw_args--;
-        else goto __pyx_L5_argtuple_error;
-        case  1:
-        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
-        if (likely(values[1])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  2:
-        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
-        if (likely(values[2])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  3:
-        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
-        if (likely(values[3])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  4:
-        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
-        if (likely(values[4])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  5:
-        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
-        if (likely(values[5])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  6:
-        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_data);
-        if (likely(values[6])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  7:
-        values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indices);
-        if (likely(values[7])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  8:
-        values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indptr);
-        if (likely(values[8])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case  9:
-        values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
-        if (likely(values[9])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 10:
-        values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
-        if (likely(values[10])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 11:
-        values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
-        if (likely(values[11])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 12:
-        values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
-        if (likely(values[12])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 13:
-        values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
-        if (likely(values[13])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 14:
-        values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed);
-        if (likely(values[14])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 15:
-        values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos);
-        if (likely(values[15])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 16:
-        values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg);
-        if (likely(values[16])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 17:
-        values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_weight);
-        if (likely(values[17])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 18:
-        values[18] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate);
-        if (likely(values[18])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 18); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 19:
-        values[19] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0);
-        if (likely(values[19])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 19); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
-        case 20:
-        values[20] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t);
-        if (likely(values[20])) kw_args--;
-        else {
-          __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 20); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-        }
+      case  2:
+      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
+      if (likely(values[2])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      case  3:
+      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
+      if (likely(values[3])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  4:
+      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
+      if (likely(values[4])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  5:
+      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
+      if (likely(values[5])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  6:
+      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_data);
+      if (likely(values[6])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  7:
+      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indices);
+      if (likely(values[7])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  8:
+      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indptr);
+      if (likely(values[8])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case  9:
+      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
+      if (likely(values[9])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 10:
+      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
+      if (likely(values[10])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 11:
+      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
+      if (likely(values[11])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 12:
+      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
+      if (likely(values[12])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 13:
+      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
+      if (likely(values[13])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 14:
+      values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed);
+      if (likely(values[14])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 15:
+      values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos);
+      if (likely(values[15])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 16:
+      values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg);
+      if (likely(values[16])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 17:
+      values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__sample_weight);
+      if (likely(values[17])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 18:
+      values[18] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate);
+      if (likely(values[18])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 18); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 19:
+      values[19] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0);
+      if (likely(values[19])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 19); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      case 20:
+      values[20] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t);
+      if (likely(values[20])) kw_args--;
+      else {
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 21, 21, 20); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
-      __pyx_v_w = ((PyArrayObject *)values[0]);
-      __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)values[2]);
-      __pyx_v_penalty_type = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_rho = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_X_data = ((PyArrayObject *)values[6]);
-      __pyx_v_X_indices = ((PyArrayObject *)values[7]);
-      __pyx_v_X_indptr = ((PyArrayObject *)values[8]);
-      __pyx_v_Y = ((PyArrayObject *)values[9]);
-      __pyx_v_n_iter = __Pyx_PyInt_AsInt(values[10]); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(values[11]); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_verbose = __Pyx_PyInt_AsInt(values[12]); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_shuffle = __Pyx_PyInt_AsInt(values[13]); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_seed = __Pyx_PyInt_AsInt(values[14]); if (unlikely((__pyx_v_seed == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(values[15]); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(values[16]); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_sample_weight = ((PyArrayObject *)values[17]);
-      __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[18]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[19]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[20]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    } else if (PyTuple_GET_SIZE(__pyx_args) != 21) {
-      goto __pyx_L5_argtuple_error;
-    } else {
-      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
-      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
-      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
-      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
-      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
-      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
-      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
-      values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
-      values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
-      values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
-      values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
-      values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
-      values[12] = PyTuple_GET_ITEM(__pyx_args, 12);
-      values[13] = PyTuple_GET_ITEM(__pyx_args, 13);
-      values[14] = PyTuple_GET_ITEM(__pyx_args, 14);
-      values[15] = PyTuple_GET_ITEM(__pyx_args, 15);
-      values[16] = PyTuple_GET_ITEM(__pyx_args, 16);
-      values[17] = PyTuple_GET_ITEM(__pyx_args, 17);
-      values[18] = PyTuple_GET_ITEM(__pyx_args, 18);
-      values[19] = PyTuple_GET_ITEM(__pyx_args, 19);
-      values[20] = PyTuple_GET_ITEM(__pyx_args, 20);
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_w = ((PyArrayObject *)values[0]);
     __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1819,6 +1660,30 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[18]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[19]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[20]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 21) {
+    goto __pyx_L5_argtuple_error;
+  } else {
+    __pyx_v_w = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 0));
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)PyTuple_GET_ITEM(__pyx_args, 2));
+    __pyx_v_penalty_type = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 3)); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_alpha = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 4)); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_rho = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 5)); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_X_data = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 6));
+    __pyx_v_X_indices = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 7));
+    __pyx_v_X_indptr = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 8));
+    __pyx_v_Y = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 9));
+    __pyx_v_n_iter = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 10)); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 11)); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_verbose = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 12)); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_shuffle = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 13)); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_seed = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 14)); if (unlikely((__pyx_v_seed == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 15)); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 16)); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_sample_weight = ((PyArrayObject *)PyTuple_GET_ITEM(__pyx_args, 17));
+    __pyx_v_learning_rate = __Pyx_PyInt_AsInt(PyTuple_GET_ITEM(__pyx_args, 18)); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_eta0 = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 19)); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_power_t = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 20)); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1829,38 +1694,14 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __pyx_pybuffer_index.pybuffer.buf = NULL;
-  __pyx_pybuffer_index.refcount = 0;
-  __pyx_pybuffernd_index.data = NULL;
-  __pyx_pybuffernd_index.rcbuffer = &__pyx_pybuffer_index;
-  __pyx_pybuffer_q.pybuffer.buf = NULL;
-  __pyx_pybuffer_q.refcount = 0;
-  __pyx_pybuffernd_q.data = NULL;
-  __pyx_pybuffernd_q.rcbuffer = &__pyx_pybuffer_q;
-  __pyx_pybuffer_w.pybuffer.buf = NULL;
-  __pyx_pybuffer_w.refcount = 0;
-  __pyx_pybuffernd_w.data = NULL;
-  __pyx_pybuffernd_w.rcbuffer = &__pyx_pybuffer_w;
-  __pyx_pybuffer_X_data.pybuffer.buf = NULL;
-  __pyx_pybuffer_X_data.refcount = 0;
-  __pyx_pybuffernd_X_data.data = NULL;
-  __pyx_pybuffernd_X_data.rcbuffer = &__pyx_pybuffer_X_data;
-  __pyx_pybuffer_X_indices.pybuffer.buf = NULL;
-  __pyx_pybuffer_X_indices.refcount = 0;
-  __pyx_pybuffernd_X_indices.data = NULL;
-  __pyx_pybuffernd_X_indices.rcbuffer = &__pyx_pybuffer_X_indices;
-  __pyx_pybuffer_X_indptr.pybuffer.buf = NULL;
-  __pyx_pybuffer_X_indptr.refcount = 0;
-  __pyx_pybuffernd_X_indptr.data = NULL;
-  __pyx_pybuffernd_X_indptr.rcbuffer = &__pyx_pybuffer_X_indptr;
-  __pyx_pybuffer_Y.pybuffer.buf = NULL;
-  __pyx_pybuffer_Y.refcount = 0;
-  __pyx_pybuffernd_Y.data = NULL;
-  __pyx_pybuffernd_Y.rcbuffer = &__pyx_pybuffer_Y;
-  __pyx_pybuffer_sample_weight.pybuffer.buf = NULL;
-  __pyx_pybuffer_sample_weight.refcount = 0;
-  __pyx_pybuffernd_sample_weight.data = NULL;
-  __pyx_pybuffernd_sample_weight.rcbuffer = &__pyx_pybuffer_sample_weight;
+  __pyx_bstruct_index.buf = NULL;
+  __pyx_bstruct_q.buf = NULL;
+  __pyx_bstruct_w.buf = NULL;
+  __pyx_bstruct_X_data.buf = NULL;
+  __pyx_bstruct_X_indices.buf = NULL;
+  __pyx_bstruct_X_indptr.buf = NULL;
+  __pyx_bstruct_Y.buf = NULL;
+  __pyx_bstruct_sample_weight.buf = NULL;
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_data), __pyx_ptype_5numpy_ndarray, 1, "X_data", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -1870,34 +1711,40 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sample_weight), __pyx_ptype_5numpy_ndarray, 1, "sample_weight", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+  __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_data.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_X_data.diminfo[0].strides = __pyx_pybuffernd_X_data.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_data.diminfo[0].shape = __pyx_pybuffernd_X_data.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_X_data = __pyx_bstruct_X_data.strides[0];
+  __pyx_bshape_0_X_data = __pyx_bstruct_X_data.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_indices.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_X_indices.diminfo[0].strides = __pyx_pybuffernd_X_indices.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_indices.diminfo[0].shape = __pyx_pybuffernd_X_indices.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_X_indices = __pyx_bstruct_X_indices.strides[0];
+  __pyx_bshape_0_X_indices = __pyx_bstruct_X_indices.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_X_indptr.rcbuffer->pybuffer, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_X_indptr.diminfo[0].strides = __pyx_pybuffernd_X_indptr.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X_indptr.diminfo[0].shape = __pyx_pybuffernd_X_indptr.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_X_indptr = __pyx_bstruct_X_indptr.strides[0];
+  __pyx_bshape_0_X_indptr = __pyx_bstruct_X_indptr.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Y.rcbuffer->pybuffer, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_Y, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_Y.diminfo[0].strides = __pyx_pybuffernd_Y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Y.diminfo[0].shape = __pyx_pybuffernd_Y.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
+  __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer, (PyObject*)__pyx_v_sample_weight, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_sample_weight, (PyObject*)__pyx_v_sample_weight, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_pybuffernd_sample_weight.diminfo[0].strides = __pyx_pybuffernd_sample_weight.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_sample_weight.diminfo[0].shape = __pyx_pybuffernd_sample_weight.rcbuffer->pybuffer.shape[0];
+  __pyx_bstride_0_sample_weight = __pyx_bstruct_sample_weight.strides[0];
+  __pyx_bshape_0_sample_weight = __pyx_bstruct_sample_weight.shape[0];
 
   /* "sklearn/linear_model/sgd_fast_sparse.pyx":108
  *     """
@@ -1986,7 +1833,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
@@ -2007,7 +1854,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -2016,10 +1863,11 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_index.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
-      __pyx_v_index = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_index.rcbuffer->pybuffer.buf = NULL;
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+      __pyx_v_index = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_index.buf = NULL;
       {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_pybuffernd_index.diminfo[0].strides = __pyx_pybuffernd_index.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_index.diminfo[0].shape = __pyx_pybuffernd_index.rcbuffer->pybuffer.shape[0];
+    } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
+      __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
   }
   __pyx_t_6 = 0;
@@ -2157,7 +2005,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
  *     cdef int sample_idx = 0
- *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
+ * 
  */
   __pyx_v_i = 0;
 
@@ -2165,14 +2013,14 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef int sample_idx = 0             # <<<<<<<<<<<<<<
- *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
- *     cdef double *q_data_ptr = NULL
+ * 
+ *     # q vector is only used for L1 regularization
  */
   __pyx_v_sample_idx = 0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":137
- *     cdef unsigned int i = 0
- *     cdef int sample_idx = 0
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":139
+ * 
+ *     # q vector is only used for L1 regularization
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
  *     cdef double *q_data_ptr = NULL
  *     if penalty_type != L2:
@@ -2180,18 +2028,19 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_7 = ((PyArrayObject *)Py_None);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
-      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_q.rcbuffer->pybuffer.buf = NULL;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_bstruct_q.buf = NULL;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    } else {__pyx_bstride_0_q = __pyx_bstruct_q.strides[0];
+      __pyx_bshape_0_q = __pyx_bstruct_q.shape[0];
     }
   }
   __pyx_t_7 = 0;
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":138
- *     cdef int sample_idx = 0
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":140
+ *     # q vector is only used for L1 regularization
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr = NULL             # <<<<<<<<<<<<<<
  *     if penalty_type != L2:
@@ -2199,7 +2048,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
   __pyx_v_q_data_ptr = NULL;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":139
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":141
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr = NULL
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
@@ -2209,99 +2058,148 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_8 = (__pyx_v_penalty_type != 2);
   if (__pyx_t_8) {
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":140
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":142
  *     cdef double *q_data_ptr = NULL
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype=np.float64, order="c")             # <<<<<<<<<<<<<<
  *         q_data_ptr = <double *> q.data
  *     cdef double u = 0.0
  */
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__zeros); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_5));
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_3));
     __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__float64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__float64); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
-      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
+      __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
       if (unlikely(__pyx_t_9 < 0)) {
         PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
-        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
           Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
           __Pyx_RaiseBufferFallbackError();
         } else {
           PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
         }
       }
-      __pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];
-      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_bstride_0_q = __pyx_bstruct_q.strides[0];
+      __pyx_bshape_0_q = __pyx_bstruct_q.shape[0];
+      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_t_7 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_q));
     __pyx_v_q = ((PyArrayObject *)__pyx_t_4);
     __pyx_t_4 = 0;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":141
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":143
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype=np.float64, order="c")
  *         q_data_ptr = <double *> q.data             # <<<<<<<<<<<<<<
  *     cdef double u = 0.0
- *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ * 
  */
     __pyx_v_q_data_ptr = ((double *)__pyx_v_q->data);
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":142
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":144
  *         q = np.zeros((n_features,), dtype=np.float64, order="c")
  *         q_data_ptr = <double *> q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
- *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  * 
+ *     if penalty_type == L2:
  */
   __pyx_v_u = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":143
- *         q_data_ptr = <double *> q.data
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":148
+ *     if penalty_type == L2:
+ *         rho = 1.0
+ *     elif penalty_type == L1:             # <<<<<<<<<<<<<<
+ *         rho = 0.0
+ * 
+ */
+  switch (__pyx_v_penalty_type) {
+
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":146
  *     cdef double u = 0.0
+ * 
+ *     if penalty_type == L2:             # <<<<<<<<<<<<<<
+ *         rho = 1.0
+ *     elif penalty_type == L1:
+ */
+    case 2:
+
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":147
+ * 
+ *     if penalty_type == L2:
+ *         rho = 1.0             # <<<<<<<<<<<<<<
+ *     elif penalty_type == L1:
+ *         rho = 0.0
+ */
+    __pyx_v_rho = 1.0;
+    break;
+
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":148
+ *     if penalty_type == L2:
+ *         rho = 1.0
+ *     elif penalty_type == L1:             # <<<<<<<<<<<<<<
+ *         rho = 0.0
+ * 
+ */
+    case 1:
+
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":149
+ *         rho = 1.0
+ *     elif penalty_type == L1:
+ *         rho = 0.0             # <<<<<<<<<<<<<<
+ * 
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ */
+    __pyx_v_rho = 0.0;
+    break;
+  }
+
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":151
+ *         rho = 0.0
+ * 
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
  * 
  *     if learning_rate == OPTIMAL:
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":145
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":153
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  * 
  *     if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -2311,7 +2209,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_8 = (__pyx_v_learning_rate == 2);
   if (__pyx_t_8) {
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":147
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":155
  *     if learning_rate == OPTIMAL:
  *         # computing eta0, the initial learning rate
  *         eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -2323,7 +2221,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   }
   /*else*/ {
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":149
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":157
  *         eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     else:
  *         eta = eta0             # <<<<<<<<<<<<<<
@@ -2334,7 +2232,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   }
   __pyx_L7:;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":151
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":159
  *         eta = eta0
  * 
  *     if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -2344,7 +2242,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __pyx_t_8 = (__pyx_v_learning_rate == 2);
   if (__pyx_t_8) {
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":153
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":161
  *     if learning_rate == OPTIMAL:
  *         # initialize t such that eta at first example equals eta0
  *         t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -2356,7 +2254,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   }
   /*else*/ {
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":155
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":163
  *         t = 1.0 / (eta0 * alpha)
  *     else:
  *         t = 1.0             # <<<<<<<<<<<<<<
@@ -2367,22 +2265,22 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   }
   __pyx_L8:;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":157
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":165
  *         t = 1.0
  * 
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:
  */
-  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_v_t_start = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":158
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":166
  * 
  *     t_start = time()
  *     for epoch in xrange(n_iter):             # <<<<<<<<<<<<<<
@@ -2393,7 +2291,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {
     __pyx_v_epoch = __pyx_t_13;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":159
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":167
  *     t_start = time()
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -2403,25 +2301,25 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":160
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":168
  *     for epoch in xrange(n_iter):
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)
  */
-      __pyx_t_3 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       goto __pyx_L11;
     }
     __pyx_L11:;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":161
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":169
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
@@ -2430,41 +2328,41 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
     if (__pyx_v_shuffle) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":162
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":170
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)             # <<<<<<<<<<<<<<
  *         for i in xrange(n_samples):
  *             sample_idx = index_data_ptr[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__RandomState); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__RandomState); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_seed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_seed); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_v_index));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_index));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_index));
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
@@ -2473,7 +2371,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     }
     __pyx_L12:;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":163
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":171
  *         if shuffle:
  *             np.random.RandomState(seed).shuffle(index)
  *         for i in xrange(n_samples):             # <<<<<<<<<<<<<<
@@ -2484,7 +2382,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
       __pyx_v_i = __pyx_t_15;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":164
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":172
  *             np.random.RandomState(seed).shuffle(index)
  *         for i in xrange(n_samples):
  *             sample_idx = index_data_ptr[i]             # <<<<<<<<<<<<<<
@@ -2493,7 +2391,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_sample_idx = (__pyx_v_index_data_ptr[__pyx_v_i]);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":165
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":173
  *         for i in xrange(n_samples):
  *             sample_idx = index_data_ptr[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -2502,7 +2400,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":166
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":174
  *             sample_idx = index_data_ptr[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -2511,7 +2409,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":167
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":175
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y_data_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -2520,7 +2418,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_y = (__pyx_v_Y_data_ptr[__pyx_v_sample_idx]);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":170
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":178
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<
@@ -2529,7 +2427,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       switch (__pyx_v_learning_rate) {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":168
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":176
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y_data_ptr[sample_idx]
  *             if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<
@@ -2538,7 +2436,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
         case 2:
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":169
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":177
  *             y = Y_data_ptr[sample_idx]
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -2548,7 +2446,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
         break;
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":170
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":178
  *             if learning_rate == OPTIMAL:
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<
@@ -2557,7 +2455,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
         case 3:
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":171
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":179
  *                 eta = 1.0 / (alpha * t)
  *             elif learning_rate == INVSCALING:
  *                 eta = eta0 / pow(t, power_t)             # <<<<<<<<<<<<<<
@@ -2568,7 +2466,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         break;
       }
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":173
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":181
  *                 eta = eta0 / pow(t, power_t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -2577,7 +2475,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_p = ((__pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(__pyx_v_w_data_ptr, __pyx_v_X_data_ptr, __pyx_v_X_indices_ptr, __pyx_v_offset, __pyx_v_xnnz) * __pyx_v_wscale) + __pyx_v_intercept);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":174
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":182
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -2586,7 +2484,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_sumloss = (__pyx_v_sumloss + ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":175
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":183
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             if y > 0:             # <<<<<<<<<<<<<<
@@ -2596,7 +2494,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       __pyx_t_8 = (__pyx_v_y > 0.0);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":176
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":184
  *             sumloss += loss.loss(p, y)
  *             if y > 0:
  *                 class_weight = weight_pos             # <<<<<<<<<<<<<<
@@ -2608,7 +2506,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       }
       /*else*/ {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":178
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":186
  *                 class_weight = weight_pos
  *             else:
  *                 class_weight = weight_neg             # <<<<<<<<<<<<<<
@@ -2619,7 +2517,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       }
       __pyx_L15:;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":180
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":188
  *                 class_weight = weight_neg
  *             update = eta * loss.dloss(p, y) * class_weight * \
  *                 sample_weight_data[sample_idx]             # <<<<<<<<<<<<<<
@@ -2628,7 +2526,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_update = (((__pyx_v_eta * ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0)) * __pyx_v_class_weight) * (__pyx_v_sample_weight_data[__pyx_v_sample_idx]));
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":181
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":189
  *             update = eta * loss.dloss(p, y) * class_weight * \
  *                 sample_weight_data[sample_idx]
  *             if update != 0.0:             # <<<<<<<<<<<<<<
@@ -2638,7 +2536,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       __pyx_t_8 = (__pyx_v_update != 0.0);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":183
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":191
  *             if update != 0.0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, -update)             # <<<<<<<<<<<<<<
@@ -2647,7 +2545,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
         __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(__pyx_v_w_data_ptr, __pyx_v_wscale, __pyx_v_X_data_ptr, __pyx_v_X_indices_ptr, __pyx_v_offset, __pyx_v_xnnz, (-__pyx_v_update));
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":184
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":192
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, -update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
@@ -2657,7 +2555,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         __pyx_t_8 = (__pyx_v_fit_intercept == 1);
         if (__pyx_t_8) {
 
-          /* "sklearn/linear_model/sgd_fast_sparse.pyx":185
+          /* "sklearn/linear_model/sgd_fast_sparse.pyx":193
  *                     offset, xnnz, -update)
  *                 if fit_intercept == 1:
  *                     intercept -= update * 0.01             # <<<<<<<<<<<<<<
@@ -2672,7 +2570,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       }
       __pyx_L16:;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":186
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":194
  *                 if fit_intercept == 1:
  *                     intercept -= update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
@@ -2682,7 +2580,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       __pyx_t_8 = (__pyx_v_penalty_type != 1);
       if (__pyx_t_8) {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":187
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":195
  *                     intercept -= update * 0.01
  *             if penalty_type != L1:
  *                 wscale *= (1.0 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
@@ -2691,7 +2589,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
         __pyx_v_wscale = (__pyx_v_wscale * (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha)));
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":188
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":196
  *             if penalty_type != L1:
  *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
@@ -2701,42 +2599,43 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         __pyx_t_8 = (__pyx_v_wscale < 1e-9);
         if (__pyx_t_8) {
 
-          /* "sklearn/linear_model/sgd_fast_sparse.pyx":189
+          /* "sklearn/linear_model/sgd_fast_sparse.pyx":197
  *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-          __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_4);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_16 = ((PyArrayObject *)__pyx_t_3);
           {
             __Pyx_BufFmt_StackElem __pyx_stack[1];
-            __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
-            __pyx_t_17 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+            __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+            __pyx_t_17 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
             if (unlikely(__pyx_t_17 < 0)) {
               PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10);
-              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
                 Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10);
                 __Pyx_RaiseBufferFallbackError();
               } else {
                 PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10);
               }
             }
-            __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
-            if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+            __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
+            if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_t_16 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
           __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "sklearn/linear_model/sgd_fast_sparse.pyx":190
+          /* "sklearn/linear_model/sgd_fast_sparse.pyx":198
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
@@ -2751,7 +2650,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       }
       __pyx_L18:;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":191
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":199
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -2762,7 +2661,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         case 1:
         case 3:
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":192
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":200
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
@@ -2771,7 +2670,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
         __pyx_v_u = (__pyx_v_u + (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":194
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":202
  *                 u += ((1.0 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
@@ -2782,7 +2681,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
         break;
       }
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":195
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":203
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
@@ -2791,7 +2690,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  */
       __pyx_v_t = (__pyx_v_t + 1.0);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":196
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":204
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
@@ -2801,7 +2700,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       __pyx_v_count = (__pyx_v_count + 1);
     }
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":199
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":207
  * 
  *         # report epoche information
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -2811,101 +2710,101 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":200
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":208
  *         # report epoche information
  *         if verbose > 0:
  *             wnorm = sqrt(np.dot(w, w) * wscale * wscale)             # <<<<<<<<<<<<<<
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  */
-      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyNumber_Multiply(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Multiply(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_5); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":202
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":210
  *             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,             # <<<<<<<<<<<<<<
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,
  */
-      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":203
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":211
  *             print("Norm: %.2f, NNZs: %d, "\
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  *                                                     w.nonzero()[0].shape[0],             # <<<<<<<<<<<<<<
  *                                                     intercept, count,
  *                                                     sumloss / count))
  */
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":204
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":212
  *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,             # <<<<<<<<<<<<<<
  *                                                     sumloss / count))
  *             print("Total training time: %.2f seconds." % (time() - t_start))
  */
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":205
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":213
  *                                                     w.nonzero()[0].shape[0],
  *                                                     intercept, count,
  *                                                     sumloss / count))             # <<<<<<<<<<<<<<
  *             print("Total training time: %.2f seconds." % (time() - t_start))
  * 
  */
-      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_19));
       PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_3);
@@ -2921,165 +2820,165 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
       __pyx_t_4 = 0;
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_19)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_19)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":206
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":214
  *                                                     intercept, count,
  *                                                     sumloss / count))
  *             print("Total training time: %.2f seconds." % (time() - t_start))             # <<<<<<<<<<<<<<
  * 
  *         # floating-point under-/overflow check.
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_19 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_2); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_2); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_19));
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_19)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_19)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
       goto __pyx_L20;
     }
     __pyx_L20:;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":209
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":217
  * 
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \             # <<<<<<<<<<<<<<
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")
  */
-    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_19));
     __Pyx_INCREF(((PyObject *)__pyx_v_w));
     PyTuple_SET_ITEM(__pyx_t_19, 0, ((PyObject *)__pyx_v_w));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_19));
     PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (!__pyx_t_8) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":210
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":218
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":209
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":217
  * 
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \             # <<<<<<<<<<<<<<
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_20) {
 
-        /* "sklearn/linear_model/sgd_fast_sparse.pyx":210
+        /* "sklearn/linear_model/sgd_fast_sparse.pyx":218
  *         # floating-point under-/overflow check.
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  */
-        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_4 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_19);
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_19));
         PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_19), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
-        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         if (!__pyx_t_21) {
-          __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_19 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_19 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_19);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_4);
+          __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_4));
           PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __pyx_t_23 = __pyx_t_22;
         } else {
@@ -3095,59 +2994,60 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
     }
     if (__pyx_t_20) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":211
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":219
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_Raise(__pyx_t_1, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L21;
     }
     __pyx_L21:;
   }
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":213
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":221
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_4 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_16 = ((PyArrayObject *)__pyx_t_4);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_16, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
     if (unlikely(__pyx_t_9 < 0)) {
       PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);
-      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_w.rcbuffer->pybuffer, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
         Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
         __Pyx_RaiseBufferFallbackError();
       } else {
         PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
       }
     }
-    __pyx_pybuffernd_w.diminfo[0].strides = __pyx_pybuffernd_w.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_w.diminfo[0].shape = __pyx_pybuffernd_w.rcbuffer->pybuffer.shape[0];
-    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+    __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_16 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
   __pyx_v_w = ((PyArrayObject *)__pyx_t_4);
   __pyx_t_4 = 0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":214
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":222
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -3155,10 +3055,10 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_w));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
@@ -3180,27 +3080,27 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   __Pyx_XDECREF(__pyx_t_19);
   { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
     __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_index.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_data.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_indices.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_indptr.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_sample_weight);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_Y);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
   __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
   __Pyx_AddTraceback("sklearn.linear_model.sgd_fast_sparse.plain_sgd", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   goto __pyx_L2;
   __pyx_L0:;
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_index.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_data.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_sample_weight.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_indices.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_X_indptr.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);
-  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_w.rcbuffer->pybuffer);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_sample_weight);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_Y);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
   __pyx_L2:;
   __Pyx_XDECREF((PyObject *)__pyx_v_index);
   __Pyx_XDECREF((PyObject *)__pyx_v_q);
@@ -3211,7 +3111,7 @@ static PyObject *__pyx_pf_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd(Py
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast_sparse.pyx":217
+/* "sklearn/linear_model/sgd_fast_sparse.pyx":225
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -3225,7 +3125,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_ma
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("max");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":218
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":226
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
@@ -3246,7 +3146,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_ma
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast_sparse.pyx":221
+/* "sklearn/linear_model/sgd_fast_sparse.pyx":229
  * 
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
@@ -3260,7 +3160,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_mi
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("min");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":222
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":230
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
@@ -3281,7 +3181,7 @@ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_mi
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast_sparse.pyx":225
+/* "sklearn/linear_model/sgd_fast_sparse.pyx":233
  * 
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
@@ -3298,7 +3198,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *__py
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("dot");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":227
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":235
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  *                 int offset, int xnnz):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -3307,7 +3207,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *__py
  */
   __pyx_v_sum = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":229
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":237
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j in xrange(xnnz):             # <<<<<<<<<<<<<<
@@ -3318,7 +3218,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *__py
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":230
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":238
  *     cdef int j
  *     for j in xrange(xnnz):
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -3328,7 +3228,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *__py
     __pyx_v_sum = (__pyx_v_sum + ((__pyx_v_w_data_ptr[(__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)])]) * (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)])));
   }
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":231
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":239
  *     for j in xrange(xnnz):
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
@@ -3344,7 +3244,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_dot(double *__py
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast_sparse.pyx":234
+/* "sklearn/linear_model/sgd_fast_sparse.pyx":242
  * 
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
@@ -3365,7 +3265,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("add");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":240
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":248
  *     cdef int idx
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -3374,7 +3274,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":241
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":249
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -3383,7 +3283,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":242
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":250
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j in xrange(xnnz):             # <<<<<<<<<<<<<<
@@ -3394,7 +3294,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":243
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":251
  *     cdef double xsqnorm = 0.0
  *     for j in xrange(xnnz):
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -3403,7 +3303,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":244
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":252
  *     for j in xrange(xnnz):
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -3412,7 +3312,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":245
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":253
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
@@ -3421,7 +3321,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
     __pyx_v_innerprod = (__pyx_v_innerprod + ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val));
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":246
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":254
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -3430,7 +3330,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
  */
     __pyx_v_xsqnorm = (__pyx_v_xsqnorm + (__pyx_v_val * __pyx_v_val));
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":247
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":255
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -3441,7 +3341,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
     (__pyx_v_w_data_ptr[__pyx_t_3]) = ((__pyx_v_w_data_ptr[__pyx_t_3]) + (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale)));
   }
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":248
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":256
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
@@ -3457,7 +3357,7 @@ static double __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_add(double *__py
   return __pyx_r;
 }
 
-/* "sklearn/linear_model/sgd_fast_sparse.pyx":251
+/* "sklearn/linear_model/sgd_fast_sparse.pyx":259
  * 
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
@@ -3476,7 +3376,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":258
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":266
  *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -3485,7 +3385,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
  */
   __pyx_v_z = 0.0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":259
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":267
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -3494,7 +3394,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
  */
   __pyx_v_j = 0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":260
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":268
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     cdef int idx = 0             # <<<<<<<<<<<<<<
@@ -3503,7 +3403,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
  */
   __pyx_v_idx = 0;
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":261
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":269
  *     cdef int j = 0
  *     cdef int idx = 0
  *     for j in xrange(xnnz):             # <<<<<<<<<<<<<<
@@ -3514,7 +3414,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
   for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {
     __pyx_v_j = __pyx_t_2;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":262
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":270
  *     cdef int idx = 0
  *     for j in xrange(xnnz):
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -3523,7 +3423,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":263
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":271
  *     for j in xrange(xnnz):
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
@@ -3532,7 +3432,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":264
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":272
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0.0:             # <<<<<<<<<<<<<<
@@ -3542,7 +3442,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
     __pyx_t_3 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0);
     if (__pyx_t_3) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":265
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":273
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0.0:
  *             w_data_ptr[idx] = max(             # <<<<<<<<<<<<<<
@@ -3553,7 +3453,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
       goto __pyx_L5;
     }
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":268
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":276
  *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))
  * 
  *         elif (wscale * w_data_ptr[idx]) < 0.0:             # <<<<<<<<<<<<<<
@@ -3563,7 +3463,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
     __pyx_t_3 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0);
     if (__pyx_t_3) {
 
-      /* "sklearn/linear_model/sgd_fast_sparse.pyx":269
+      /* "sklearn/linear_model/sgd_fast_sparse.pyx":277
  * 
  *         elif (wscale * w_data_ptr[idx]) < 0.0:
  *             w_data_ptr[idx] = min(             # <<<<<<<<<<<<<<
@@ -3575,7 +3475,7 @@ static void __pyx_f_7sklearn_12linear_model_15sgd_fast_sparse_l1penalty(double *
     }
     __pyx_L5:;
 
-    /* "sklearn/linear_model/sgd_fast_sparse.pyx":272
+    /* "sklearn/linear_model/sgd_fast_sparse.pyx":280
  *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))
  * 
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
@@ -4287,7 +4187,7 @@ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_
       __Pyx_GOTREF(((PyObject *)__pyx_t_8));
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8));
       __Pyx_GIVEREF(((PyObject *)__pyx_t_8));
       __pyx_t_8 = 0;
@@ -5320,7 +5220,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(((PyObject *)__pyx_t_5));
         __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
         PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));
         __Pyx_GIVEREF(((PyObject *)__pyx_t_5));
         __pyx_t_5 = 0;
@@ -5547,9 +5447,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},
   {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0},
   {&__pyx_kp_u_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 1, 0, 0},
+  {&__pyx_n_s_18, __pyx_k_18, sizeof(__pyx_k_18), 0, 0, 1, 1},
   {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
-  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},
-  {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1},
   {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},
   {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0},
   {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},
@@ -5558,88 +5457,58 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},
   {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},
   {&__pyx_n_s__X_data, __pyx_k__X_data, sizeof(__pyx_k__X_data), 0, 0, 1, 1},
-  {&__pyx_n_s__X_data_ptr, __pyx_k__X_data_ptr, sizeof(__pyx_k__X_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__X_indices, __pyx_k__X_indices, sizeof(__pyx_k__X_indices), 0, 0, 1, 1},
-  {&__pyx_n_s__X_indices_ptr, __pyx_k__X_indices_ptr, sizeof(__pyx_k__X_indices_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__X_indptr, __pyx_k__X_indptr, sizeof(__pyx_k__X_indptr), 0, 0, 1, 1},
-  {&__pyx_n_s__X_indptr_ptr, __pyx_k__X_indptr_ptr, sizeof(__pyx_k__X_indptr_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__Y, __pyx_k__Y, sizeof(__pyx_k__Y), 0, 0, 1, 1},
-  {&__pyx_n_s__Y_data_ptr, __pyx_k__Y_data_ptr, sizeof(__pyx_k__Y_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
   {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
   {&__pyx_n_s__alpha, __pyx_k__alpha, sizeof(__pyx_k__alpha), 0, 0, 1, 1},
   {&__pyx_n_s__any, __pyx_k__any, sizeof(__pyx_k__any), 0, 0, 1, 1},
   {&__pyx_n_s__arange, __pyx_k__arange, sizeof(__pyx_k__arange), 0, 0, 1, 1},
   {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},
-  {&__pyx_n_s__class_weight, __pyx_k__class_weight, sizeof(__pyx_k__class_weight), 0, 0, 1, 1},
-  {&__pyx_n_s__count, __pyx_k__count, sizeof(__pyx_k__count), 0, 0, 1, 1},
   {&__pyx_n_s__dot, __pyx_k__dot, sizeof(__pyx_k__dot), 0, 0, 1, 1},
   {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1},
-  {&__pyx_n_s__epoch, __pyx_k__epoch, sizeof(__pyx_k__epoch), 0, 0, 1, 1},
-  {&__pyx_n_s__eta, __pyx_k__eta, sizeof(__pyx_k__eta), 0, 0, 1, 1},
   {&__pyx_n_s__eta0, __pyx_k__eta0, sizeof(__pyx_k__eta0), 0, 0, 1, 1},
   {&__pyx_n_s__fit_intercept, __pyx_k__fit_intercept, sizeof(__pyx_k__fit_intercept), 0, 0, 1, 1},
   {&__pyx_n_s__float64, __pyx_k__float64, sizeof(__pyx_k__float64), 0, 0, 1, 1},
-  {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},
-  {&__pyx_n_s__index, __pyx_k__index, sizeof(__pyx_k__index), 0, 0, 1, 1},
-  {&__pyx_n_s__index_data_ptr, __pyx_k__index_data_ptr, sizeof(__pyx_k__index_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__int32, __pyx_k__int32, sizeof(__pyx_k__int32), 0, 0, 1, 1},
   {&__pyx_n_s__intercept, __pyx_k__intercept, sizeof(__pyx_k__intercept), 0, 0, 1, 1},
   {&__pyx_n_s__isinf, __pyx_k__isinf, sizeof(__pyx_k__isinf), 0, 0, 1, 1},
   {&__pyx_n_s__isnan, __pyx_k__isnan, sizeof(__pyx_k__isnan), 0, 0, 1, 1},
   {&__pyx_n_s__learning_rate, __pyx_k__learning_rate, sizeof(__pyx_k__learning_rate), 0, 0, 1, 1},
   {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 0, 0, 1, 1},
-  {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1},
   {&__pyx_n_s__n_iter, __pyx_k__n_iter, sizeof(__pyx_k__n_iter), 0, 0, 1, 1},
-  {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1},
   {&__pyx_n_s__nonzero, __pyx_k__nonzero, sizeof(__pyx_k__nonzero), 0, 0, 1, 1},
   {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},
   {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},
-  {&__pyx_n_s__offset, __pyx_k__offset, sizeof(__pyx_k__offset), 0, 0, 1, 1},
   {&__pyx_n_s__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1},
-  {&__pyx_n_s__p, __pyx_k__p, sizeof(__pyx_k__p), 0, 0, 1, 1},
   {&__pyx_n_s__penalty_type, __pyx_k__penalty_type, sizeof(__pyx_k__penalty_type), 0, 0, 1, 1},
   {&__pyx_n_s__plain_sgd, __pyx_k__plain_sgd, sizeof(__pyx_k__plain_sgd), 0, 0, 1, 1},
   {&__pyx_n_s__power_t, __pyx_k__power_t, sizeof(__pyx_k__power_t), 0, 0, 1, 1},
-  {&__pyx_n_s__q, __pyx_k__q, sizeof(__pyx_k__q), 0, 0, 1, 1},
-  {&__pyx_n_s__q_data_ptr, __pyx_k__q_data_ptr, sizeof(__pyx_k__q_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__random, __pyx_k__random, sizeof(__pyx_k__random), 0, 0, 1, 1},
   {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},
   {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 0, 0, 1, 1},
-  {&__pyx_n_s__sample_idx, __pyx_k__sample_idx, sizeof(__pyx_k__sample_idx), 0, 0, 1, 1},
   {&__pyx_n_s__sample_weight, __pyx_k__sample_weight, sizeof(__pyx_k__sample_weight), 0, 0, 1, 1},
-  {&__pyx_n_s__sample_weight_data, __pyx_k__sample_weight_data, sizeof(__pyx_k__sample_weight_data), 0, 0, 1, 1},
   {&__pyx_n_s__seed, __pyx_k__seed, sizeof(__pyx_k__seed), 0, 0, 1, 1},
   {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},
   {&__pyx_n_s__shuffle, __pyx_k__shuffle, sizeof(__pyx_k__shuffle), 0, 0, 1, 1},
-  {&__pyx_n_s__sumloss, __pyx_k__sumloss, sizeof(__pyx_k__sumloss), 0, 0, 1, 1},
   {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},
-  {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1},
-  {&__pyx_n_s__t_start, __pyx_k__t_start, sizeof(__pyx_k__t_start), 0, 0, 1, 1},
   {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},
-  {&__pyx_n_s__typw, __pyx_k__typw, sizeof(__pyx_k__typw), 0, 0, 1, 1},
-  {&__pyx_n_s__u, __pyx_k__u, sizeof(__pyx_k__u), 0, 0, 1, 1},
-  {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1},
   {&__pyx_n_s__verbose, __pyx_k__verbose, sizeof(__pyx_k__verbose), 0, 0, 1, 1},
   {&__pyx_n_s__w, __pyx_k__w, sizeof(__pyx_k__w), 0, 0, 1, 1},
-  {&__pyx_n_s__w_data_ptr, __pyx_k__w_data_ptr, sizeof(__pyx_k__w_data_ptr), 0, 0, 1, 1},
   {&__pyx_n_s__weight_neg, __pyx_k__weight_neg, sizeof(__pyx_k__weight_neg), 0, 0, 1, 1},
   {&__pyx_n_s__weight_pos, __pyx_k__weight_pos, sizeof(__pyx_k__weight_pos), 0, 0, 1, 1},
-  {&__pyx_n_s__wnorm, __pyx_k__wnorm, sizeof(__pyx_k__wnorm), 0, 0, 1, 1},
-  {&__pyx_n_s__wscale, __pyx_k__wscale, sizeof(__pyx_k__wscale), 0, 0, 1, 1},
-  {&__pyx_n_s__xnnz, __pyx_k__xnnz, sizeof(__pyx_k__xnnz), 0, 0, 1, 1},
   {&__pyx_n_s__xrange, __pyx_k__xrange, sizeof(__pyx_k__xrange), 0, 0, 1, 1},
-  {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1},
   {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static int __Pyx_InitCachedBuiltins(void) {
   #if PY_MAJOR_VERSION >= 3
-  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #else
-  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_xrange = __Pyx_GetName(__pyx_b, __pyx_n_s__xrange); if (!__pyx_builtin_xrange) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
-  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
@@ -5651,21 +5520,29 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants");
 
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":211
+  /* "sklearn/linear_model/sgd_fast_sparse.pyx":219
  *         if np.any(np.isinf(w)) or np.any(np.isnan(w)) \
  *            or np.isnan(intercept) or np.isinf(intercept):
  *             raise ValueError("floating-point under-/overflow occured.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_5);
+  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_5));
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
   PyTuple_SET_ITEM(__pyx_k_tuple_5, 0, ((PyObject *)__pyx_kp_s_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_5));
+
+  /* "numpy.pxd":211
+ *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
+ *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
+ *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+ * 
+ *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
+ */
   __pyx_k_tuple_7 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_7);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_7));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
   PyTuple_SET_ITEM(__pyx_k_tuple_7, 0, ((PyObject *)__pyx_kp_u_6));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
@@ -5679,7 +5556,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             info.buf = PyArray_DATA(self)
  */
   __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_9);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_9));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_8));
   PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8));
@@ -5693,7 +5570,7 @@ static int __Pyx_InitCachedConstants(void) {
  *                 elif t == NPY_UBYTE:       f = "B"
  */
   __pyx_k_tuple_11 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_11);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_11));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
   PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, ((PyObject *)__pyx_kp_u_10));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
@@ -5707,7 +5584,7 @@ static int __Pyx_InitCachedConstants(void) {
  *         if ((child.byteorder == '>' and little_endian) or
  */
   __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_14);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_14));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_13));
   PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_13));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13));
@@ -5721,7 +5598,7 @@ static int __Pyx_InitCachedConstants(void) {
  *             # complain instead, BUT: < and > in format strings also imply
  */
   __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_15);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_15));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
   PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_u_10));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
@@ -5735,176 +5612,11 @@ static int __Pyx_InitCachedConstants(void) {
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
   __pyx_k_tuple_17 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_17);
+  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_17));
   __Pyx_INCREF(((PyObject *)__pyx_kp_u_16));
   PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_kp_u_16));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_16));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
-
-  /* "sklearn/linear_model/sgd_fast_sparse.pyx":34
- * @cython.wraparound(False)
- * @cython.cdivision(True)
- * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
- *               double intercept,
- *               LossFunction loss,
- */
-  __pyx_k_tuple_18 = PyTuple_New(51); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_18);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__w));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__w));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__intercept));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__loss));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__loss));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__loss));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__penalty_type));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__penalty_type));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__penalty_type));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__alpha));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__alpha));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__alpha));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__rho));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__rho));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rho));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_data));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__X_data));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_data));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_indices));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__X_indices));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_indices));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_indptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__X_indptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_indptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__Y));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__Y));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__Y));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_iter));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__n_iter));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_iter));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__fit_intercept));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__fit_intercept));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fit_intercept));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__verbose));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__verbose));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__verbose));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__shuffle));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__shuffle));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__shuffle));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__seed));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__seed));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__seed));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_pos));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__weight_pos));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_pos));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_neg));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__weight_neg));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_neg));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__sample_weight));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__learning_rate));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__learning_rate));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__learning_rate));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta0));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__eta0));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta0));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__power_t));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__power_t));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__power_t));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__n_samples));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_features));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__n_features));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_features));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__w_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__w_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__X_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_indptr_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__X_indptr_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_indptr_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__X_indices_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__X_indices_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__X_indices_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__Y_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__Y_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__Y_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight_data));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 28, ((PyObject *)__pyx_n_s__sample_weight_data));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight_data));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__index));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 29, ((PyObject *)__pyx_n_s__index));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__index));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__index_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 30, ((PyObject *)__pyx_n_s__index_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__index_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__offset));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 31, ((PyObject *)__pyx_n_s__offset));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__offset));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__xnnz));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 32, ((PyObject *)__pyx_n_s__xnnz));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__xnnz));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__wscale));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 33, ((PyObject *)__pyx_n_s__wscale));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wscale));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 34, ((PyObject *)__pyx_n_s__eta));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__p));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 35, ((PyObject *)__pyx_n_s__p));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__p));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__update));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 36, ((PyObject *)__pyx_n_s__update));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__update));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sumloss));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 37, ((PyObject *)__pyx_n_s__sumloss));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sumloss));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__wnorm));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 38, ((PyObject *)__pyx_n_s__wnorm));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wnorm));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__t));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 39, ((PyObject *)__pyx_n_s__t));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__y));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 40, ((PyObject *)__pyx_n_s__y));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__class_weight));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 41, ((PyObject *)__pyx_n_s__class_weight));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__class_weight));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__count));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 42, ((PyObject *)__pyx_n_s__count));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__count));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__epoch));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 43, ((PyObject *)__pyx_n_s__epoch));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__epoch));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 44, ((PyObject *)__pyx_n_s__i));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_idx));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 45, ((PyObject *)__pyx_n_s__sample_idx));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_idx));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__q));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 46, ((PyObject *)__pyx_n_s__q));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__q_data_ptr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 47, ((PyObject *)__pyx_n_s__q_data_ptr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q_data_ptr));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__u));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 48, ((PyObject *)__pyx_n_s__u));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__u));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__typw));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 49, ((PyObject *)__pyx_n_s__typw));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__typw));
-  __Pyx_INCREF(((PyObject *)__pyx_n_s__t_start));
-  PyTuple_SET_ITEM(__pyx_k_tuple_18, 50, ((PyObject *)__pyx_n_s__t_start));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t_start));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18));
-  __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(21, 0, 51, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__plain_sgd, 34, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -5944,8 +5656,8 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #ifdef __pyx_binding_PyCFunctionType_USED
+  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
@@ -6038,18 +5750,14 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
  * cimport numpy as np
  */
   __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__time));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__time));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__time));
   __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time);
-  if (__pyx_t_1 == NULL) {
-    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__time);
-    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__time, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -6062,7 +5770,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
  *               double intercept,
  *               LossFunction loss,
  */
-  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd, NULL, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_15sgd_fast_sparse_plain_sgd, NULL, __pyx_n_s_18); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__plain_sgd, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
@@ -6273,11 +5981,22 @@ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed
         name, type->tp_name, Py_TYPE(obj)->tp_name);
     return 0;
 }
+
 static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
   unsigned int n = 1;
   return *(unsigned char*)(&n) != 0;
 }
 
+typedef struct {
+  __Pyx_StructField root;
+  __Pyx_BufFmt_StackElem* head;
+  size_t fmt_offset;
+  size_t new_count, enc_count;
+  int is_complex;
+  char enc_type;
+  char new_packmode;
+  char enc_packmode;
+} __Pyx_BufFmt_Context;
 
 static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,
                               __Pyx_BufFmt_StackElem* stack,
@@ -6432,7 +6151,6 @@ static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {
   }
 }
 
-
 static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {
   if (ctx->head == NULL || ctx->head->field == &ctx->root) {
     const char* expected;
@@ -6652,7 +6370,7 @@ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const cha
                          "Does not understand character buffer dtype format string ('%c')", *ts);
             return NULL;
           }
-          ctx->new_count = (size_t)number;
+          ctx->new_count = (size_t)number; 
         }
     }
   }
@@ -6666,10 +6384,7 @@ static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
   buf->suboffsets = __Pyx_minusones;
 }
 
-static CYTHON_INLINE int __Pyx_GetBufferAndValidate(
-        Py_buffer* buf, PyObject* obj,  __Pyx_TypeInfo* dtype, int flags,
-        int nd, int cast, __Pyx_BufFmt_StackElem* stack)
-{
+static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) {
   if (obj == Py_None || obj == NULL) {
     __Pyx_ZeroBuffer(buf);
     return 0;
@@ -6707,8 +6422,6 @@ static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
   __Pyx_ReleaseBuffer(info);
 }
 
-
-
 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
     if (unlikely(!type)) {
         PyErr_Format(PyExc_SystemError, "Missing type object");
@@ -6720,6 +6433,7 @@ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
                  Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
+
 static void __Pyx_RaiseBufferFallbackError(void) {
   PyErr_Format(PyExc_ValueError,
      "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!");
@@ -6919,11 +6633,11 @@ static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
   if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags);
   #endif
   if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pf_5numpy_7ndarray___getbuffer__(obj, view, flags);
-        else {
-          PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name);
+  else {
+  PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name);
   return -1;
     }
-       }
+}
 
 static void __Pyx_ReleaseBuffer(Py_buffer *view) {
   PyObject* obj = view->obj;
@@ -6931,8 +6645,7 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) {
     #if PY_VERSION_HEX >= 0x02060000
     if (PyObject_CheckBuffer(obj)) {PyBuffer_Release(view); return;}
     #endif
-if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray_1__releasebuffer__(obj, view);
-    
+    if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray_1__releasebuffer__(obj, view);
     Py_DECREF(obj);
     view->obj = NULL;
   }
@@ -6988,15 +6701,6 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
-#if PY_MAJOR_VERSION < 3
-    PyErr_Format(PyExc_ImportError, "cannot import name %.230s",
-                 PyString_AsString(name));
-#else
-    PyErr_Format(PyExc_ImportError, "cannot import name %S", name);
-#endif
-}
-
 #if PY_MAJOR_VERSION < 3
 static PyObject *__Pyx_GetStdout(void) {
     PyObject *f = PySys_GetObject((char *)"stdout");
@@ -7806,7 +7510,11 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class
     py_module = __Pyx_ImportModule(module_name);
     if (!py_module)
         goto bad;
-    py_name = __Pyx_PyIdentifier_FromString(class_name);
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(class_name);
+    #else
+    py_name = PyUnicode_FromString(class_name);
+    #endif
     if (!py_name)
         goto bad;
     result = PyObject_GetAttr(py_module, py_name);
@@ -7852,7 +7560,11 @@ static PyObject *__Pyx_ImportModule(const char *name) {
     PyObject *py_name = 0;
     PyObject *py_module = 0;
 
-    py_name = __Pyx_PyIdentifier_FromString(name);
+    #if PY_MAJOR_VERSION < 3
+    py_name = PyString_FromString(name);
+    #else
+    py_name = PyUnicode_FromString(name);
+    #endif
     if (!py_name)
         goto bad;
     py_module = PyImport_Import(py_name);
@@ -7918,9 +7630,11 @@ static void __Pyx_AddTraceback(const char *funcname, int __pyx_clineno,
     if (!py_funcname) goto bad;
     py_globals = PyModule_GetDict(__pyx_m);
     if (!py_globals) goto bad;
-    py_code = __Pyx_PyCode_New(
+    py_code = PyCode_New(
         0,            /*int argcount,*/
+        #if PY_MAJOR_VERSION >= 3
         0,            /*int kwonlyargcount,*/
+        #endif
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
diff --git a/sklearn/linear_model/sgd_fast_sparse.pyx b/sklearn/linear_model/sgd_fast_sparse.pyx
index 2e9b2e18fadb41d5883f5577ca2384b90016ec0d..5f25777df3d2f9fc7712fa624c4ce8c67783d6af 100644
--- a/sklearn/linear_model/sgd_fast_sparse.pyx
+++ b/sklearn/linear_model/sgd_fast_sparse.pyx
@@ -134,12 +134,20 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
     cdef unsigned int epoch = 0
     cdef unsigned int i = 0
     cdef int sample_idx = 0
+
+    # q vector is only used for L1 regularization
     cdef np.ndarray[double, ndim=1, mode="c"] q = None
     cdef double *q_data_ptr = NULL
     if penalty_type != L2:
         q = np.zeros((n_features,), dtype=np.float64, order="c")
         q_data_ptr = <double *> q.data
     cdef double u = 0.0
+
+    if penalty_type == L2:
+        rho = 1.0
+    elif penalty_type == L1:
+        rho = 0.0
+    
     cdef double typw = sqrt(1.0 / sqrt(alpha))
 
     if learning_rate == OPTIMAL:
diff --git a/sklearn/linear_model/sparse/stochastic_gradient.py b/sklearn/linear_model/sparse/stochastic_gradient.py
index d320d32b00b61af01691686721f40444dc6613cb..7883e61857f7da095efd697fe83cf64bd14453cc 100644
--- a/sklearn/linear_model/sparse/stochastic_gradient.py
+++ b/sklearn/linear_model/sparse/stochastic_gradient.py
@@ -125,7 +125,7 @@ class SGDClassifier(BaseSGDClassifier):
     >>> clf.fit(X, y)
     SGDClassifier(alpha=0.0001, class_weight=None, eta0=0.0, fit_intercept=True,
            learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
-           penalty='l2', power_t=0.5, rho=1.0, seed=0, shuffle=False,
+           penalty='l2', power_t=0.5, rho=0.85, seed=0, shuffle=False,
            verbose=0)
     >>> print clf.predict([[-0.8, -1]])
     [1]
@@ -320,7 +320,7 @@ class SGDRegressor(BaseSGDRegressor):
     >>> clf.fit(X, y)
     SGDRegressor(alpha=0.0001, eta0=0.01, fit_intercept=True,
            learning_rate='invscaling', loss='squared_loss', n_iter=5, p=0.1,
-           penalty='l2', power_t=0.25, rho=1.0, seed=0, shuffle=False,
+           penalty='l2', power_t=0.25, rho=0.85, seed=0, shuffle=False,
            verbose=0)
 
     See also
diff --git a/sklearn/linear_model/stochastic_gradient.py b/sklearn/linear_model/stochastic_gradient.py
index 82d924fa5efef2aa0a97e8075e4df93f52c0fab0..7b1581fb9f103ecd3426dcc68911c0ed559fdca5 100644
--- a/sklearn/linear_model/stochastic_gradient.py
+++ b/sklearn/linear_model/stochastic_gradient.py
@@ -113,7 +113,7 @@ class SGDClassifier(BaseSGDClassifier):
     >>> clf.fit(X, Y)
     SGDClassifier(alpha=0.0001, class_weight=None, eta0=0.0, fit_intercept=True,
            learning_rate='optimal', loss='hinge', n_iter=5, n_jobs=1,
-           penalty='l2', power_t=0.5, rho=1.0, seed=0, shuffle=False,
+           penalty='l2', power_t=0.5, rho=0.85, seed=0, shuffle=False,
            verbose=0)
     >>> print clf.predict([[-0.8, -1]])
     [1]
@@ -291,7 +291,7 @@ class SGDRegressor(BaseSGDRegressor):
     >>> clf.fit(X, y)
     SGDRegressor(alpha=0.0001, eta0=0.01, fit_intercept=True,
            learning_rate='invscaling', loss='squared_loss', n_iter=5, p=0.1,
-           penalty='l2', power_t=0.25, rho=1.0, seed=0, shuffle=False,
+           penalty='l2', power_t=0.25, rho=0.85, seed=0, shuffle=False,
            verbose=0)
 
     See also
diff --git a/sklearn/linear_model/tests/test_sgd.py b/sklearn/linear_model/tests/test_sgd.py
index ffcccdd98012498932ce79986dae3f1d1a75a8d8..5657f9542d162df7c8f26ad03dc4e01b746a81f3 100644
--- a/sklearn/linear_model/tests/test_sgd.py
+++ b/sklearn/linear_model/tests/test_sgd.py
@@ -69,15 +69,6 @@ class DenseSGDClassifierTestCase(unittest.TestCase):
         #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
         assert_array_equal(clf.predict(T), true_result)
 
-    def test_sgd_penalties(self):
-        """Check whether penalties and hyperparameters are set properly"""
-        clf = self.factory(penalty='l2')
-        assert clf.rho == 1.0
-        clf = self.factory(penalty='l1')
-        assert clf.rho == 0.0
-        clf = self.factory(penalty='elasticnet', rho=0.85)
-        assert clf.rho == 0.85
-
     @raises(ValueError)
     def test_sgd_bad_penalty(self):
         """Check whether expected ValueError on bad penalty"""
@@ -365,15 +356,6 @@ class DenseSGDRegressorTestCase(unittest.TestCase):
         clf.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
         assert clf.coef_[0] == clf.coef_[1]
 
-    def test_sgd_penalties(self):
-        """Check whether penalties and hyperparameters are set properly"""
-        clf = self.factory(penalty='l2')
-        assert clf.rho == 1.0
-        clf = self.factory(penalty='l1')
-        assert clf.rho == 0.0
-        clf = self.factory(penalty='elasticnet', rho=0.85)
-        assert clf.rho == 0.85
-
     @raises(ValueError)
     def test_sgd_bad_penalty(self):
         """Check whether expected ValueError on bad penalty"""