From 58a432c874ad148e62ef70649d14031e592923bf Mon Sep 17 00:00:00 2001 From: Peter Prettenhofer Date: Tue, 19 Oct 2010 00:00:25 +0200 Subject: [PATCH 01/17] initial checkin of sgd package. plain sgd with l2 penalty and hinge loss should work... --- .../mlcomp_sparse_document_classification.py | 2 +- scikits/learn/__init__.py | 3 +- scikits/learn/setup.py | 1 + scikits/learn/sgd/__init__.py | 8 + scikits/learn/sgd/base.py | 97 + scikits/learn/sgd/setup.py | 25 + scikits/learn/sgd/sparse/__init__.py | 10 + scikits/learn/sgd/sparse/setup.py | 29 + scikits/learn/sgd/sparse/sgd.py | 122 + .../learn/sgd/sparse/src/sgd_fast_sparse.c | 11364 ++++++++++++++++ .../learn/sgd/sparse/src/sgd_fast_sparse.html | 3623 +++++ .../learn/sgd/sparse/src/sgd_fast_sparse.pyx | 521 + scikits/learn/sgd/tests/__init__.py | 0 scikits/learn/sgd/tests/test_sparse.py | 50 + 14 files changed, 15853 insertions(+), 2 deletions(-) create mode 100644 scikits/learn/sgd/__init__.py create mode 100644 scikits/learn/sgd/base.py create mode 100644 scikits/learn/sgd/setup.py create mode 100644 scikits/learn/sgd/sparse/__init__.py create mode 100644 scikits/learn/sgd/sparse/setup.py create mode 100644 scikits/learn/sgd/sparse/sgd.py create mode 100644 scikits/learn/sgd/sparse/src/sgd_fast_sparse.c create mode 100644 scikits/learn/sgd/sparse/src/sgd_fast_sparse.html create mode 100644 scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx create mode 100644 scikits/learn/sgd/tests/__init__.py create mode 100644 scikits/learn/sgd/tests/test_sparse.py diff --git a/examples/mlcomp_sparse_document_classification.py b/examples/mlcomp_sparse_document_classification.py index 70f91c2ccc0e0..639678cf29a17 100644 --- a/examples/mlcomp_sparse_document_classification.py +++ b/examples/mlcomp_sparse_document_classification.py @@ -43,7 +43,7 @@ import pylab as pl from scikits.learn.datasets import load_mlcomp -from scikits.learn.sparse.svm import LinearSVC +from scikits.learn.svm.sparse import LinearSVC from scikits.learn.metrics import confusion_matrix if 'MLCOMP_DATASETS_HOME' not in os.environ: diff --git a/scikits/learn/__init__.py b/scikits/learn/__init__.py index e0861fc5e3a47..3985d68e53e28 100644 --- a/scikits/learn/__init__.py +++ b/scikits/learn/__init__.py @@ -26,6 +26,7 @@ from . import metrics from . import svm from . import feature_selection +from . import sgd try: from numpy.testing import nosetester @@ -45,7 +46,7 @@ def test(self, label='fast', verbose=1, extra_argv=['--exe'], __all__ = ['cross_val', 'ball_tree', 'cluster', 'covariance', 'datasets', 'gmm', 'glm', 'logistic', 'lda', 'metrics', 'svm', 'features', 'clone', - 'test'] + 'test', 'sgd'] __version__ = '0.6.git' diff --git a/scikits/learn/setup.py b/scikits/learn/setup.py index 01e4b91d07cf5..c163e28aadfb0 100644 --- a/scikits/learn/setup.py +++ b/scikits/learn/setup.py @@ -10,6 +10,7 @@ def configuration(parent_package='', top_path=None): config = Configuration('learn', parent_package, top_path) config.add_subpackage('svm') + config.add_subpackage('sgd') config.add_subpackage('datasets') config.add_subpackage('feature_extraction') config.add_subpackage('feature_extraction/tests') diff --git a/scikits/learn/sgd/__init__.py b/scikits/learn/sgd/__init__.py new file mode 100644 index 0000000000000..6022a53f5d72d --- /dev/null +++ b/scikits/learn/sgd/__init__.py @@ -0,0 +1,8 @@ +""" +Module that implements Stochastic Gradient Descent related algorithms. + +See http://scikit-learn.sourceforge.net/modules/sgd.html for complete +documentation. +""" + +from . import sparse diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py new file mode 100644 index 0000000000000..79ca734179834 --- /dev/null +++ b/scikits/learn/sgd/base.py @@ -0,0 +1,97 @@ +# Author: Peter Prettenhofer +# +# License: BSD Style. +"""Stochastic Gradient Descent (SGD) with sparse data. """ + +import numpy as np +from scipy import sparse + +from ..base import BaseEstimator + + +class LinearModel(BaseEstimator): + """Linear Model trained by minimizing a regularized training + error using SGD. + + Parameters + ---------- + loss : Loss + The loss function to be used. + penalty : str, ('l2'|'l1'|'elasticnet') + The penalty (aka regularization term) to be used. + alpha : float + Constant that multiplies the penalty. Defaults to 0.0001. + rho : float + The ElasticNet mixing parameter, with 0 < rho <= 1. + coef_ : ndarray of shape n_features + The initial coeffients to warm-start the optimization + fit_intercept: bool + Whether the intercept should be estimated or not. If False, the + data is assumed to be already centered. + + Attributes + ---------- + `coef_` : array, shape = [n_features] + Weights asigned to the features. + + `intercept_` : float, shape = [n_class-1] + Constants in decision function. + + """ + + def __init__(self, penalty='l2', loss="hinge", alpha = 0.0001, + rho = 0.85, coef_ = None, intercept_ = 0.0, + fit_intercept = True): + self.penalty = penalty + self.loss = loss + self.alpha = alpha + self.rho = rho + self.coef_ = coef_ + self.intercept_ = intercept_ + self.fit_intercept = fit_intercept + self._get_penalty_type() + + def _get_penalty_type(self): + penalty_types = {"l2":2, "l1":1, "elasticnet":3} + try: + self.penalty_type = penalty_types[self.penalty] + except KeyError: + raise ValueError("The penalty %s is not supported. " % self.penalty) + + def predict(self, X): + """Predict using the linear model + + Parameters + ---------- + X : numpy array of shape [n_samples, n_features] + + Returns + ------- + C : array, shape = [n_samples] + Returns predicted class labeles (either 1 or -1 or 0). + """ + X = np.asanyarray(X) + # FIXME what if prediction is 0 - break randomly? + return np.sign(np.dot(X, self.coef_) + self.intercept_) + + def predict_margin(self, T): + """Predict signed 'distance' to the hyperplane (aka confidence score). + + If + + Parameters + ---------- + X : numpy array of shape [n_samples, n_features] + + Returns + ------- + C : array, shape = [n_samples] + Returns signed 'distance' to the hyperplane + """ + X = np.asanyarray(X) + return np.dot(X, self.coef_) + self.intercept_ + + def predict_proba(self, T): + # how can this be, logisitic *does* implement this + raise NotImplementedError( + 'sgd does not provide this functionality') diff --git a/scikits/learn/sgd/setup.py b/scikits/learn/sgd/setup.py new file mode 100644 index 0000000000000..b0e6f55cce7f2 --- /dev/null +++ b/scikits/learn/sgd/setup.py @@ -0,0 +1,25 @@ +from os.path import join +import warnings +import numpy +import sys +from ConfigParser import ConfigParser + +def configuration(parent_package='', top_path=None): + from numpy.distutils.misc_util import Configuration + from numpy.distutils.system_info import get_info, get_standard_file, BlasNotFoundError + config = Configuration('sgd', parent_package, top_path) + + site_cfg = ConfigParser() + site_cfg.read(get_standard_file('site.cfg')) + + + + # add other directories + config.add_subpackage('tests') + config.add_subpackage('sparse') + + return config + +if __name__ == '__main__': + from numpy.distutils.core import setup + setup(**configuration(top_path='').todict()) diff --git a/scikits/learn/sgd/sparse/__init__.py b/scikits/learn/sgd/sparse/__init__.py new file mode 100644 index 0000000000000..4cac8023e9ed2 --- /dev/null +++ b/scikits/learn/sgd/sparse/__init__.py @@ -0,0 +1,10 @@ +""" +Stochastic gradient descent with sparse data +========================================== + +scikits.learn.sgd.sparse is the sparse counterpart +of scikits.learn.sgd + +""" + +from .sgd import SGD diff --git a/scikits/learn/sgd/sparse/setup.py b/scikits/learn/sgd/sparse/setup.py new file mode 100644 index 0000000000000..d536051a7c3ba --- /dev/null +++ b/scikits/learn/sgd/sparse/setup.py @@ -0,0 +1,29 @@ +from os.path import join +import warnings +import numpy +import sys +from ConfigParser import ConfigParser + +def configuration(parent_package='', top_path=None): + from numpy.distutils.misc_util import Configuration + from numpy.distutils.system_info import get_info + from numpy.distutils.system_info import get_standard_file + from numpy.distutils.system_info import BlasNotFoundError + + config = Configuration('sparse', parent_package, top_path) + + site_cfg = ConfigParser() + site_cfg.read(get_standard_file('site.cfg')) + + config.add_extension('sgd_fast_sparse', + sources=[join('src', 'sgd_fast_sparse.c')], + include_dirs=[numpy.get_include()] + ) + + # add other directories + config.add_subpackage('tests') + return config + +if __name__ == '__main__': + from numpy.distutils.core import setup + setup(**configuration(top_path='').todict()) diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py new file mode 100644 index 0000000000000..b7e03cee3c3e1 --- /dev/null +++ b/scikits/learn/sgd/sparse/sgd.py @@ -0,0 +1,122 @@ +# Author: Peter Prettenhofer +# +# License: BSD Style. +"""Implementation of Stochastic Gradient Descent (SGD) with sparse data.""" + +import warnings +import numpy as np +from scipy import sparse + +from ...base import ClassifierMixin +from ..base import LinearModel +from . import sgd_fast_sparse + +class SGD(LinearModel, ClassifierMixin): + """Linear Model trained by minimizing a regularized training + error using SGD. + + This implementation works on scipy.sparse X and dense coef_. + + Parameters + ---------- + loss : Loss + The loss function to be used. + penalty : str, ('l2'|'l1'|'elasticnet') + The penalty (aka regularization term) to be used. + reg : float + The regularization parameter, i.e. tradeoff between loss and penalty. + alpha : float + Constant that multiplies the L1 term. Defaults to 1.0 + rho : float + The ElasticNet mixing parameter, with 0 < rho <= 1. + coef_ : ndarray of shape n_features + The initial coeffients to warm-start the optimization + intercept_ : float + The initial intercept to warm-start the optimization + fit_intercept: bool + Whether the intercept should be estimated or not. If False, the + data is assumed to be already centered. + + Attributes + ---------- + `coef_` : array, shape = [n_features] + Weights asigned to the features. + + `intercept_` : float, shape = [n_class-1] + Constants in decision function. + + """ + + def _set_coef(self, coef_): + self.coef_ = coef_ + if coef_ is None: + self.sparse_coef_ = None + else: + n_features = len(coef_) + # sparse representation of the fitted coef for the predict method + self.sparse_coef_ = sparse.csr_matrix(coef_) + + def fit(self, X, Y, n_iter=5, **params): + """Fit current model with SGD + + X is expected to be a sparse matrix. For maximum efficiency, use a + sparse matrix in CSR format (scipy.sparse.csr_matrix) + """ + self._set_params(**params) + X = sparse.csr_matrix(X) + Y = np.asanyarray(Y, dtype = np.float64) + + n_samples, n_features = X.shape[0], X.shape[1] + if self.coef_ is None: + self.coef_ = np.zeros(n_features, dtype=np.float64, order = "c") + + X_data = np.array(X.data, np.float32, order = "c") + X_indices = X.indices + X_indptr = X.indptr + loss = sgd_fast_sparse.Hinge() + verbose = 2 + shuffle = 0 + coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_, self.intercept_, + loss, int(self.penalty_type), + self.alpha, self.rho, X_data, + X_indices, X_indptr, Y, + int(n_iter), + int(self.fit_intercept), + int(verbose), int(shuffle)) + + # update self.coef_ and self.sparse_coef_ consistently + self._set_coef(coef_) + self.intercept_ = intercept_ + + # return self for chaining fit and predict calls + return self + + ## def predict(self, X): +## """Predict using the linear model + +## Parameters +## ---------- +## X : numpy array of shape [n_samples, n_features] + +## Returns +## ------- +## C : array, shape = [n_samples] +## Returns predicted class labeles (either 1 or -1 or 0). +## """ +## raise NotImplemented("not implemented yet") + +## def predict_margin(self, T): +## """Predict signed 'distance' to the hyperplane (aka confidence score). + +## If + +## Parameters +## ---------- +## X : numpy array of shape [n_samples, n_features] + +## Returns +## ------- +## C : array, shape = [n_samples] +## Returns signed 'distance' to the hyperplane +## """ +## raise NotImplemented("not implemented yet") diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c new file mode 100644 index 0000000000000..1ebb232581b43 --- /dev/null +++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c @@ -0,0 +1,11364 @@ +/* Generated by Cython 0.12.1 on Mon Oct 18 23:48:21 2010 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#include "structmember.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#else + +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#if PY_VERSION_HEX < 0x02040000 + #define METH_COEXIST 0 + #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) + #define PyDict_Contains(d,o) PySequence_Contains(d,o) +#endif + +#if PY_VERSION_HEX < 0x02050000 + typedef int Py_ssize_t; + #define PY_SSIZE_T_MAX INT_MAX + #define PY_SSIZE_T_MIN INT_MIN + #define PY_FORMAT_SIZE_T "" + #define PyInt_FromSsize_t(z) PyInt_FromLong(z) + #define PyInt_AsSsize_t(o) PyInt_AsLong(o) + #define PyNumber_Index(o) PyNumber_Int(o) + #define PyIndex_Check(o) PyNumber_Check(o) + #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) +#endif + +#if PY_VERSION_HEX < 0x02060000 + #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) + #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) + #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + #define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + #define PyType_Modified(t) + + typedef struct { + void *buf; + PyObject *obj; + Py_ssize_t len; + Py_ssize_t itemsize; + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; + } Py_buffer; + + #define PyBUF_SIMPLE 0 + #define PyBUF_WRITABLE 0x0001 + #define PyBUF_FORMAT 0x0004 + #define PyBUF_ND 0x0008 + #define PyBUF_STRIDES (0x0010 | PyBUF_ND) + #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) + #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) + #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) + #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + +#endif + +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#endif + +#if PY_MAJOR_VERSION >= 3 + #define Py_TPFLAGS_CHECKTYPES 0 + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif + +#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyString_Type PyUnicode_Type + #define PyString_CheckExact PyUnicode_CheckExact +#else + #define PyBytes_Type PyString_Type + #define PyBytes_CheckExact PyString_CheckExact +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) + +#endif + +#if PY_MAJOR_VERSION >= 3 + #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func) +#endif + +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#else + #define _USE_MATH_DEFINES +#endif + +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) +#else + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) +#endif + +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_NAMESTR(n) ((char *)(n)) + #define __Pyx_DOCSTR(n) ((char *)(n)) +#else + #define __Pyx_NAMESTR(n) (n) + #define __Pyx_DOCSTR(n) (n) +#endif +#ifdef __cplusplus +#define __PYX_EXTERN_C extern "C" +#else +#define __PYX_EXTERN_C extern +#endif +#include +#define __PYX_HAVE_API__sgd_fast_sparse +#include "stdlib.h" +#include "stdio.h" +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#include "math.h" + +#ifndef CYTHON_INLINE + #if defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #else + #define CYTHON_INLINE + #endif +#endif + +typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ + + +/* Type Conversion Predeclarations */ + +#if PY_MAJOR_VERSION < 3 +#define __Pyx_PyBytes_FromString PyString_FromString +#define __Pyx_PyBytes_FromStringAndSize PyString_FromStringAndSize +#define __Pyx_PyBytes_AsString PyString_AsString +#else +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +#define __Pyx_PyBytes_AsString PyBytes_AsString +#endif + +#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s) +#define __Pyx_PyBytes_AsUString(s) ((unsigned char*) __Pyx_PyBytes_AsString(s)) + +#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); + +#if !defined(T_PYSSIZET) +#if PY_VERSION_HEX < 0x02050000 +#define T_PYSSIZET T_INT +#elif !defined(T_LONGLONG) +#define T_PYSSIZET \ + ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ + ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1)) +#else +#define T_PYSSIZET \ + ((sizeof(Py_ssize_t) == sizeof(int)) ? T_INT : \ + ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : \ + ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1))) +#endif +#endif + + +#if !defined(T_ULONGLONG) +#define __Pyx_T_UNSIGNED_INT(x) \ + ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \ + ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \ + ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : -1)))) +#else +#define __Pyx_T_UNSIGNED_INT(x) \ + ((sizeof(x) == sizeof(unsigned char)) ? T_UBYTE : \ + ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \ + ((sizeof(x) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(x) == sizeof(unsigned long)) ? T_ULONG : \ + ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1))))) +#endif +#if !defined(T_LONGLONG) +#define __Pyx_T_SIGNED_INT(x) \ + ((sizeof(x) == sizeof(char)) ? T_BYTE : \ + ((sizeof(x) == sizeof(short)) ? T_SHORT : \ + ((sizeof(x) == sizeof(int)) ? T_INT : \ + ((sizeof(x) == sizeof(long)) ? T_LONG : -1)))) +#else +#define __Pyx_T_SIGNED_INT(x) \ + ((sizeof(x) == sizeof(char)) ? T_BYTE : \ + ((sizeof(x) == sizeof(short)) ? T_SHORT : \ + ((sizeof(x) == sizeof(int)) ? T_INT : \ + ((sizeof(x) == sizeof(long)) ? T_LONG : \ + ((sizeof(x) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1))))) +#endif + +#define __Pyx_T_FLOATING(x) \ + ((sizeof(x) == sizeof(float)) ? T_FLOAT : \ + ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1)) + +#if !defined(T_SIZET) +#if !defined(T_ULONGLONG) +#define T_SIZET \ + ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1)) +#else +#define T_SIZET \ + ((sizeof(size_t) == sizeof(unsigned int)) ? T_UINT : \ + ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : \ + ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1))) +#endif +#endif + +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); + +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) + + +#ifdef __GNUC__ +/* Test for GCC > 2.95 */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else /* __GNUC__ > 2 ... */ +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ > 2 ... */ +#else /* __GNUC__ */ +#define likely(x) (x) +#define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; +static const char **__pyx_f; + + +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif + +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + +typedef npy_int8 __pyx_t_5numpy_int8_t; + +typedef npy_int16 __pyx_t_5numpy_int16_t; + +typedef npy_int32 __pyx_t_5numpy_int32_t; + +typedef npy_int64 __pyx_t_5numpy_int64_t; + +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +typedef npy_float32 __pyx_t_5numpy_float32_t; + +typedef npy_float64 __pyx_t_5numpy_float64_t; + +typedef npy_long __pyx_t_5numpy_int_t; + +typedef npy_longlong __pyx_t_5numpy_long_t; + +typedef npy_intp __pyx_t_5numpy_intp_t; + +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +typedef npy_ulong __pyx_t_5numpy_uint_t; + +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +typedef npy_double __pyx_t_5numpy_float_t; + +typedef npy_double __pyx_t_5numpy_double_t; + +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; + +typedef __pyx_t_5numpy_float64_t __pyx_t_15sgd_fast_sparse_DOUBLE; + +typedef __pyx_t_5numpy_float32_t __pyx_t_15sgd_fast_sparse_FLOAT; + +typedef __pyx_t_5numpy_int32_t __pyx_t_15sgd_fast_sparse_INTEGER; + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif + +/* Type declarations */ + +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":31 + * # ---------------------------------------- + * + * cdef class LossFunction: # <<<<<<<<<<<<<< + * """Base class for convex loss functions""" + * cpdef double loss(self, double p, double y): + */ + +struct __pyx_obj_15sgd_fast_sparse_LossFunction { + PyObject_HEAD + struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52 + * raise NotImplementedError() + * + * cdef class Regression(LossFunction): # <<<<<<<<<<<<<< + * """Base class for loss functions for regression.""" + * cpdef double loss(self,double p,double y): + */ + +struct __pyx_obj_15sgd_fast_sparse_Regression { + struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151 + * return SquaredError,() + * + * cdef class Huber(Regression): # <<<<<<<<<<<<<< + * """ + * """ + */ + +struct __pyx_obj_15sgd_fast_sparse_Huber { + struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base; + double c; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140 + * return Log,() + * + * cdef class SquaredError(Regression): # <<<<<<<<<<<<<< + * """ + * """ + */ + +struct __pyx_obj_15sgd_fast_sparse_SquaredError { + struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60 + * + * + * cdef class Classification(LossFunction): # <<<<<<<<<<<<<< + * """Base class for loss functions for classification.""" + * cpdef double loss(self,double p,double y): + */ + +struct __pyx_obj_15sgd_fast_sparse_Classification { + struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98 + * return ModifiedHuber,() + * + * cdef class Hinge(Classification): # <<<<<<<<<<<<<< + * """SVM classification loss for binary + * classification tasks with y in {-1,1}. + */ + +struct __pyx_obj_15sgd_fast_sparse_Hinge { + struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67 + * raise NotImplementedError() + * + * cdef class ModifiedHuber(Classification): # <<<<<<<<<<<<<< + * """Modified Huber loss function for binary + * classification tasks with y in {-1,1}. + */ + +struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber { + struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base; +}; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117 + * + * + * cdef class Log(Classification): # <<<<<<<<<<<<<< + * """Logistic regression loss for binary classification + * tasks with y in {-1,1}. + */ + +struct __pyx_obj_15sgd_fast_sparse_Log { + struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base; +}; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":31 + * # ---------------------------------------- + * + * cdef class LossFunction: # <<<<<<<<<<<<<< + * """Base class for convex loss functions""" + * cpdef double loss(self, double p, double y): + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction { + double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch); + double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch); +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52 + * raise NotImplementedError() + * + * cdef class Regression(LossFunction): # <<<<<<<<<<<<<< + * """Base class for loss functions for regression.""" + * cpdef double loss(self,double p,double y): + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_Regression { + struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140 + * return Log,() + * + * cdef class SquaredError(Regression): # <<<<<<<<<<<<<< + * """ + * """ + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError { + struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151 + * return SquaredError,() + * + * cdef class Huber(Regression): # <<<<<<<<<<<<<< + * """ + * """ + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_Huber { + struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60 + * + * + * cdef class Classification(LossFunction): # <<<<<<<<<<<<<< + * """Base class for loss functions for classification.""" + * cpdef double loss(self,double p,double y): + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_Classification { + struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98 + * return ModifiedHuber,() + * + * cdef class Hinge(Classification): # <<<<<<<<<<<<<< + * """SVM classification loss for binary + * classification tasks with y in {-1,1}. + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge { + struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67 + * raise NotImplementedError() + * + * cdef class ModifiedHuber(Classification): # <<<<<<<<<<<<<< + * """Modified Huber loss function for binary + * classification tasks with y in {-1,1}. + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber { + struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber; + + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117 + * + * + * cdef class Log(Classification): # <<<<<<<<<<<<<< + * """Logistic regression loss for binary classification + * tasks with y in {-1,1}. + */ + +struct __pyx_vtabstruct_15sgd_fast_sparse_Log { + struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base; +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_sparse_Log; + +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif + +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); + end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; + } + #define __Pyx_RefNannySetupContext(name) void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) + #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0) +#else + #define __Pyx_RefNannySetupContext(name) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) +#endif /* CYTHON_REFNANNY */ +#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0) +#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0) + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, PyObject* kw_name); /*proto*/ + +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ + +/* Run-time type information about structs used with buffers */ +struct __Pyx_StructField_; + +typedef struct { + const char* name; /* for error messages only */ + struct __Pyx_StructField_* fields; + size_t size; /* sizeof(type) */ + char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */ +} __Pyx_TypeInfo; + +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; + +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; + + +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); +static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ + +static void __Pyx_RaiseBufferFallbackError(void); /*proto*/ +#define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0) +#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) + + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} + + +#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); +} + +#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + if (likely(o != Py_None)) { + if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { + PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); + Py_INCREF(r); + return r; + } + } + return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); +} + + +#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \ + __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i))) + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) { + 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) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + } + else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) { + r = PySequence_GetItem(o, i); + } + else { + r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i)); + } + return r; +} + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void); + +static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/ +static int __Pyx_EndUnpack(PyObject *); /*proto*/ + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/ + +static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact); /*proto*/ +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); +static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else +#define __Pyx_GetBuffer PyObject_GetBuffer +#define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + +Py_ssize_t __Pyx_zeros[] = {0}; +Py_ssize_t __Pyx_minusones[] = {-1}; + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ + +static int __Pyx_Print(PyObject *, int); /*proto*/ +#if PY_MAJOR_VERSION >= 3 +static PyObject* __pyx_print = 0; +static PyObject* __pyx_print_kwargs = 0; +#endif + +static int __Pyx_PrintOne(PyObject *o); /*proto*/ + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif + +#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eqf(a, b) ((a)==(b)) + #define __Pyx_c_sumf(a, b) ((a)+(b)) + #define __Pyx_c_difff(a, b) ((a)-(b)) + #define __Pyx_c_prodf(a, b) ((a)*(b)) + #define __Pyx_c_quotf(a, b) ((a)/(b)) + #define __Pyx_c_negf(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zerof(z) ((z)==(float)0) + #define __Pyx_c_conjf(z) (::std::conj(z)) + /*#define __Pyx_c_absf(z) (::std::abs(z))*/ + #else + #define __Pyx_c_is_zerof(z) ((z)==0) + #define __Pyx_c_conjf(z) (conjf(z)) + /*#define __Pyx_c_absf(z) (cabsf(z))*/ + #endif +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); + /*static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);*/ +#endif + +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq(a, b) ((a)==(b)) + #define __Pyx_c_sum(a, b) ((a)+(b)) + #define __Pyx_c_diff(a, b) ((a)-(b)) + #define __Pyx_c_prod(a, b) ((a)*(b)) + #define __Pyx_c_quot(a, b) ((a)/(b)) + #define __Pyx_c_neg(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero(z) ((z)==(double)0) + #define __Pyx_c_conj(z) (::std::conj(z)) + /*#define __Pyx_c_abs(z) (::std::abs(z))*/ + #else + #define __Pyx_c_is_zero(z) ((z)==0) + #define __Pyx_c_conj(z) (conj(z)) + /*#define __Pyx_c_abs(z) (cabs(z))*/ + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); + /*static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);*/ +#endif + +static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); + +static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); + +static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); + +static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); + +static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); + +static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); + +static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); + +static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); + +static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); + +static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); + +static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); + +static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); + +static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); + +static void __Pyx_WriteUnraisable(const char *name); /*proto*/ + +static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ + +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict); /*proto*/ + +static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ + +static void __Pyx_AddTraceback(const char *funcname); /*proto*/ + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ +/* Module declarations from python_buffer */ + +/* Module declarations from python_ref */ + +/* Module declarations from stdlib */ + +/* Module declarations from stdio */ + +/* Module declarations from numpy */ + +/* Module declarations from numpy */ + +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/ +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ +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 */ + +/* Module declarations from sgd_fast_sparse */ + +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_LossFunction = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Regression = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Classification = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_ModifiedHuber = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Hinge = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Log = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_SquaredError = 0; +static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Huber = 0; +static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(__pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/ +static CYTHON_INLINE __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_min(__pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/ +static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_t_15sgd_fast_sparse_FLOAT *, __pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_INTEGER); /*proto*/ +static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_add(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_FLOAT *, __pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE = { "sgd_fast_sparse.DOUBLE", NULL, sizeof(__pyx_t_15sgd_fast_sparse_DOUBLE), 'R' }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_FLOAT = { "sgd_fast_sparse.FLOAT", NULL, sizeof(__pyx_t_15sgd_fast_sparse_FLOAT), 'R' }; +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER = { "sgd_fast_sparse.INTEGER", NULL, sizeof(__pyx_t_15sgd_fast_sparse_INTEGER), 'I' }; +#define __Pyx_MODULE_NAME "sgd_fast_sparse" +int __pyx_module_is_main_sgd_fast_sparse = 0; + +/* Implementation of sgd_fast_sparse */ +static PyObject *__pyx_builtin_NotImplementedError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_RuntimeError; +static char __pyx_k_1[] = "-- Epoch %d"; +static char __pyx_k_2[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f"; +static char __pyx_k_3[] = "Total training time: %.2f seconds."; +static char __pyx_k_4[] = "floating-point under-/overflow occured."; +static char __pyx_k_5[] = "ndarray is not C contiguous"; +static char __pyx_k_6[] = "ndarray is not Fortran contiguous"; +static char __pyx_k_7[] = "Non-native byte order not supported"; +static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)"; +static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd"; +static char __pyx_k_10[] = "Format string allocated too short."; +static char __pyx_k_11[] = "LossFunction.loss (line 33)"; +static char __pyx_k_12[] = "LossFunction.dloss (line 42)"; +static char __pyx_k_13[] = "plain_sgd (line 181)"; +static char __pyx_k__B[] = "B"; +static char __pyx_k__H[] = "H"; +static char __pyx_k__I[] = "I"; +static char __pyx_k__L[] = "L"; +static char __pyx_k__O[] = "O"; +static char __pyx_k__Q[] = "Q"; +static char __pyx_k__Y[] = "Y"; +static char __pyx_k__b[] = "b"; +static char __pyx_k__c[] = "c"; +static char __pyx_k__d[] = "d"; +static char __pyx_k__f[] = "f"; +static char __pyx_k__g[] = "g"; +static char __pyx_k__h[] = "h"; +static char __pyx_k__i[] = "i"; +static char __pyx_k__l[] = "l"; +static char __pyx_k__p[] = "p"; +static char __pyx_k__q[] = "q"; +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__buf[] = "buf"; +static char __pyx_k__dot[] = "dot"; +static char __pyx_k__obj[] = "obj"; +static char __pyx_k__rho[] = "rho"; +static char __pyx_k__sys[] = "sys"; +static char __pyx_k__base[] = "base"; +static char __pyx_k__data[] = "data"; +static char __pyx_k__loss[] = "loss"; +static char __pyx_k__ndim[] = "ndim"; +static char __pyx_k__time[] = "time"; +static char __pyx_k__alpha[] = "alpha"; +static char __pyx_k__descr[] = "descr"; +static char __pyx_k__dloss[] = "dloss"; +static char __pyx_k__dtype[] = "dtype"; +static char __pyx_k__int32[] = "int32"; +static char __pyx_k__isinf[] = "isinf"; +static char __pyx_k__isnan[] = "isnan"; +static char __pyx_k__names[] = "names"; +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__zeros[] = "zeros"; +static char __pyx_k__X_data[] = "X_data"; +static char __pyx_k__arange[] = "arange"; +static char __pyx_k__fields[] = "fields"; +static char __pyx_k__format[] = "format"; +static char __pyx_k__n_iter[] = "n_iter"; +static char __pyx_k__random[] = "random"; +static char __pyx_k__float64[] = "float64"; +static char __pyx_k__nonzero[] = "nonzero"; +static char __pyx_k__shuffle[] = "shuffle"; +static char __pyx_k__strides[] = "strides"; +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__itemsize[] = "itemsize"; +static char __pyx_k__readonly[] = "readonly"; +static char __pyx_k__type_num[] = "type_num"; +static char __pyx_k__X_indices[] = "X_indices"; +static char __pyx_k__byteorder[] = "byteorder"; +static char __pyx_k__intercept[] = "intercept"; +static char __pyx_k__plain_sgd[] = "plain_sgd"; +static char __pyx_k__ValueError[] = "ValueError"; +static char __pyx_k__suboffsets[] = "suboffsets"; +static char __pyx_k__LossFunction[] = "LossFunction"; +static char __pyx_k__RuntimeError[] = "RuntimeError"; +static char __pyx_k__penalty_type[] = "penalty_type"; +static char __pyx_k__fit_intercept[] = "fit_intercept"; +static char __pyx_k__NotImplementedError[] = "NotImplementedError"; +static PyObject *__pyx_kp_s_1; +static PyObject *__pyx_kp_u_10; +static PyObject *__pyx_kp_u_11; +static PyObject *__pyx_kp_u_12; +static PyObject *__pyx_kp_u_13; +static PyObject *__pyx_kp_s_2; +static PyObject *__pyx_kp_s_3; +static PyObject *__pyx_kp_s_4; +static PyObject *__pyx_kp_u_5; +static PyObject *__pyx_kp_u_6; +static PyObject *__pyx_kp_u_7; +static PyObject *__pyx_kp_u_8; +static PyObject *__pyx_kp_u_9; +static PyObject *__pyx_n_s__LossFunction; +static PyObject *__pyx_n_s__NotImplementedError; +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_indices; +static PyObject *__pyx_n_s__X_indptr; +static PyObject *__pyx_n_s__Y; +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__base; +static PyObject *__pyx_n_s__buf; +static PyObject *__pyx_n_s__byteorder; +static PyObject *__pyx_n_s__c; +static PyObject *__pyx_n_s__data; +static PyObject *__pyx_n_s__descr; +static PyObject *__pyx_n_s__dloss; +static PyObject *__pyx_n_s__dot; +static PyObject *__pyx_n_s__dtype; +static PyObject *__pyx_n_s__fields; +static PyObject *__pyx_n_s__fit_intercept; +static PyObject *__pyx_n_s__float64; +static PyObject *__pyx_n_s__format; +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__itemsize; +static PyObject *__pyx_n_s__loss; +static PyObject *__pyx_n_s__n_iter; +static PyObject *__pyx_n_s__names; +static PyObject *__pyx_n_s__ndim; +static PyObject *__pyx_n_s__nonzero; +static PyObject *__pyx_n_s__np; +static PyObject *__pyx_n_s__numpy; +static PyObject *__pyx_n_s__obj; +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__random; +static PyObject *__pyx_n_s__range; +static PyObject *__pyx_n_s__readonly; +static PyObject *__pyx_n_s__rho; +static PyObject *__pyx_n_s__shape; +static PyObject *__pyx_n_s__shuffle; +static PyObject *__pyx_n_s__strides; +static PyObject *__pyx_n_s__suboffsets; +static PyObject *__pyx_n_s__sys; +static PyObject *__pyx_n_s__time; +static PyObject *__pyx_n_s__type_num; +static PyObject *__pyx_n_s__verbose; +static PyObject *__pyx_n_s__w; +static PyObject *__pyx_n_s__y; +static PyObject *__pyx_n_s__zeros; +static PyObject *__pyx_int_15; + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33 + * cdef class LossFunction: + * """Base class for convex loss functions""" + * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< + * """Evaluate the loss function. + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("loss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __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 = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":41 + * :type y: double + * :returns: double""" + * raise NotImplementedError() # <<<<<<<<<<<<<< + * cpdef double dloss(self, double p, double y): + * """Evaluate the derivative of the loss function. + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33 + * cdef class LossFunction: + * """Base class for convex loss functions""" + * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< + * """Evaluate the loss function. + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n \n :arg p: The prediction.\n :type p: double\n :arg y: The true value.\n :type y: double\n :returns: double"; +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __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 = 33; __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 = 33; __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 = 33; __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 = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":42 + * :returns: double""" + * raise NotImplementedError() + * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< + * """Evaluate the derivative of the loss function. + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("dloss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __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 = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":50 + * :type y: double + * :returns: double""" + * raise NotImplementedError() # <<<<<<<<<<<<<< + * + * cdef class Regression(LossFunction): + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":42 + * :returns: double""" + * raise NotImplementedError() + * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< + * """Evaluate the derivative of the loss function. + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n \n :arg p: The prediction.\n :type p: double\n :arg y: The true value.\n :type y: double\n :returns: double"; +static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __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 = 42; __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 = 42; __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 = 42; __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 = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54 + * cdef class Regression(LossFunction): + * """Base class for loss functions for regression.""" + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("loss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __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 = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55 + * """Base class for loss functions for regression.""" + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() # <<<<<<<<<<<<<< + * cpdef double dloss(self,double p,double y): + * raise NotImplementedError() + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54 + * cdef class Regression(LossFunction): + * """Base class for loss functions for regression.""" + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __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 = 54; __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 = 54; __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 = 54; __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 = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56 + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("dloss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57 + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + * raise NotImplementedError() # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56 + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __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 = 56; __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 = 56; __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62 + * cdef class Classification(LossFunction): + * """Base class for loss functions for classification.""" + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("loss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __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 = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63 + * """Base class for loss functions for classification.""" + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() # <<<<<<<<<<<<<< + * cpdef double dloss(self,double p,double y): + * raise NotImplementedError() + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62 + * cdef class Classification(LossFunction): + * """Base class for loss functions for classification.""" + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __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 = 62; __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 = 62; __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 = 62; __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 = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64 + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("dloss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65 + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): + * raise NotImplementedError() # <<<<<<<<<<<<<< + * + * cdef class ModifiedHuber(Classification): + */ + __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64 + * cpdef double loss(self,double p,double y): + * raise NotImplementedError() + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * raise NotImplementedError() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __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 = 64; __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 = 64; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":77 + * Stochastic Gradient Descent', ICML'04. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z >= 1: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("loss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __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 = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":78 + * """ + * cpdef double loss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z >= 1: + * return 0 + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79 + * cpdef double loss(self,double p,double y): + * cdef double z = p*y + * if z >= 1: # <<<<<<<<<<<<<< + * return 0 + * elif z >= -1: + */ + __pyx_t_6 = (__pyx_v_z >= 1); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80 + * cdef double z = p*y + * if z >= 1: + * return 0 # <<<<<<<<<<<<<< + * elif z >= -1: + * return (1-z) * (1-z) + */ + __pyx_r = 0; + goto __pyx_L0; + goto __pyx_L3; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81 + * if z >= 1: + * return 0 + * elif z >= -1: # <<<<<<<<<<<<<< + * return (1-z) * (1-z) + * else: + */ + __pyx_t_6 = (__pyx_v_z >= -1); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82 + * return 0 + * elif z >= -1: + * return (1-z) * (1-z) # <<<<<<<<<<<<<< + * else: + * return -4*z + */ + __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z)); + goto __pyx_L0; + goto __pyx_L3; + } + /*else*/ { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84 + * return (1-z) * (1-z) + * else: + * return -4*z # <<<<<<<<<<<<<< + * + * cpdef double dloss(self,double p,double y): + */ + __pyx_r = (-4 * __pyx_v_z); + goto __pyx_L0; + } + __pyx_L3:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":77 + * Stochastic Gradient Descent', ICML'04. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z >= 1: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __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 = 77; __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 = 77; __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 = 77; __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 = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86 + * return -4*z + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z >= 1: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("dloss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __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 = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87 + * + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z >= 1: + * return 0 + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88 + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y + * if z >= 1: # <<<<<<<<<<<<<< + * return 0 + * elif z >= -1: + */ + __pyx_t_6 = (__pyx_v_z >= 1); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89 + * cdef double z = p*y + * if z >= 1: + * return 0 # <<<<<<<<<<<<<< + * elif z >= -1: + * return 2*(1-z)*y + */ + __pyx_r = 0; + goto __pyx_L0; + goto __pyx_L3; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90 + * if z >= 1: + * return 0 + * elif z >= -1: # <<<<<<<<<<<<<< + * return 2*(1-z)*y + * else: + */ + __pyx_t_6 = (__pyx_v_z >= -1); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91 + * return 0 + * elif z >= -1: + * return 2*(1-z)*y # <<<<<<<<<<<<<< + * else: + * return 4*y + */ + __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y); + goto __pyx_L0; + goto __pyx_L3; + } + /*else*/ { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93 + * return 2*(1-z)*y + * else: + * return 4*y # <<<<<<<<<<<<<< + * + * def __reduce__(self): + */ + __pyx_r = (4 * __pyx_v_y); + goto __pyx_L0; + } + __pyx_L3:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86 + * return -4*z + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z >= 1: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __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 = 86; __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 = 86; __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 = 86; __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 = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95 + * return 4*y + * + * def __reduce__(self): # <<<<<<<<<<<<<< + * return ModifiedHuber,() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce__"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96 + * + * def __reduce__(self): + * return ModifiedHuber,() # <<<<<<<<<<<<<< + * + * cdef class Hinge(Classification): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber))); + __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber))); + __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); + __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.__reduce__"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":102 + * classification tasks with y in {-1,1}. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z < 1.0: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("loss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __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 = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":103 + * """ + * cpdef double loss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z < 1.0: + * return (1 - z) + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104 + * cpdef double loss(self,double p,double y): + * cdef double z = p*y + * if z < 1.0: # <<<<<<<<<<<<<< + * return (1 - z) + * return 0 + */ + __pyx_t_6 = (__pyx_v_z < 1.0); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105 + * cdef double z = p*y + * if z < 1.0: + * return (1 - z) # <<<<<<<<<<<<<< + * return 0 + * cpdef double dloss(self,double p,double y): + */ + __pyx_r = (1 - __pyx_v_z); + goto __pyx_L0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106 + * if z < 1.0: + * return (1 - z) + * return 0 # <<<<<<<<<<<<<< + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y + */ + __pyx_r = 0; + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":102 + * classification tasks with y in {-1,1}. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z < 1.0: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __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 = 102; __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 = 102; __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 = 102; __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 = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107 + * return (1 - z) + * return 0 + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z < 1.0: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("dloss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108 + * return 0 + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z < 1.0: + * return y + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109 + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y + * if z < 1.0: # <<<<<<<<<<<<<< + * return y + * return 0 + */ + __pyx_t_6 = (__pyx_v_z < 1.0); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110 + * cdef double z = p*y + * if z < 1.0: + * return y # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_r = __pyx_v_y; + goto __pyx_L0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111 + * if z < 1.0: + * return y + * return 0 # <<<<<<<<<<<<<< + * + * def __reduce__(self): + */ + __pyx_r = 0; + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107 + * return (1 - z) + * return 0 + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z < 1.0: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __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 = 107; __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 = 107; __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 = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113 + * return 0 + * + * def __reduce__(self): # <<<<<<<<<<<<<< + * return Hinge,() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce__"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114 + * + * def __reduce__(self): + * return Hinge,() # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge))); + __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge))); + __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); + __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Hinge.__reduce__"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121 + * tasks with y in {-1,1}. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z > 18: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("loss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __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); + 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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":122 + * """ + * cpdef double loss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z > 18: + * return exp(-z) + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123 + * cpdef double loss(self,double p,double y): + * cdef double z = p*y + * if z > 18: # <<<<<<<<<<<<<< + * return exp(-z) + * if z < -18: + */ + __pyx_t_6 = (__pyx_v_z > 18); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124 + * cdef double z = p*y + * if z > 18: + * return exp(-z) # <<<<<<<<<<<<<< + * if z < -18: + * return -z * y + */ + __pyx_r = exp((-__pyx_v_z)); + goto __pyx_L0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125 + * if z > 18: + * return exp(-z) + * if z < -18: # <<<<<<<<<<<<<< + * return -z * y + * return log(1.0+exp(-z)) + */ + __pyx_t_6 = (__pyx_v_z < -18); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126 + * return exp(-z) + * if z < -18: + * return -z * y # <<<<<<<<<<<<<< + * return log(1.0+exp(-z)) + * + */ + __pyx_r = ((-__pyx_v_z) * __pyx_v_y); + goto __pyx_L0; + goto __pyx_L4; + } + __pyx_L4:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127 + * if z < -18: + * return -z * y + * return log(1.0+exp(-z)) # <<<<<<<<<<<<<< + * + * cpdef double dloss(self,double p,double y): + */ + __pyx_r = log((1.0 + exp((-__pyx_v_z)))); + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121 + * tasks with y in {-1,1}. + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z > 18: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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;} + } + } + 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:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Log.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Log.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129 + * return log(1.0+exp(-z)) + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z > 18: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_z; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("dloss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __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 = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130 + * + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y # <<<<<<<<<<<<<< + * if z > 18: + * return exp(-z) * y + */ + __pyx_v_z = (__pyx_v_p * __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131 + * cpdef double dloss(self,double p,double y): + * cdef double z = p*y + * if z > 18: # <<<<<<<<<<<<<< + * return exp(-z) * y + * if z < -18: + */ + __pyx_t_6 = (__pyx_v_z > 18); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132 + * cdef double z = p*y + * if z > 18: + * return exp(-z) * y # <<<<<<<<<<<<<< + * if z < -18: + * return y + */ + __pyx_r = (exp((-__pyx_v_z)) * __pyx_v_y); + goto __pyx_L0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133 + * if z > 18: + * return exp(-z) * y + * if z < -18: # <<<<<<<<<<<<<< + * return y + * return y / (exp(z) + 1.0) + */ + __pyx_t_6 = (__pyx_v_z < -18); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134 + * return exp(-z) * y + * if z < -18: + * return y # <<<<<<<<<<<<<< + * return y / (exp(z) + 1.0) + * + */ + __pyx_r = __pyx_v_y; + goto __pyx_L0; + goto __pyx_L4; + } + __pyx_L4:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135 + * if z < -18: + * return y + * return y / (exp(z) + 1.0) # <<<<<<<<<<<<<< + * + * def __reduce__(self): + */ + __pyx_t_5 = (exp(__pyx_v_z) + 1.0); + if (unlikely(__pyx_t_5 == 0)) { + PyErr_Format(PyExc_ZeroDivisionError, "float division"); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_r = (__pyx_v_y / __pyx_t_5); + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129 + * return log(1.0+exp(-z)) + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double z = p*y + * if z > 18: + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __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 = 129; __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 = 129; __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 = 129; __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 = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137 + * return y / (exp(z) + 1.0) + * + * def __reduce__(self): # <<<<<<<<<<<<<< + * return Log,() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce__"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138 + * + * def __reduce__(self): + * return Log,() # <<<<<<<<<<<<<< + * + * cdef class SquaredError(Regression): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log))); + __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log))); + __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); + __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Log.__reduce__"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143 + * """ + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * return 0.5 * (p-y) * (p-y) + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("loss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __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 = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":144 + * """ + * cpdef double loss(self,double p,double y): + * return 0.5 * (p-y) * (p-y) # <<<<<<<<<<<<<< + * cpdef double dloss(self,double p,double y): + * return y - p + */ + __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y)); + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143 + * """ + * """ + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * return 0.5 * (p-y) * (p-y) + * cpdef double dloss(self,double p,double y): + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __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 = 143; __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 = 143; __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 = 143; __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 = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145 + * cpdef double loss(self,double p,double y): + * return 0.5 * (p-y) * (p-y) + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * return y - p + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + __Pyx_RefNannySetupContext("dloss"); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146 + * return 0.5 * (p-y) * (p-y) + * cpdef double dloss(self,double p,double y): + * return y - p # <<<<<<<<<<<<<< + * + * def __reduce__(self): + */ + __pyx_r = (__pyx_v_y - __pyx_v_p); + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145 + * cpdef double loss(self,double p,double y): + * return 0.5 * (p-y) * (p-y) + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * return y - p + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __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 = 145; __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 = 145; __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148 + * return y - p + * + * def __reduce__(self): # <<<<<<<<<<<<<< + * return SquaredError,() + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("__reduce__"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149 + * + * def __reduce__(self): + * return SquaredError,() # <<<<<<<<<<<<<< + * + * cdef class Huber(Regression): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError))); + __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError))); + __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); + __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.__reduce__"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":155 + * """ + * cdef double c + * def __init__(self,c): # <<<<<<<<<<<<<< + * self.c = c + * cpdef double loss(self,double p,double y): + */ + +static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_c = 0; + int __pyx_r; + double __pyx_t_1; + 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}; + 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 = 155; __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:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__"); + return -1; + __pyx_L4_argument_unpacking_done:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":156 + * cdef double c + * def __init__(self,c): + * self.c = c # <<<<<<<<<<<<<< + * cpdef double loss(self,double p,double y): + * cdef double r = p-y + */ + __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__"); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157 + * def __init__(self,c): + * self.c = c + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double r = p-y + * cdef double abs_r = abs(r) + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast_sparse_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_r; + double __pyx_v_abs_r; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("loss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __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 = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158 + * self.c = c + * cpdef double loss(self,double p,double y): + * cdef double r = p-y # <<<<<<<<<<<<<< + * cdef double abs_r = abs(r) + * if abs_r <= self.c: + */ + __pyx_v_r = (__pyx_v_p - __pyx_v_y); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159 + * cpdef double loss(self,double p,double y): + * cdef double r = p-y + * cdef double abs_r = abs(r) # <<<<<<<<<<<<<< + * if abs_r <= self.c: + * return 0.5 * r * r + */ + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); 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_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_abs_r = __pyx_t_5; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160 + * cdef double r = p-y + * cdef double abs_r = abs(r) + * if abs_r <= self.c: # <<<<<<<<<<<<<< + * return 0.5 * r * r + * else: + */ + __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161 + * cdef double abs_r = abs(r) + * if abs_r <= self.c: + * return 0.5 * r * r # <<<<<<<<<<<<<< + * else: + * return self.c * abs_r - (0.5*self.c*self.c) + */ + __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r); + goto __pyx_L0; + goto __pyx_L3; + } + /*else*/ { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163 + * return 0.5 * r * r + * else: + * return self.c * abs_r - (0.5*self.c*self.c) # <<<<<<<<<<<<<< + * + * cpdef double dloss(self,double p,double y): + */ + __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c)); + goto __pyx_L0; + } + __pyx_L3:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157 + * def __init__(self,c): + * self.c = c + * cpdef double loss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double r = p-y + * cdef double abs_r = abs(r) + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __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 = 157; __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 = 157; __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 = 157; __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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165 + * return self.c * abs_r - (0.5*self.c*self.c) + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double r = y - p + * cdef double abs_r = abs(r) + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fast_sparse_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { + double __pyx_v_r; + double __pyx_v_abs_r; + double __pyx_r; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + double __pyx_t_5; + int __pyx_t_6; + __Pyx_RefNannySetupContext("dloss"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + /* Check if called by wrapper */ + if (unlikely(__pyx_skip_dispatch)) ; + /* Check if overriden in Python */ + else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { + __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) { + __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); 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_t_4 = PyTuple_New(2); 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); + 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); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, 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_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_5; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166 + * + * cpdef double dloss(self,double p,double y): + * cdef double r = y - p # <<<<<<<<<<<<<< + * cdef double abs_r = abs(r) + * if abs_r <= self.c: + */ + __pyx_v_r = (__pyx_v_y - __pyx_v_p); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167 + * cpdef double dloss(self,double p,double y): + * cdef double r = y - p + * cdef double abs_r = abs(r) # <<<<<<<<<<<<<< + * if abs_r <= self.c: + * return r + */ + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __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 = 167; __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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_abs_r = __pyx_t_5; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168 + * cdef double r = y - p + * cdef double abs_r = abs(r) + * if abs_r <= self.c: # <<<<<<<<<<<<<< + * return r + * elif r > 0: + */ + __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169 + * cdef double abs_r = abs(r) + * if abs_r <= self.c: + * return r # <<<<<<<<<<<<<< + * elif r > 0: + * return self.c + */ + __pyx_r = __pyx_v_r; + goto __pyx_L0; + goto __pyx_L3; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170 + * if abs_r <= self.c: + * return r + * elif r > 0: # <<<<<<<<<<<<<< + * return self.c + * else: + */ + __pyx_t_6 = (__pyx_v_r > 0); + if (__pyx_t_6) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171 + * return r + * elif r > 0: + * return self.c # <<<<<<<<<<<<<< + * else: + * return -self.c + */ + __pyx_r = __pyx_v_self->c; + goto __pyx_L0; + goto __pyx_L3; + } + /*else*/ { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173 + * return self.c + * else: + * return -self.c # <<<<<<<<<<<<<< + * + * def __reduce__(self): + */ + __pyx_r = (-__pyx_v_self->c); + goto __pyx_L0; + } + __pyx_L3:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165 + * return self.c * abs_r - (0.5*self.c*self.c) + * + * cpdef double dloss(self,double p,double y): # <<<<<<<<<<<<<< + * cdef double r = y - p + * cdef double abs_r = abs(r) + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + double __pyx_v_p; + double __pyx_v_y; + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + 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}; + 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 = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __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 = 165; __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 = 165; __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 = 165; __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 = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175 + * return -self.c + * + * def __reduce__(self): # <<<<<<<<<<<<<< + * return Huber,(self.c,) + * + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/ +static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + __Pyx_RefNannySetupContext("__reduce__"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176 + * + * def __reduce__(self): + * return Huber,(self.c,) # <<<<<<<<<<<<<< + * + * @cython.boundscheck(False) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __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 = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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 = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber))); + __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber))); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("sgd_fast_sparse.Huber.__reduce__"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":181 + * @cython.wraparound(False) + * @cython.cdivision(True) + * def plain_sgd(np.ndarray[DOUBLE, ndim=1] w, # <<<<<<<<<<<<<< + * DOUBLE intercept, + * LossFunction loss, + */ + +static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n penalties.\n \n "; +static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_w = 0; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_intercept; + struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_loss = 0; + int __pyx_v_penalty_type; + double __pyx_v_alpha; + double __pyx_v_rho; + PyArrayObject *__pyx_v_X_data = 0; + PyArrayObject *__pyx_v_X_indices = 0; + PyArrayObject *__pyx_v_X_indptr = 0; + PyArrayObject *__pyx_v_Y = 0; + int __pyx_v_n_iter; + int __pyx_v_fit_intercept; + int __pyx_v_verbose; + int __pyx_v_shuffle; + unsigned int __pyx_v_n_samples; + unsigned int __pyx_v_n_features; + __pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr; + __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr; + __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indptr_ptr; + __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr; + PyArrayObject *__pyx_v_index = 0; + __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_index_ptr; + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset; + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_p; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_update; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sumloss; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wnorm; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_t; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_y; + unsigned int __pyx_v_count; + unsigned int __pyx_v_epoch; + unsigned int __pyx_v_i; + unsigned int __pyx_v_sample_idx; + PyArrayObject *__pyx_v_q = 0; + __pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_q_ptr; + double __pyx_v_u; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_typw; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta0; + PyObject *__pyx_v_t_start; + 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_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_X_data; + Py_ssize_t __pyx_bstride_0_X_data = 0; + Py_ssize_t __pyx_bshape_0_X_data = 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; + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyArrayObject *__pyx_t_6 = NULL; + PyArrayObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + int __pyx_t_13; + unsigned int __pyx_t_14; + unsigned int __pyx_t_15; + unsigned int __pyx_t_16; + PyArrayObject *__pyx_t_17 = NULL; + double __pyx_t_18; + PyObject *__pyx_t_19 = NULL; + int __pyx_t_20; + int __pyx_t_21; + int __pyx_t_22; + int __pyx_t_23; + 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,0}; + __Pyx_RefNannySetupContext("plain_sgd"); + __pyx_self = __pyx_self; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); + PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + switch (PyTuple_GET_SIZE(__pyx_args)) { + 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, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 184; __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 = 185; __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 = 185; __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 = 190; __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 = 190; __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 = 191; __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 = 191; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } else if (PyTuple_GET_SIZE(__pyx_args) != 14) { + 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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 184; __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 = 185; __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 = 185; __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 = 190; __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 = 190; __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 = 191; __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 = 191; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd"); + return NULL; + __pyx_L4_argument_unpacking_done:; + __Pyx_INCREF((PyObject *)__pyx_v_w); + __Pyx_INCREF((PyObject *)__pyx_v_loss); + __Pyx_INCREF((PyObject *)__pyx_v_X_data); + __Pyx_INCREF((PyObject *)__pyx_v_X_indices); + __Pyx_INCREF((PyObject *)__pyx_v_X_indptr); + __Pyx_INCREF((PyObject *)__pyx_v_Y); + __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None); + __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; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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 = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_FLOAT, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __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_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __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_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __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_bstruct_Y, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0]; + __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0]; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":197 + * """ + * # get the data information into easy vars + * cdef unsigned int n_samples = Y.shape[0] # <<<<<<<<<<<<<< + * cdef unsigned int n_features = w.shape[0] + * + */ + __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":198 + * # get the data information into easy vars + * cdef unsigned int n_samples = Y.shape[0] + * cdef unsigned int n_features = w.shape[0] # <<<<<<<<<<<<<< + * + * # FIXME double to DOUBLE + */ + __pyx_v_n_features = (__pyx_v_w->dimensions[0]); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201 + * + * # FIXME double to DOUBLE + * cdef DOUBLE *w_data_ptr = w.data # <<<<<<<<<<<<<< + * cdef FLOAT *X_data_ptr = X_data.data + * cdef INTEGER *X_indptr_ptr = X_indptr.data + */ + __pyx_v_w_data_ptr = ((__pyx_t_15sgd_fast_sparse_DOUBLE *)__pyx_v_w->data); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":202 + * # FIXME double to DOUBLE + * cdef DOUBLE *w_data_ptr = w.data + * cdef FLOAT *X_data_ptr = X_data.data # <<<<<<<<<<<<<< + * cdef INTEGER *X_indptr_ptr = X_indptr.data + * cdef INTEGER *X_indices_ptr = X_indices.data + */ + __pyx_v_X_data_ptr = ((__pyx_t_15sgd_fast_sparse_FLOAT *)__pyx_v_X_data->data); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":203 + * cdef DOUBLE *w_data_ptr = w.data + * cdef FLOAT *X_data_ptr = X_data.data + * cdef INTEGER *X_indptr_ptr = X_indptr.data # <<<<<<<<<<<<<< + * cdef INTEGER *X_indices_ptr = X_indices.data + * + */ + __pyx_v_X_indptr_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_X_indptr->data); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204 + * cdef FLOAT *X_data_ptr = X_data.data + * cdef INTEGER *X_indptr_ptr = X_indptr.data + * cdef INTEGER *X_indices_ptr = X_indices.data # <<<<<<<<<<<<<< + * + * # FIXME unsined int? + */ + __pyx_v_X_indices_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_X_indices->data); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207 + * + * # FIXME unsined int? + * cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples, # <<<<<<<<<<<<<< + * dtype = np.int32) + * cdef INTEGER *index_ptr = index.data + */ + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __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 = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":208 + * # FIXME unsined int? + * cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples, + * dtype = np.int32) # <<<<<<<<<<<<<< + * cdef INTEGER *index_ptr = index.data + * cdef INTEGER offset = 0 + */ + __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); 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_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); 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; + if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; + if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, 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 = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0]; + __pyx_bshape_0_index = __pyx_bstruct_index.shape[0]; + } + } + __pyx_t_6 = 0; + __pyx_v_index = ((PyArrayObject *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":209 + * cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples, + * dtype = np.int32) + * cdef INTEGER *index_ptr = index.data # <<<<<<<<<<<<<< + * cdef INTEGER offset = 0 + * cdef INTEGER xnnz = 0 + */ + __pyx_v_index_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_index->data); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210 + * dtype = np.int32) + * cdef INTEGER *index_ptr = index.data + * cdef INTEGER offset = 0 # <<<<<<<<<<<<<< + * cdef INTEGER xnnz = 0 + * cdef DOUBLE wscale = 1.0 + */ + __pyx_v_offset = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211 + * cdef INTEGER *index_ptr = index.data + * cdef INTEGER offset = 0 + * cdef INTEGER xnnz = 0 # <<<<<<<<<<<<<< + * cdef DOUBLE wscale = 1.0 + * cdef DOUBLE eta = 0.0 + */ + __pyx_v_xnnz = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212 + * cdef INTEGER offset = 0 + * cdef INTEGER xnnz = 0 + * cdef DOUBLE wscale = 1.0 # <<<<<<<<<<<<<< + * cdef DOUBLE eta = 0.0 + * cdef DOUBLE p = 0.0 + */ + __pyx_v_wscale = 1.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213 + * cdef INTEGER xnnz = 0 + * cdef DOUBLE wscale = 1.0 + * cdef DOUBLE eta = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE p = 0.0 + * cdef DOUBLE update = 0.0 + */ + __pyx_v_eta = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214 + * cdef DOUBLE wscale = 1.0 + * cdef DOUBLE eta = 0.0 + * cdef DOUBLE p = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE update = 0.0 + * cdef DOUBLE sumloss = 0.0 + */ + __pyx_v_p = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215 + * cdef DOUBLE eta = 0.0 + * cdef DOUBLE p = 0.0 + * cdef DOUBLE update = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE sumloss = 0.0 + * cdef DOUBLE wnorm = 0.0 + */ + __pyx_v_update = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216 + * cdef DOUBLE p = 0.0 + * cdef DOUBLE update = 0.0 + * cdef DOUBLE sumloss = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE wnorm = 0.0 + * cdef DOUBLE t = 0.0 + */ + __pyx_v_sumloss = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217 + * cdef DOUBLE update = 0.0 + * cdef DOUBLE sumloss = 0.0 + * cdef DOUBLE wnorm = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE t = 0.0 + * cdef DOUBLE y = 0.0 + */ + __pyx_v_wnorm = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218 + * cdef DOUBLE sumloss = 0.0 + * cdef DOUBLE wnorm = 0.0 + * cdef DOUBLE t = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE y = 0.0 + * cdef unsigned int count = 0 + */ + __pyx_v_t = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219 + * cdef DOUBLE wnorm = 0.0 + * cdef DOUBLE t = 0.0 + * cdef DOUBLE y = 0.0 # <<<<<<<<<<<<<< + * cdef unsigned int count = 0 + * cdef unsigned int epoch = 0 + */ + __pyx_v_y = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220 + * cdef DOUBLE t = 0.0 + * cdef DOUBLE y = 0.0 + * cdef unsigned int count = 0 # <<<<<<<<<<<<<< + * cdef unsigned int epoch = 0 + * cdef unsigned int i = 0 + */ + __pyx_v_count = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221 + * cdef DOUBLE y = 0.0 + * cdef unsigned int count = 0 + * cdef unsigned int epoch = 0 # <<<<<<<<<<<<<< + * cdef unsigned int i = 0 + * cdef unsigned int sample_idx = 0 + */ + __pyx_v_epoch = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222 + * cdef unsigned int count = 0 + * cdef unsigned int epoch = 0 + * cdef unsigned int i = 0 # <<<<<<<<<<<<<< + * cdef unsigned int sample_idx = 0 + * cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None + */ + __pyx_v_i = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223 + * cdef unsigned int epoch = 0 + * cdef unsigned int i = 0 + * cdef unsigned int sample_idx = 0 # <<<<<<<<<<<<<< + * cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None + * cdef DOUBLE *q_ptr + */ + __pyx_v_sample_idx = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224 + * cdef unsigned int i = 0 + * cdef unsigned int sample_idx = 0 + * cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None # <<<<<<<<<<<<<< + * cdef DOUBLE *q_ptr + * if penalty_type != L2: + */ + __pyx_t_7 = ((PyArrayObject *)Py_None); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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 = 224; __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); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226 + * cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None + * cdef DOUBLE *q_ptr + * if penalty_type != L2: # <<<<<<<<<<<<<< + * q = np.zeros((n_features,), dtype = np.float64, order = "c") + * q_ptr = q.data + */ + __pyx_t_8 = (__pyx_v_penalty_type != 2); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227 + * cdef DOUBLE *q_ptr + * if penalty_type != L2: + * q = np.zeros((n_features,), dtype = np.float64, order = "c") # <<<<<<<<<<<<<< + * q_ptr = 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 = 227; __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 = 227; __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 = 227; __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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __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 = 227; __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 = 227; __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 = 227; __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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_7 = ((PyArrayObject *)__pyx_t_4); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q); + __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_bstruct_q, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_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 = 227; __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; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228 + * if penalty_type != L2: + * q = np.zeros((n_features,), dtype = np.float64, order = "c") + * q_ptr = q.data # <<<<<<<<<<<<<< + * cdef double u = 0.0 + * # computing eta0 + */ + __pyx_v_q_ptr = ((__pyx_t_15sgd_fast_sparse_DOUBLE *)__pyx_v_q->data); + goto __pyx_L6; + } + __pyx_L6:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229 + * q = np.zeros((n_features,), dtype = np.float64, order = "c") + * q_ptr = q.data + * cdef double u = 0.0 # <<<<<<<<<<<<<< + * # computing eta0 + * cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha)) + */ + __pyx_v_u = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231 + * cdef double u = 0.0 + * # computing eta0 + * cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha)) # <<<<<<<<<<<<<< + * cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0)) + * t = 1.0 / (eta0 * alpha) + */ + __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha))); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232 + * # computing eta0 + * cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha)) + * cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0)) # <<<<<<<<<<<<<< + * t = 1.0 / (eta0 * alpha) + * t_start = time() + */ + __pyx_v_eta0 = (__pyx_v_typw / ((__pyx_t_15sgd_fast_sparse_DOUBLE)__pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)))); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233 + * cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha)) + * cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0)) + * t = 1.0 / (eta0 * alpha) # <<<<<<<<<<<<<< + * t_start = time() + * for epoch from 0 <= epoch < n_iter: + */ + __pyx_v_t = (1.0 / ((double)(__pyx_v_eta0 * __pyx_v_alpha))); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234 + * cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0)) + * t = 1.0 / (eta0 * alpha) + * t_start = time() # <<<<<<<<<<<<<< + * for epoch from 0 <= epoch < 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 = 234; __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 = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_v_t_start); + __pyx_v_t_start = __pyx_t_3; + __pyx_t_3 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235 + * t = 1.0 / (eta0 * alpha) + * t_start = time() + * for epoch from 0 <= epoch < n_iter: # <<<<<<<<<<<<<< + * if verbose > 0: + * print("-- Epoch %d" % (epoch + 1)) + */ + __pyx_t_9 = __pyx_v_n_iter; + for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236 + * t_start = time() + * for epoch from 0 <= epoch < n_iter: + * if verbose > 0: # <<<<<<<<<<<<<< + * print("-- Epoch %d" % (epoch + 1)) + * if shuffle: + */ + __pyx_t_8 = (__pyx_v_verbose > 0); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237 + * for epoch from 0 <= epoch < n_iter: + * if verbose > 0: + * print("-- Epoch %d" % (epoch + 1)) # <<<<<<<<<<<<<< + * if shuffle: + * np.random.shuffle(index) + */ + __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __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 = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L9; + } + __pyx_L9:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238 + * if verbose > 0: + * print("-- Epoch %d" % (epoch + 1)) + * if shuffle: # <<<<<<<<<<<<<< + * np.random.shuffle(index) + * for i from 0 <= i < n_samples: + */ + __pyx_t_13 = __pyx_v_shuffle; + if (__pyx_t_13) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239 + * print("-- Epoch %d" % (epoch + 1)) + * if shuffle: + * np.random.shuffle(index) # <<<<<<<<<<<<<< + * for i from 0 <= i < n_samples: + * sample_idx = index[i] + */ + __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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 = 239; __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__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L10; + } + __pyx_L10:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240 + * if shuffle: + * np.random.shuffle(index) + * for i from 0 <= i < n_samples: # <<<<<<<<<<<<<< + * sample_idx = index[i] + * offset = X_indptr_ptr[sample_idx] + */ + __pyx_t_14 = __pyx_v_n_samples; + for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241 + * np.random.shuffle(index) + * for i from 0 <= i < n_samples: + * sample_idx = index[i] # <<<<<<<<<<<<<< + * offset = X_indptr_ptr[sample_idx] + * xnnz = X_indptr_ptr[sample_idx + 1] - offset + */ + __pyx_t_15 = __pyx_v_i; + __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(__pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242 + * for i from 0 <= i < n_samples: + * sample_idx = index[i] + * offset = X_indptr_ptr[sample_idx] # <<<<<<<<<<<<<< + * xnnz = X_indptr_ptr[sample_idx + 1] - offset + * y = Y[sample_idx] + */ + __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243 + * sample_idx = index[i] + * offset = X_indptr_ptr[sample_idx] + * xnnz = X_indptr_ptr[sample_idx + 1] - offset # <<<<<<<<<<<<<< + * y = Y[sample_idx] + * eta = 1.0 / (alpha * t) + */ + __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244 + * offset = X_indptr_ptr[sample_idx] + * xnnz = X_indptr_ptr[sample_idx + 1] - offset + * y = Y[sample_idx] # <<<<<<<<<<<<<< + * eta = 1.0 / (alpha * t) + * p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr, + */ + __pyx_t_16 = __pyx_v_sample_idx; + __pyx_v_y = (*__Pyx_BufPtrStrided1d(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245 + * xnnz = X_indptr_ptr[sample_idx + 1] - offset + * y = Y[sample_idx] + * eta = 1.0 / (alpha * t) # <<<<<<<<<<<<<< + * p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr, + * offset, xnnz) * wscale) + intercept + */ + __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247 + * eta = 1.0 / (alpha * t) + * p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr, + * offset, xnnz) * wscale) + intercept # <<<<<<<<<<<<<< + * sumloss += loss.loss(p, y) + * update = eta * loss.dloss(p, y) + */ + __pyx_v_p = ((__pyx_f_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); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248 + * p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr, + * offset, xnnz) * wscale) + intercept + * sumloss += loss.loss(p, y) # <<<<<<<<<<<<<< + * update = eta * loss.dloss(p, y) + * if update != 0: + */ + __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249 + * offset, xnnz) * wscale) + intercept + * sumloss += loss.loss(p, y) + * update = eta * loss.dloss(p, y) # <<<<<<<<<<<<<< + * if update != 0: + * add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr, + */ + __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250 + * sumloss += loss.loss(p, y) + * update = eta * loss.dloss(p, y) + * if update != 0: # <<<<<<<<<<<<<< + * add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr, + * offset, xnnz, update) + */ + __pyx_t_8 = (__pyx_v_update != 0); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252 + * if update != 0: + * add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr, + * offset, xnnz, update) # <<<<<<<<<<<<<< + * if fit_intercept == 1: + * intercept += update * 0.01 + */ + __pyx_f_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); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253 + * add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr, + * offset, xnnz, update) + * if fit_intercept == 1: # <<<<<<<<<<<<<< + * intercept += update * 0.01 + * if penalty_type != L1: + */ + __pyx_t_8 = (__pyx_v_fit_intercept == 1); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254 + * offset, xnnz, update) + * if fit_intercept == 1: + * intercept += update * 0.01 # <<<<<<<<<<<<<< + * if penalty_type != L1: + * wscale *= (1 - rho * eta * alpha) + */ + __pyx_v_intercept += (__pyx_v_update * 0.01); + goto __pyx_L14; + } + __pyx_L14:; + goto __pyx_L13; + } + __pyx_L13:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255 + * if fit_intercept == 1: + * intercept += update * 0.01 + * if penalty_type != L1: # <<<<<<<<<<<<<< + * wscale *= (1 - rho * eta * alpha) + * if wscale < 1e-9: + */ + __pyx_t_8 = (__pyx_v_penalty_type != 1); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256 + * intercept += update * 0.01 + * if penalty_type != L1: + * wscale *= (1 - rho * eta * alpha) # <<<<<<<<<<<<<< + * if wscale < 1e-9: + * w *= wscale + */ + __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha)); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257 + * if penalty_type != L1: + * wscale *= (1 - rho * eta * alpha) + * if wscale < 1e-9: # <<<<<<<<<<<<<< + * w *= wscale + * wscale = 1.0 + */ + __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258 + * wscale *= (1 - rho * eta * alpha) + * if wscale < 1e-9: + * w *= wscale # <<<<<<<<<<<<<< + * wscale = 1.0 + * if penalty_type == L2 or penalty_type == ELASTICNET: + */ + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = ((PyArrayObject *)__pyx_t_3); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w); + __pyx_t_13 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack); + if (unlikely(__pyx_t_13 < 0)) { + PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10); + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_bstride_0_w = __pyx_bstruct_w.strides[0]; + __pyx_bshape_0_w = __pyx_bstruct_w.shape[0]; + if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_17 = 0; + __Pyx_DECREF(((PyObject *)__pyx_v_w)); + __pyx_v_w = ((PyArrayObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259 + * if wscale < 1e-9: + * w *= wscale + * wscale = 1.0 # <<<<<<<<<<<<<< + * if penalty_type == L2 or penalty_type == ELASTICNET: + * u += ((1.0 - rho) * eta * alpha) + */ + __pyx_v_wscale = 1.0; + goto __pyx_L16; + } + __pyx_L16:; + goto __pyx_L15; + } + __pyx_L15:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260 + * w *= wscale + * wscale = 1.0 + * if penalty_type == L2 or penalty_type == ELASTICNET: # <<<<<<<<<<<<<< + * u += ((1.0 - rho) * eta * alpha) + * #l1penalty(wscale, wdata, qdata, xdata, xnnz, u) + */ + switch (__pyx_v_penalty_type) { + case 2: + case 3: + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261 + * wscale = 1.0 + * if penalty_type == L2 or penalty_type == ELASTICNET: + * u += ((1.0 - rho) * eta * alpha) # <<<<<<<<<<<<<< + * #l1penalty(wscale, wdata, qdata, xdata, xnnz, u) + * t += 1 + */ + __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha); + break; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263 + * u += ((1.0 - rho) * eta * alpha) + * #l1penalty(wscale, wdata, qdata, xdata, xnnz, u) + * t += 1 # <<<<<<<<<<<<<< + * count += 1 + * # report epoche information + */ + __pyx_v_t += 1; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264 + * #l1penalty(wscale, wdata, qdata, xdata, xnnz, u) + * t += 1 + * count += 1 # <<<<<<<<<<<<<< + * # report epoche information + * if verbose > 0: + */ + __pyx_v_count += 1; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266 + * count += 1 + * # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count)) + */ + __pyx_t_8 = (__pyx_v_verbose > 0); + if (__pyx_t_8) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267 + * # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count)) + * print("Total training time: %.2f seconds." % (time()-t_start)) + */ + __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __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 = 267; __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 = 267; __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_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __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 = 267; __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_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_wnorm = sqrt(__pyx_t_18); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268 + * if verbose > 0: + * 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, sumloss / count)) # <<<<<<<<<<<<<< + * print("Total training time: %.2f seconds." % (time()-t_start)) + * + */ + __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __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 = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyFloat_FromDouble((((double)__pyx_v_sumloss) / ((double)__pyx_v_count))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __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 = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_19); + PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_4 = 0; + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269 + * 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, 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 = 269; __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 = 269; __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 = 269; __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 = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_19); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + goto __pyx_L17; + } + __pyx_L17:; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272 + * + * # 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 = 272; __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 = 272; __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 = 272; __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_19); + PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (!__pyx_t_8) { + __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_19); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(((PyObject *)__pyx_v_w)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_w)); + __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_20) { + __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__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 = 272; __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 = 272; __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_23 = __pyx_t_22; + } else { + __pyx_t_23 = __pyx_t_21; + } + __pyx_t_21 = __pyx_t_23; + } else { + __pyx_t_21 = __pyx_t_20; + } + __pyx_t_20 = __pyx_t_21; + } else { + __pyx_t_20 = __pyx_t_8; + } + if (__pyx_t_20) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273 + * # 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.") # <<<<<<<<<<<<<< + * + * w *= wscale + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_kp_s_4)); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4)); + __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L18; + } + __pyx_L18:; + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275 + * raise ValueError("floating-point under-/overflow occured.") + * + * w *= wscale # <<<<<<<<<<<<<< + * return w, intercept + * + */ + __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_17 = ((PyArrayObject *)__pyx_t_1); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w); + __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_17 = 0; + __Pyx_DECREF(((PyObject *)__pyx_v_w)); + __pyx_v_w = ((PyArrayObject *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276 + * + * w *= wscale + * return w, intercept # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(((PyObject *)__pyx_v_w)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_w)); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_19); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index); + __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_X_data); + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd"); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index); + __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_X_data); + __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_index); + __Pyx_XDECREF((PyObject *)__pyx_v_q); + __Pyx_DECREF(__pyx_v_t_start); + __Pyx_DECREF((PyObject *)__pyx_v_w); + __Pyx_DECREF((PyObject *)__pyx_v_loss); + __Pyx_DECREF((PyObject *)__pyx_v_X_data); + __Pyx_DECREF((PyObject *)__pyx_v_X_indices); + __Pyx_DECREF((PyObject *)__pyx_v_X_indptr); + __Pyx_DECREF((PyObject *)__pyx_v_Y); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":303 + * ## return y + * + * cdef inline double max(DOUBLE a, DOUBLE b): # <<<<<<<<<<<<<< + * return a if a >= b else b + * + */ + +static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(__pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_a, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_b) { + double __pyx_r; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_t_1; + __Pyx_RefNannySetupContext("max"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304 + * + * cdef inline double max(DOUBLE a, DOUBLE b): + * return a if a >= b else b # <<<<<<<<<<<<<< + * + * cdef inline DOUBLE min(DOUBLE a, DOUBLE b): + */ + if ((__pyx_v_a >= __pyx_v_b)) { + __pyx_t_1 = __pyx_v_a; + } else { + __pyx_t_1 = __pyx_v_b; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306 + * return a if a >= b else b + * + * cdef inline DOUBLE min(DOUBLE a, DOUBLE b): # <<<<<<<<<<<<<< + * return a if a <= b else b + * + */ + +static CYTHON_INLINE __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_min(__pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_a, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_b) { + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_t_1; + __Pyx_RefNannySetupContext("min"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":307 + * + * cdef inline DOUBLE min(DOUBLE a, DOUBLE b): + * return a if a <= b else b # <<<<<<<<<<<<<< + * + * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr, + */ + if ((__pyx_v_a <= __pyx_v_b)) { + __pyx_t_1 = __pyx_v_a; + } else { + __pyx_t_1 = __pyx_v_b; + } + __pyx_r = __pyx_t_1; + goto __pyx_L0; + + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309 + * return a if a <= b else b + * + * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr, # <<<<<<<<<<<<<< + * INTEGER offset, INTEGER xnnz): + * cdef DOUBLE sum = 0.0 + */ + +static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr, __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr, __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz) { + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sum; + int __pyx_v_j; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r; + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_t_1; + __Pyx_RefNannySetupContext("dot"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311 + * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr, + * INTEGER offset, INTEGER xnnz): + * cdef DOUBLE sum = 0.0 # <<<<<<<<<<<<<< + * cdef int j + * for j from 0 <= j < xnnz: + */ + __pyx_v_sum = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313 + * cdef DOUBLE sum = 0.0 + * cdef int j + * for j from 0 <= j < xnnz: # <<<<<<<<<<<<<< + * sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j] + * return sum + */ + __pyx_t_1 = __pyx_v_xnnz; + for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314 + * cdef int j + * for j from 0 <= j < xnnz: + * sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j] # <<<<<<<<<<<<<< + * return 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)])); + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315 + * for j from 0 <= j < xnnz: + * sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j] + * return sum # <<<<<<<<<<<<<< + * + * cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr, + */ + __pyx_r = __pyx_v_sum; + goto __pyx_L0; + + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317 + * return sum + * + * cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr, # <<<<<<<<<<<<<< + * INTEGER *X_indices_ptr, INTEGER offset, INTEGER xnnz, DOUBLE c): + * """Scales example x by constant c and adds it to the weight vector w. + */ + +static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_add(__pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale, __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr, __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_c) { + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_j; + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_idx; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_val; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_innerprod; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_xsqnorm; + __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r; + __pyx_t_15sgd_fast_sparse_INTEGER __pyx_t_1; + __Pyx_RefNannySetupContext("add"); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324 + * cdef INTEGER idx + * cdef DOUBLE val + * cdef DOUBLE innerprod = 0.0 # <<<<<<<<<<<<<< + * cdef DOUBLE xsqnorm = 0.0 + * for j from 0 <= j < xnnz: + */ + __pyx_v_innerprod = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325 + * cdef DOUBLE val + * cdef DOUBLE innerprod = 0.0 + * cdef DOUBLE xsqnorm = 0.0 # <<<<<<<<<<<<<< + * for j from 0 <= j < xnnz: + * idx = X_indices_ptr[offset + j] + */ + __pyx_v_xsqnorm = 0.0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326 + * cdef DOUBLE innerprod = 0.0 + * cdef DOUBLE xsqnorm = 0.0 + * for j from 0 <= j < xnnz: # <<<<<<<<<<<<<< + * idx = X_indices_ptr[offset + j] + * val = X_data_ptr[offset + j] + */ + __pyx_t_1 = __pyx_v_xnnz; + for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) { + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327 + * cdef DOUBLE xsqnorm = 0.0 + * for j from 0 <= j < xnnz: + * idx = X_indices_ptr[offset + j] # <<<<<<<<<<<<<< + * val = X_data_ptr[offset + j] + * innerprod += (w_data_ptr[idx] * val) + */ + __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328 + * for j from 0 <= j < xnnz: + * idx = X_indices_ptr[offset + j] + * val = X_data_ptr[offset + j] # <<<<<<<<<<<<<< + * innerprod += (w_data_ptr[idx] * val) + * xsqnorm += (val * val) + */ + __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329 + * idx = X_indices_ptr[offset + j] + * val = X_data_ptr[offset + j] + * innerprod += (w_data_ptr[idx] * val) # <<<<<<<<<<<<<< + * xsqnorm += (val * val) + * w_data_ptr[idx] += val * (c / wscale) + */ + __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330 + * val = X_data_ptr[offset + j] + * innerprod += (w_data_ptr[idx] * val) + * xsqnorm += (val * val) # <<<<<<<<<<<<<< + * w_data_ptr[idx] += val * (c / wscale) + * return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c) + */ + __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val); + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331 + * innerprod += (w_data_ptr[idx] * val) + * xsqnorm += (val * val) + * w_data_ptr[idx] += val * (c / wscale) # <<<<<<<<<<<<<< + * return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c) + * + */ + if (unlikely(__pyx_v_wscale == 0)) { + PyErr_Format(PyExc_ZeroDivisionError, "float division"); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale)); + } + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332 + * xsqnorm += (val * val) + * w_data_ptr[idx] += val * (c / wscale) + * return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c) # <<<<<<<<<<<<<< + * + * ## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim): + */ + __pyx_r = (((__pyx_v_xsqnorm * __pyx_v_c) * __pyx_v_c) + (((2.0 * __pyx_v_innerprod) * __pyx_v_wscale) * __pyx_v_c)); + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_WriteUnraisable("sgd_fast_sparse.add"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":187 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_copy_shape; + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_v_hasfields; + int __pyx_r; + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + char *__pyx_t_9; + __Pyx_RefNannySetupContext("__getbuffer__"); + if (__pyx_v_info == NULL) return 0; + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":193 + * # of flags + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":194 + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":196 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self)); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":198 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":199 + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * copy_shape = 1 # <<<<<<<<<<<<<< + * else: + * copy_shape = 0 + */ + __pyx_v_copy_shape = 1; + goto __pyx_L5; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":201 + * copy_shape = 1 + * else: + * copy_shape = 0 # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + __pyx_v_copy_shape = 0; + } + __pyx_L5:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":203 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":204 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS)); + __pyx_t_3 = __pyx_t_2; + } else { + __pyx_t_3 = __pyx_t_1; + } + if (__pyx_t_3) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":205 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_5)); + PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5)); + __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":207 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS); + if (__pyx_t_3) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":208 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS)); + __pyx_t_2 = __pyx_t_1; + } else { + __pyx_t_2 = __pyx_t_3; + } + if (__pyx_t_2) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":209 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_6)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6)); + __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L7; + } + __pyx_L7:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":211 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if copy_shape: + */ + __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self)); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":212 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if copy_shape: + * # Allocate new buffer for strides and shape info. This is allocated + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":213 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. This is allocated + * # as one block, strides first. + */ + __pyx_t_6 = __pyx_v_copy_shape; + if (__pyx_t_6) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":216 + * # Allocate new buffer for strides and shape info. This is allocated + * # as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2))); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":217 + * # as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":218 + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_6 = __pyx_v_ndim; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_i = __pyx_t_7; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":219 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":220 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]); + } + goto __pyx_L8; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":222 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":223 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self))); + } + __pyx_L8:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":224 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":225 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self)); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":226 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self))); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":229 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef list stack + */ + __pyx_v_f = NULL; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":230 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef list stack + * cdef int offset + */ + __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr)); + __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":234 + * cdef int offset + * + * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< + * + * if not hasfields and not copy_shape: + */ + __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":236 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + __pyx_t_2 = (!__pyx_v_hasfields); + if (__pyx_t_2) { + __pyx_t_3 = (!__pyx_v_copy_shape); + __pyx_t_1 = __pyx_t_3; + } else { + __pyx_t_1 = __pyx_t_2; + } + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":238 + * if not hasfields and not copy_shape: + * # do not call releasebuffer + * info.obj = None # <<<<<<<<<<<<<< + * else: + * # need to call releasebuffer + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = Py_None; + goto __pyx_L11; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":241 + * else: + * # need to call releasebuffer + * info.obj = self # <<<<<<<<<<<<<< + * + * if not hasfields: + */ + __Pyx_INCREF(__pyx_v_self); + __Pyx_GIVEREF(__pyx_v_self); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = __pyx_v_self; + } + __pyx_L11:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":243 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == '>' and little_endian) or + */ + __pyx_t_1 = (!__pyx_v_hasfields); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":244 + * + * if not hasfields: + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == '>' and little_endian) or + * (descr.byteorder == '<' and not little_endian)): + */ + __pyx_v_t = __pyx_v_descr->type_num; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":245 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == '<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_1 = (__pyx_v_descr->byteorder == '>'); + if (__pyx_t_1) { + __pyx_t_2 = __pyx_v_little_endian; + } else { + __pyx_t_2 = __pyx_t_1; + } + if (!__pyx_t_2) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":246 + * t = descr.type_num + * if ((descr.byteorder == '>' and little_endian) or + * (descr.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_1 = (__pyx_v_descr->byteorder == '<'); + if (__pyx_t_1) { + __pyx_t_3 = (!__pyx_v_little_endian); + __pyx_t_8 = __pyx_t_3; + } else { + __pyx_t_8 = __pyx_t_1; + } + __pyx_t_1 = __pyx_t_8; + } else { + __pyx_t_1 = __pyx_t_2; + } + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":247 + * if ((descr.byteorder == '>' and little_endian) or + * (descr.byteorder == '<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_7)); + PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7)); + __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L13; + } + __pyx_L13:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":248 + * (descr.byteorder == '<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + __pyx_t_1 = (__pyx_v_t == NPY_BYTE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__b; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":249 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + __pyx_t_1 = (__pyx_v_t == NPY_UBYTE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__B; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":250 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + __pyx_t_1 = (__pyx_v_t == NPY_SHORT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__h; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":251 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + __pyx_t_1 = (__pyx_v_t == NPY_USHORT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__H; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":252 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + __pyx_t_1 = (__pyx_v_t == NPY_INT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__i; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":253 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + __pyx_t_1 = (__pyx_v_t == NPY_UINT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__I; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":254 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + __pyx_t_1 = (__pyx_v_t == NPY_LONG); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__l; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":255 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + __pyx_t_1 = (__pyx_v_t == NPY_ULONG); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__L; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":256 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__q; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":257 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__Q; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":258 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + __pyx_t_1 = (__pyx_v_t == NPY_FLOAT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__f; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":259 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__d; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":260 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__g; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":261 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__Zf; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":262 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__Zd; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":263 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__Zg; + goto __pyx_L14; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":264 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_1 = (__pyx_v_t == NPY_OBJECT); + if (__pyx_t_1) { + __pyx_v_f = __pyx_k__O; + goto __pyx_L14; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":266 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_L14:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":267 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":268 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + goto __pyx_L12; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":270 + * return + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = '^' # Native data types, manual alignment + * offset = 0 + */ + __pyx_v_info->format = ((char *)malloc(255)); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":271 + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = '^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":272 + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = '^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":275 + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + * &offset) # <<<<<<<<<<<<<< + * f[0] = 0 # Terminate format string + * + */ + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_9; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":276 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = 0 # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = 0; + } + __pyx_L12:; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__"); + __pyx_r = -1; + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(Py_None); + __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":278 + * f[0] = 0 # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + +static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__"); + __Pyx_INCREF((PyObject *)__pyx_v_self); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":279 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self)); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":280 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) + */ + free(__pyx_v_info->format); + goto __pyx_L5; + } + __pyx_L5:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":281 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":282 + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + free(__pyx_v_info->strides); + goto __pyx_L6; + } + __pyx_L6:; + + __Pyx_DECREF((PyObject *)__pyx_v_self); + __Pyx_RefNannyFinishContext(); +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":755 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1"); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":756 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":758 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2"); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":759 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":761 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3"); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":762 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":764 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4"); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":765 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":767 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5"); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":768 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5"); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":770 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields; + PyObject *__pyx_v_childname; + PyObject *__pyx_v_new_offset; + PyObject *__pyx_v_t; + char *__pyx_r; + Py_ssize_t __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + char *__pyx_t_10; + __Pyx_RefNannySetupContext("_util_dtypestring"); + __Pyx_INCREF((PyObject *)__pyx_v_descr); + __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None); + __pyx_v_fields = ((PyObject *)Py_None); __Pyx_INCREF(Py_None); + __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None); + __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None); + __pyx_v_t = Py_None; __Pyx_INCREF(Py_None); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":777 + * cdef int delta_offset + * cdef tuple i + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":778 + * cdef tuple i + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":781 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (likely(((PyObject *)__pyx_v_descr->names) != Py_None)) { + __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2); + } else { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + for (;;) { + if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++; + __Pyx_DECREF(__pyx_v_childname); + __pyx_v_childname = __pyx_t_3; + __pyx_t_3 = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":782 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(((PyObject *)__pyx_v_fields)); + __pyx_v_fields = ((PyObject *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":783 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) { + PyObject* tuple = ((PyObject *)__pyx_v_fields); + __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3); + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4); + __Pyx_DECREF(((PyObject *)__pyx_v_child)); + __pyx_v_child = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_v_new_offset); + __pyx_v_new_offset = __pyx_t_4; + __pyx_t_4 = 0; + } else { + __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2); + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":785 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":786 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == '>' and little_endian) or + */ + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_9)); + PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_9)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9)); + __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":788 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == '<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_6 = (__pyx_v_child->byteorder == '>'); + if (__pyx_t_6) { + __pyx_t_7 = __pyx_v_little_endian; + } else { + __pyx_t_7 = __pyx_t_6; + } + if (!__pyx_t_7) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":789 + * + * if ((child.byteorder == '>' and little_endian) or + * (child.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_6 = (__pyx_v_child->byteorder == '<'); + if (__pyx_t_6) { + __pyx_t_8 = (!__pyx_v_little_endian); + __pyx_t_9 = __pyx_t_8; + } else { + __pyx_t_9 = __pyx_t_6; + } + __pyx_t_6 = __pyx_t_9; + } else { + __pyx_t_6 = __pyx_t_7; + } + if (__pyx_t_6) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":790 + * if ((child.byteorder == '>' and little_endian) or + * (child.byteorder == '<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_7)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_7)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7)); + __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":800 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!__pyx_t_6) break; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":801 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 120; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":802 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f += 1; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":803 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + (__pyx_v_offset[0]) += 1; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":805 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + (__pyx_v_offset[0]) += __pyx_v_child->elsize; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":807 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child)); + if (__pyx_t_6) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":808 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_v_t); + __pyx_v_t = __pyx_t_3; + __pyx_t_3 = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":809 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5); + if (__pyx_t_6) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":810 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_kp_u_10)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_10)); + __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10)); + __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L10; + } + __pyx_L10:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":813 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":814 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":815 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 104; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":816 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":817 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 105; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":818 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":819 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 108; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":820 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":821 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 113; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":822 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":823 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 102; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":824 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 100; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":825 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 103; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":826 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 102; + __pyx_v_f += 1; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":827 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 100; + __pyx_v_f += 1; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":828 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 103; + __pyx_v_f += 1; + goto __pyx_L11; + } + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":829 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L11; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":831 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_L11:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":832 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f += 1; + goto __pyx_L9; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":836 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_10; + } + __pyx_L9:; + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":837 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("numpy._util_dtypestring"); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_child); + __Pyx_DECREF(__pyx_v_fields); + __Pyx_DECREF(__pyx_v_childname); + __Pyx_DECREF(__pyx_v_new_offset); + __Pyx_DECREF(__pyx_v_t); + __Pyx_DECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":952 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + int __pyx_t_1; + __Pyx_RefNannySetupContext("set_array_base"); + __Pyx_INCREF((PyObject *)__pyx_v_arr); + __Pyx_INCREF(__pyx_v_base); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":954 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":955 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + goto __pyx_L3; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":957 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + Py_INCREF(__pyx_v_base); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":958 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":959 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":960 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + __Pyx_DECREF((PyObject *)__pyx_v_arr); + __Pyx_DECREF(__pyx_v_base); + __Pyx_RefNannyFinishContext(); +} + +/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":962 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base"); + __Pyx_INCREF((PyObject *)__pyx_v_arr); + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":963 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = (__pyx_v_arr->base == NULL); + if (__pyx_t_1) { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":964 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + goto __pyx_L3; + } + /*else*/ { + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":966 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + __pyx_L3:; + + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __pyx_L0:; + __Pyx_DECREF((PyObject *)__pyx_v_arr); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_vtable_15sgd_fast_sparse_LossFunction; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_LossFunction(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_LossFunction *p; + PyObject *o = (*t->tp_alloc)(t, 0); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)o); + p->__pyx_vtab = __pyx_vtabptr_15sgd_fast_sparse_LossFunction; + return o; +} + +static void __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction(PyObject *o) { + (*Py_TYPE(o)->tp_free)(o); +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_LossFunction[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12LossFunction_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_12LossFunction_loss)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_12LossFunction_dloss)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_LossFunction = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_LossFunction = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_LossFunction = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_LossFunction = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_LossFunction = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.LossFunction"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_LossFunction), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_LossFunction, /*tp_as_number*/ + &__pyx_tp_as_sequence_LossFunction, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_LossFunction, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_LossFunction, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("Base class for convex loss functions"), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_LossFunction, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_LossFunction, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_vtable_15sgd_fast_sparse_Regression; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_Regression(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_Regression *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_Regression *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_Regression; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Regression[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_10Regression_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_10Regression_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Regression = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Regression = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Regression = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Regression = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_Regression = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.Regression"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_Regression), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Regression, /*tp_as_number*/ + &__pyx_tp_as_sequence_Regression, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Regression, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Regression, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("Base class for loss functions for regression."), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_Regression, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_Regression, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_vtable_15sgd_fast_sparse_Classification; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_Classification(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_Classification *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_Classification *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_Classification; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Classification[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_14Classification_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_14Classification_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Classification = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Classification = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Classification = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Classification = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_Classification = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.Classification"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_Classification), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Classification, /*tp_as_number*/ + &__pyx_tp_as_sequence_Classification, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Classification, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Classification, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("Base class for loss functions for classification."), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_Classification, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_Classification, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber __pyx_vtable_15sgd_fast_sparse_ModifiedHuber; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_ModifiedHuber(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)o); + p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_ModifiedHuber[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_ModifiedHuber = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_ModifiedHuber = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_ModifiedHuber = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_ModifiedHuber = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_ModifiedHuber = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.ModifiedHuber"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_ModifiedHuber, /*tp_as_number*/ + &__pyx_tp_as_sequence_ModifiedHuber, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_ModifiedHuber, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_ModifiedHuber, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("Modified Huber loss function for binary\n classification tasks with y in {-1,1}.\n Its equivalent to quadratically smoothed SVM\n with gamma = 2.\n\n See T. Zhang 'Solving\n Large Scale Linear Prediction Problems Using\n Stochastic Gradient Descent', ICML'04.\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_ModifiedHuber, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_ModifiedHuber, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge __pyx_vtable_15sgd_fast_sparse_Hinge; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_Hinge(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_Hinge *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_Hinge *)o); + p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_Hinge; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Hinge[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Hinge = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Hinge = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Hinge = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Hinge = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_Hinge = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.Hinge"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_Hinge), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Hinge, /*tp_as_number*/ + &__pyx_tp_as_sequence_Hinge, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Hinge, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Hinge, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("SVM classification loss for binary\n classification tasks with y in {-1,1}.\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_Hinge, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_Hinge, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Log __pyx_vtable_15sgd_fast_sparse_Log; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_Log(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_Log *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_Log *)o); + p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_Log; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Log[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Log = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Log = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Log = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Log = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_Log = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.Log"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_Log), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Log, /*tp_as_number*/ + &__pyx_tp_as_sequence_Log, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Log, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Log, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("Logistic regression loss for binary classification\n tasks with y in {-1,1}.\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_Log, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_Log, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError __pyx_vtable_15sgd_fast_sparse_SquaredError; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_SquaredError(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_SquaredError *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)o); + p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_SquaredError; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_SquaredError[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_SquaredError = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_SquaredError = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_SquaredError = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_SquaredError = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_SquaredError = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.SquaredError"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_SquaredError), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_SquaredError, /*tp_as_number*/ + &__pyx_tp_as_sequence_SquaredError, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_SquaredError, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_SquaredError, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_SquaredError, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_SquaredError, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; +static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber __pyx_vtable_15sgd_fast_sparse_Huber; + +static PyObject *__pyx_tp_new_15sgd_fast_sparse_Huber(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_15sgd_fast_sparse_Huber *p; + PyObject *o = __pyx_tp_new_15sgd_fast_sparse_LossFunction(t, a, k); + if (!o) return 0; + p = ((struct __pyx_obj_15sgd_fast_sparse_Huber *)o); + p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction*)__pyx_vtabptr_15sgd_fast_sparse_Huber; + return o; +} + +static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Huber[] = { + {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyNumberMethods __pyx_tp_as_number_Huber = { + 0, /*nb_add*/ + 0, /*nb_subtract*/ + 0, /*nb_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_divide*/ + #endif + 0, /*nb_remainder*/ + 0, /*nb_divmod*/ + 0, /*nb_power*/ + 0, /*nb_negative*/ + 0, /*nb_positive*/ + 0, /*nb_absolute*/ + 0, /*nb_nonzero*/ + 0, /*nb_invert*/ + 0, /*nb_lshift*/ + 0, /*nb_rshift*/ + 0, /*nb_and*/ + 0, /*nb_xor*/ + 0, /*nb_or*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_coerce*/ + #endif + 0, /*nb_int*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*reserved*/ + #else + 0, /*nb_long*/ + #endif + 0, /*nb_float*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_oct*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*nb_hex*/ + #endif + 0, /*nb_inplace_add*/ + 0, /*nb_inplace_subtract*/ + 0, /*nb_inplace_multiply*/ + #if PY_MAJOR_VERSION < 3 + 0, /*nb_inplace_divide*/ + #endif + 0, /*nb_inplace_remainder*/ + 0, /*nb_inplace_power*/ + 0, /*nb_inplace_lshift*/ + 0, /*nb_inplace_rshift*/ + 0, /*nb_inplace_and*/ + 0, /*nb_inplace_xor*/ + 0, /*nb_inplace_or*/ + 0, /*nb_floor_divide*/ + 0, /*nb_true_divide*/ + 0, /*nb_inplace_floor_divide*/ + 0, /*nb_inplace_true_divide*/ + #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX) + 0, /*nb_index*/ + #endif +}; + +static PySequenceMethods __pyx_tp_as_sequence_Huber = { + 0, /*sq_length*/ + 0, /*sq_concat*/ + 0, /*sq_repeat*/ + 0, /*sq_item*/ + 0, /*sq_slice*/ + 0, /*sq_ass_item*/ + 0, /*sq_ass_slice*/ + 0, /*sq_contains*/ + 0, /*sq_inplace_concat*/ + 0, /*sq_inplace_repeat*/ +}; + +static PyMappingMethods __pyx_tp_as_mapping_Huber = { + 0, /*mp_length*/ + 0, /*mp_subscript*/ + 0, /*mp_ass_subscript*/ +}; + +static PyBufferProcs __pyx_tp_as_buffer_Huber = { + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getreadbuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getwritebuffer*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getsegcount*/ + #endif + #if PY_MAJOR_VERSION < 3 + 0, /*bf_getcharbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_getbuffer*/ + #endif + #if PY_VERSION_HEX >= 0x02060000 + 0, /*bf_releasebuffer*/ + #endif +}; + +PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("sgd_fast_sparse.Huber"), /*tp_name*/ + sizeof(struct __pyx_obj_15sgd_fast_sparse_Huber), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + &__pyx_tp_as_number_Huber, /*tp_as_number*/ + &__pyx_tp_as_sequence_Huber, /*tp_as_sequence*/ + &__pyx_tp_as_mapping_Huber, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + &__pyx_tp_as_buffer_Huber, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/ + __Pyx_DOCSTR("\n "), /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_15sgd_fast_sparse_Huber, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pf_15sgd_fast_sparse_5Huber___init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_15sgd_fast_sparse_Huber, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif +}; + +static struct PyMethodDef __pyx_methods[] = { + {__Pyx_NAMESTR("plain_sgd"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_plain_sgd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_plain_sgd)}, + {0, 0, 0, 0} +}; + +static void __pyx_init_filenames(void); /*proto*/ + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + __Pyx_NAMESTR("sgd_fast_sparse"), + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, + {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0}, + {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0}, + {&__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_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0}, + {&__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_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, + {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0}, + {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, + {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, + {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0}, + {&__pyx_n_s__LossFunction, __pyx_k__LossFunction, sizeof(__pyx_k__LossFunction), 0, 0, 1, 1}, + {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1}, + {&__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_indices, __pyx_k__X_indices, sizeof(__pyx_k__X_indices), 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__Y, __pyx_k__Y, sizeof(__pyx_k__Y), 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__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1}, + {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1}, + {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1}, + {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1}, + {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1}, + {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1}, + {&__pyx_n_s__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__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 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__format, __pyx_k__format, sizeof(__pyx_k__format), 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__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1}, + {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 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__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1}, + {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1}, + {&__pyx_n_s__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__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 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__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__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1}, + {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 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__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1}, + {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1}, + {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1}, + {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1}, + {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 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__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) { + __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __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 = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initsgd_fast_sparse(void); /*proto*/ +PyMODINIT_FUNC initsgd_fast_sparse(void) +#else +PyMODINIT_FUNC PyInit_sgd_fast_sparse(void); /*proto*/ +PyMODINIT_FUNC PyInit_sgd_fast_sparse(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + #if CYTHON_REFNANNY + void* __pyx_refnanny = NULL; + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__); + #endif + __pyx_init_filenames(); + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if PY_MAJOR_VERSION < 3 + __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4(__Pyx_NAMESTR("sgd_fast_sparse"), __pyx_methods, 0, 0, PYTHON_API_VERSION); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + #if PY_MAJOR_VERSION < 3 + Py_INCREF(__pyx_m); + #endif + __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); + if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_module_is_main_sgd_fast_sparse) { + if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + } + /*--- Builtin init code ---*/ + if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + __pyx_vtabptr_15sgd_fast_sparse_LossFunction = &__pyx_vtable_15sgd_fast_sparse_LossFunction; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_LossFunction.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_12LossFunction_loss; + __pyx_vtable_15sgd_fast_sparse_LossFunction.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_12LossFunction_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_dloss; + #endif + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_LossFunction.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_LossFunction = &__pyx_type_15sgd_fast_sparse_LossFunction; + __pyx_vtabptr_15sgd_fast_sparse_Regression = &__pyx_vtable_15sgd_fast_sparse_Regression; + __pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_10Regression_loss; + __pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_10Regression_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_dloss; + #endif + __pyx_type_15sgd_fast_sparse_Regression.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_Regression = &__pyx_type_15sgd_fast_sparse_Regression; + __pyx_vtabptr_15sgd_fast_sparse_Classification = &__pyx_vtable_15sgd_fast_sparse_Classification; + __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_14Classification_loss; + __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_14Classification_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_dloss; + #endif + __pyx_type_15sgd_fast_sparse_Classification.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_Classification = &__pyx_type_15sgd_fast_sparse_Classification; + __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber = &__pyx_vtable_15sgd_fast_sparse_ModifiedHuber; + __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss; + __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss; + #endif + __pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_ModifiedHuber = &__pyx_type_15sgd_fast_sparse_ModifiedHuber; + __pyx_vtabptr_15sgd_fast_sparse_Hinge = &__pyx_vtable_15sgd_fast_sparse_Hinge; + __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_5Hinge_loss; + __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_5Hinge_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_dloss; + #endif + __pyx_type_15sgd_fast_sparse_Hinge.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_Hinge = &__pyx_type_15sgd_fast_sparse_Hinge; + __pyx_vtabptr_15sgd_fast_sparse_Log = &__pyx_vtable_15sgd_fast_sparse_Log; + __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_3Log_loss; + __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_3Log_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_dloss; + #endif + __pyx_type_15sgd_fast_sparse_Log.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_Log = &__pyx_type_15sgd_fast_sparse_Log; + __pyx_vtabptr_15sgd_fast_sparse_SquaredError = &__pyx_vtable_15sgd_fast_sparse_SquaredError; + __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_12SquaredError_loss; + __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss; + #endif + __pyx_type_15sgd_fast_sparse_SquaredError.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_SquaredError = &__pyx_type_15sgd_fast_sparse_SquaredError; + __pyx_vtabptr_15sgd_fast_sparse_Huber = &__pyx_vtable_15sgd_fast_sparse_Huber; + __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression; + #if PY_MAJOR_VERSION >= 3 + __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_5Huber_loss; + __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_15sgd_fast_sparse_5Huber_dloss; + #else + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_loss; + *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_dloss; + #endif + __pyx_type_15sgd_fast_sparse_Huber.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression; + if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber; + /*--- Type import code ---*/ + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Function import code ---*/ + /*--- Execution code ---*/ + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":6 + * from __future__ import division + * + * import numpy as np # <<<<<<<<<<<<<< + * import sys + * from time import time + */ + __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":7 + * + * import numpy as np + * import sys # <<<<<<<<<<<<<< + * from time import time + * + */ + __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":8 + * import numpy as np + * import sys + * from time import time # <<<<<<<<<<<<<< + * + * cimport numpy as np + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1 + * # Author: Peter Prettenhofer # <<<<<<<<<<<<<< + * # + * # License: BSD Style. + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(((PyObject *)__pyx_t_2)); + __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; + + /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2 + * + * cdef extern from "stdlib.h" nogil: # <<<<<<<<<<<<<< + * void free(void *ptr) + * void *malloc(size_t size) + */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + if (__pyx_m) { + __Pyx_AddTraceback("init sgd_fast_sparse"); + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init sgd_fast_sparse"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +static const char *__pyx_filenames[] = { + "sgd_fast_sparse.pyx", + "numpy.pxd", +}; + +/* Runtime support code */ + +static void __pyx_init_filenames(void) { + __pyx_f = __pyx_filenames; +} + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AS_STRING(kw_name)); + #endif +} + +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *number, *more_or_less; + + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + number = (num_expected == 1) ? "" : "s"; + PyErr_Format(PyExc_TypeError, + #if PY_VERSION_HEX < 0x02050000 + "%s() takes %s %d positional argument%s (%d given)", + #else + "%s() takes %s %zd positional argument%s (%zd given)", + #endif + func_name, more_or_less, num_expected, number, num_found); +} + +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + } else { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) { + #else + if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) { + #endif + goto invalid_keyword_type; + } else { + for (name = first_kw_arg; *name; name++) { + #if PY_MAJOR_VERSION >= 3 + if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && + PyUnicode_Compare(**name, key) == 0) break; + #else + if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && + _PyString_Eq(**name, key)) break; + #endif + } + if (*name) { + values[name-argnames] = value; + } else { + /* unexpected keyword found */ + for (name=argnames; name != first_kw_arg; name++) { + if (**name == key) goto arg_passed_twice; + #if PY_MAJOR_VERSION >= 3 + if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && + PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice; + #else + if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && + _PyString_Eq(**name, key)) goto arg_passed_twice; + #endif + } + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + } + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, **name); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%s() got an unexpected keyword argument '%s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +static 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; + int new_count, enc_count; + int is_complex; + char enc_type; + char packmode; +} __Pyx_BufFmt_Context; + +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} + +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} + +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + char msg[] = {ch, 0}; + PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%s'", msg); +} + +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'b': return "'char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 0: return "end"; + default: return "unparseable format string"; + } +} + +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} + +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} + +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_s_long_long; +#endif + +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_s_long_long) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} + +static size_t __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'h': case 'i': case 'l': case 'q': return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; + case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); + case 'O': return 'O'; + case 'P': return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} + +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} + +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset; + if (ctx->enc_type == 0) return 0; + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + + if (ctx->packmode == '@' || ctx->packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->packmode == '@') { + int align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + int align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + } + + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + /* special case -- treat as struct rather than complex number */ + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %"PY_FORMAT_SIZE_T"d " + "but %"PY_FORMAT_SIZE_T"d expected", ctx->fmt_offset, offset); + return -1; + } + + ctx->fmt_offset += size; + + --ctx->enc_count; /* Consume from buffer string */ + + /* Done checking, move to next field, pushing or popping struct stack if needed */ + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; /* breaks both loops as ctx->enc_count == 0 */ + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; /* empty struct */ + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} + +static int __Pyx_BufFmt_FirstPack(__Pyx_BufFmt_Context* ctx) { + if (ctx->enc_type != 0 || ctx->packmode != '@') { + PyErr_SetString(PyExc_ValueError, "Buffer packing mode currently only allowed at beginning of format string (this is a defect)"); + return -1; + } + return 0; +} + +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case 10: + case 13: + ++ts; + break; + case '<': + if (!__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL; + ctx->packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL; + ctx->packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + if (__Pyx_BufFmt_FirstPack(ctx) == -1) return NULL; + ctx->packmode = *ts++; + break; + case 'T': /* substruct */ + { + int i; + const char* ts_after_sub; + int struct_count = ctx->new_count; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + } + break; + case '}': /* end of substruct; either repeat or move on */ + ++ts; + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } /* fall through */ + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex) { + /* Continue pooling same type */ + ctx->enc_count += ctx->new_count; + } else { + /* New type */ + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + } + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + default: + { + ctx->new_count = __Pyx_BufFmt_ParseNumber(&ts); + if (ctx->new_count == -1) { /* First char was not a digit */ + char msg[2] = { *ts, 0 }; + PyErr_Format(PyExc_ValueError, + "Does not understand character buffer dtype format string ('%s')", msg); + return NULL; + } + } + + } + } +} + +static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} + +static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { + if (obj == Py_None) { + __Pyx_ZeroBuffer(buf); + return 0; + } + buf->buf = NULL; + if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; + if (buf->ndim != nd) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned)buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%"PY_FORMAT_SIZE_T"d byte%s) does not match size of '%s' (%"PY_FORMAT_SIZE_T"d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_ZeroBuffer(buf); + return -1; +} + +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (info->buf == NULL) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_Format(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(PyObject_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +static void __Pyx_RaiseBufferFallbackError(void) { + PyErr_Format(PyExc_ValueError, + "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!"); +} + + + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} + +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} + + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + #if PY_VERSION_HEX < 0x02050000 + "need more than %d value%s to unpack", (int)index, + #else + "need more than %zd value%s to unpack", index, + #endif + (index == 1) ? "" : "s"); +} + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void) { + PyErr_SetString(PyExc_ValueError, "too many values to unpack"); +} + +static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) { + PyObject *item; + if (!(item = PyIter_Next(iter))) { + if (!PyErr_Occurred()) { + __Pyx_RaiseNeedMoreValuesError(index); + } + } + return item; +} + +static int __Pyx_EndUnpack(PyObject *iter) { + PyObject *item; + if ((item = PyIter_Next(iter))) { + Py_DECREF(item); + __Pyx_RaiseTooManyValuesError(); + return -1; + } + else if (!PyErr_Occurred()) + return 0; + else + return -1; +} + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(); + } +} + +static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact) +{ + if (!type) { + PyErr_Format(PyExc_SystemError, "Missing type object"); + return 0; + } + if (none_allowed && obj == Py_None) return 1; + else if (exact) { + if (Py_TYPE(obj) == type) return 1; + } + else { + if (PyObject_TypeCheck(obj, type)) return 1; + } + PyErr_Format(PyExc_TypeError, + "Argument '%s' has incorrect type (expected %s, got %s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); + return 0; +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + #if PY_VERSION_HEX >= 0x02060000 + if (Py_TYPE(obj)->tp_flags & Py_TPFLAGS_HAVE_NEWBUFFER) + return PyObject_GetBuffer(obj, view, flags); + #endif + if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pf_5numpy_7ndarray___getbuffer__(obj, view, flags); + else { + PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; + } +} + +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject* obj = view->obj; + if (obj) { +if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarray___releasebuffer__(obj, view); + Py_DECREF(obj); + view->obj = NULL; + } +} + +#endif + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { + PyObject *__import__ = 0; + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + __import__ = __Pyx_GetAttrString(__pyx_b, "__import__"); + if (!__import__) + goto bad; + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + module = PyObject_CallFunctionObjArgs(__import__, + name, global_dict, empty_dict, list, NULL); +bad: + Py_XDECREF(empty_list); + Py_XDECREF(__import__); + Py_XDECREF(empty_dict); + return module; +} + +static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { + PyObject *result; + result = PyObject_GetAttr(dict, name); + if (!result) + PyErr_SetObject(PyExc_NameError, name); + return result; +} + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(tb); + /* First, check the traceback argument, replacing None with NULL. */ + if (tb == Py_None) { + Py_DECREF(tb); + tb = 0; + } + else if (tb != NULL && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + /* Next, replace a missing value with None */ + if (value == NULL) { + value = Py_None; + Py_INCREF(value); + } + #if PY_VERSION_HEX < 0x02050000 + if (!PyClass_Check(type)) + #else + if (!PyType_Check(type)) + #endif + { + /* Raising an instance. The value should be a dummy. */ + if (value != Py_None) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + /* Normalize to raise , */ + Py_DECREF(value); + value = type; + #if PY_VERSION_HEX < 0x02050000 + if (PyInstance_Check(type)) { + type = (PyObject*) ((PyInstanceObject*)type)->in_class; + Py_INCREF(type); + } + else { + type = 0; + PyErr_SetString(PyExc_TypeError, + "raise: exception must be an old-style class or instance"); + goto raise_error; + } + #else + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + #endif + } + + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} + +#else /* Python 3+ */ + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (!PyExceptionClass_Check(type)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + + PyErr_SetObject(type, value); + + if (tb) { + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } + } + +bad: + return; +} +#endif + +#if PY_MAJOR_VERSION < 3 +static PyObject *__Pyx_GetStdout(void) { + PyObject *f = PySys_GetObject((char *)"stdout"); + if (!f) { + PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); + } + return f; +} + +static int __Pyx_Print(PyObject *arg_tuple, int newline) { + PyObject *f; + PyObject* v; + int i; + + if (!(f = __Pyx_GetStdout())) + return -1; + for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { + if (PyFile_SoftSpace(f, 1)) { + if (PyFile_WriteString(" ", f) < 0) + return -1; + } + v = PyTuple_GET_ITEM(arg_tuple, i); + if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) + return -1; + if (PyString_Check(v)) { + char *s = PyString_AsString(v); + Py_ssize_t len = PyString_Size(v); + if (len > 0 && + isspace(Py_CHARMASK(s[len-1])) && + s[len-1] != ' ') + PyFile_SoftSpace(f, 0); + } + } + if (newline) { + if (PyFile_WriteString("\n", f) < 0) + return -1; + PyFile_SoftSpace(f, 0); + } + return 0; +} + +#else /* Python 3 has a print function */ + +static int __Pyx_Print(PyObject *arg_tuple, int newline) { + PyObject* kwargs = 0; + PyObject* result = 0; + PyObject* end_string; + if (!__pyx_print) { + __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); + if (!__pyx_print) + return -1; + } + if (!newline) { + if (!__pyx_print_kwargs) { + __pyx_print_kwargs = PyDict_New(); + if (!__pyx_print_kwargs) + return -1; + end_string = PyUnicode_FromStringAndSize(" ", 1); + if (!end_string) + return -1; + if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) { + Py_DECREF(end_string); + return -1; + } + Py_DECREF(end_string); + } + kwargs = __pyx_print_kwargs; + } + result = PyObject_Call(__pyx_print, arg_tuple, kwargs); + if (!result) + return -1; + Py_DECREF(result); + return 0; +} + +#endif + +#if PY_MAJOR_VERSION < 3 + +static int __Pyx_PrintOne(PyObject *o) { + PyObject *f; + if (!(f = __Pyx_GetStdout())) + return -1; + if (PyFile_SoftSpace(f, 0)) { + if (PyFile_WriteString(" ", f) < 0) + return -1; + } + if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) + return -1; + if (PyFile_WriteString("\n", f) < 0) + return -1; + return 0; + /* the line below is just to avoid compiler + * compiler warnings about unused functions */ + return __Pyx_Print(NULL, 0); +} + +#else /* Python 3 has a print function */ + +static int __Pyx_PrintOne(PyObject *o) { + int res; + PyObject* arg_tuple = PyTuple_New(1); + if (unlikely(!arg_tuple)) + return -1; + Py_INCREF(o); + PyTuple_SET_ITEM(arg_tuple, 0, o); + res = __Pyx_Print(arg_tuple, 1); + Py_DECREF(arg_tuple); + return res; +} + +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } +/* + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { +#if HAVE_HYPOT + return hypotf(z.real, z.imag); +#else + return sqrtf(z.real*z.real + z.imag*z.imag); +#endif + } +*/ +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } +/* + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { +#if HAVE_HYPOT + return hypot(z.real, z.imag); +#else + return sqrt(z.real*z.real + z.imag*z.imag); +#endif + } +*/ +#endif + +static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { + const unsigned char neg_one = (unsigned char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned char" : + "value too large to convert to unsigned char"); + } + return (unsigned char)-1; + } + return (unsigned char)val; + } + return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { + const unsigned short neg_one = (unsigned short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned short" : + "value too large to convert to unsigned short"); + } + return (unsigned short)-1; + } + return (unsigned short)val; + } + return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { + const unsigned int neg_one = (unsigned int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(unsigned int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(unsigned int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to unsigned int" : + "value too large to convert to unsigned int"); + } + return (unsigned int)-1; + } + return (unsigned int)val; + } + return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); +} + +static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { + const char neg_one = (char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to char" : + "value too large to convert to char"); + } + return (char)-1; + } + return (char)val; + } + return (char)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { + const short neg_one = (short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to short" : + "value too large to convert to short"); + } + return (short)-1; + } + return (short)val; + } + return (short)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { + const int neg_one = (int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to int" : + "value too large to convert to int"); + } + return (int)-1; + } + return (int)val; + } + return (int)__Pyx_PyInt_AsLong(x); +} + +static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { + const signed char neg_one = (signed char)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed char) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed char)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed char" : + "value too large to convert to signed char"); + } + return (signed char)-1; + } + return (signed char)val; + } + return (signed char)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { + const signed short neg_one = (signed short)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed short) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed short)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed short" : + "value too large to convert to signed short"); + } + return (signed short)-1; + } + return (signed short)val; + } + return (signed short)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { + const signed int neg_one = (signed int)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (sizeof(signed int) < sizeof(long)) { + long val = __Pyx_PyInt_AsLong(x); + if (unlikely(val != (long)(signed int)val)) { + if (!unlikely(val == -1 && PyErr_Occurred())) { + PyErr_SetString(PyExc_OverflowError, + (is_unsigned && unlikely(val < 0)) ? + "can't convert negative value to signed int" : + "value too large to convert to signed int"); + } + return (signed int)-1; + } + return (signed int)val; + } + return (signed int)__Pyx_PyInt_AsSignedLong(x); +} + +static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { + const unsigned long neg_one = (unsigned long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned long"); + return (unsigned long)-1; + } + return (unsigned long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned long"); + return (unsigned long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + unsigned long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (unsigned long)-1; + val = __Pyx_PyInt_AsUnsignedLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { + const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG)-1; + } + return (unsigned PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned PY_LONG_LONG"); + return (unsigned PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + unsigned PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (unsigned PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsUnsignedLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { + const long neg_one = (long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long)-1; + } + return (long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (long)-1; + val = __Pyx_PyInt_AsLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { + const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to PY_LONG_LONG"); + return (PY_LONG_LONG)-1; + } + return (PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to PY_LONG_LONG"); + return (PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { + const signed long neg_one = (signed long)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed long"); + return (signed long)-1; + } + return (signed long)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed long"); + return (signed long)-1; + } + return PyLong_AsUnsignedLong(x); + } else { + return PyLong_AsLong(x); + } + } else { + signed long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (signed long)-1; + val = __Pyx_PyInt_AsSignedLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { + const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_VERSION_HEX < 0x03000000 + if (likely(PyInt_Check(x))) { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed PY_LONG_LONG"); + return (signed PY_LONG_LONG)-1; + } + return (signed PY_LONG_LONG)val; + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to signed PY_LONG_LONG"); + return (signed PY_LONG_LONG)-1; + } + return PyLong_AsUnsignedLongLong(x); + } else { + return PyLong_AsLongLong(x); + } + } else { + signed PY_LONG_LONG val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (signed PY_LONG_LONG)-1; + val = __Pyx_PyInt_AsSignedLongLong(tmp); + Py_DECREF(tmp); + return val; + } +} + +static void __Pyx_WriteUnraisable(const char *name) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +} + +static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX < 0x03010000 + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#else + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +#ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + long size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + #if PY_MAJOR_VERSION < 3 + py_name = PyString_FromString(class_name); + #else + py_name = PyUnicode_FromString(class_name); + #endif + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%s.%s is not a type object", + module_name, class_name); + goto bad; + } + if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility", + module_name, class_name); + PyErr_WarnEx(NULL, warning, 0); + } + else if (((PyTypeObject *)result)->tp_basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%s.%s has the wrong size, try recompiling", + module_name, class_name); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return 0; +} +#endif + +#ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + + #if PY_MAJOR_VERSION < 3 + py_name = PyString_FromString(name); + #else + py_name = PyUnicode_FromString(name); + #endif + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" + +static void __Pyx_AddTraceback(const char *funcname) { + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + PyObject *py_globals = 0; + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(__pyx_filename); + #else + py_srcfile = PyUnicode_FromString(__pyx_filename); + #endif + if (!py_srcfile) goto bad; + if (__pyx_clineno) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_globals = PyModule_GetDict(__pyx_m); + if (!py_globals) goto bad; + py_code = PyCode_New( + 0, /*int argcount,*/ + #if PY_MAJOR_VERSION >= 3 + 0, /*int kwonlyargcount,*/ + #endif + 0, /*int nlocals,*/ + 0, /*int stacksize,*/ + 0, /*int flags,*/ + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + __pyx_lineno, /*int firstlineno,*/ + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + if (!py_code) goto bad; + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + py_globals, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + py_frame->f_lineno = __pyx_lineno; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else /* Python 3+ has unicode identifiers */ + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +/* Type Conversion Functions */ + +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + if (x == Py_True) return 1; + else if ((x == Py_False) | (x == Py_None)) return 0; + else return PyObject_IsTrue(x); +} + +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { + PyNumberMethods *m; + const char *name = NULL; + PyObject *res = NULL; +#if PY_VERSION_HEX < 0x03000000 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return Py_INCREF(x), x; + m = Py_TYPE(x)->tp_as_number; +#if PY_VERSION_HEX < 0x03000000 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } +#else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } +#endif + if (res) { +#if PY_VERSION_HEX < 0x03000000 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%s__ returned non-%s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} + +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject* x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} + +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { +#if PY_VERSION_HEX < 0x02050000 + if (ival <= LONG_MAX) + return PyInt_FromLong((long)ival); + else { + unsigned char *bytes = (unsigned char *) &ival; + int one = 1; int little = (int)*(unsigned char*)&one; + return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); + } +#else + return PyInt_FromSize_t(ival); +#endif +} + +static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { + unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); + if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { + return (size_t)-1; + } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t)-1; + } + return (size_t)val; +} + + +#endif /* Py_PYTHON_H */ diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html new file mode 100644 index 0000000000000..d0582316a1450 --- /dev/null +++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html @@ -0,0 +1,3623 @@ + + + + + + + + +

Generated by Cython 0.12.1 on Mon Oct 18 22:25:08 2010 +

Raw output: sgd_fast_sparse.c +

 1: # Author: Peter Prettenhofer <peter.prettenhofer@gmail.com>
+
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+
 2: #
+
 3: # License: BSD Style.
+
 4: from __future__ import division
+
 5: 
+
 6: import numpy as np
+
+    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
 7: import sys
+
+    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+
 8: from time import time
+
+    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
 9: 
+
 10: cimport numpy as np
+
 11: cimport cython
+
 12: 
+
 13: cdef extern from "math.h":
+
 14:     cdef extern double exp(double x)
+
 15:     cdef extern double log(double x)
+
 16:     cdef extern double sqrt(double x)
+
 17: 
+
 18: ctypedef np.float64_t DOUBLE
+
 19: ctypedef np.int32_t INTEGER
+
 20: 
+
 21: DEF L1 = 1
+
 22: DEF L2 = 2
+
 23: DEF ELASTICNET = 3
+
 24: 
+
 25: 
+
 26: # ----------------------------------------
+
 27: # Extension Types for Loss Functions
+
 28: # ----------------------------------------
+
 29: 
+
 30: cdef class LossFunction:
+
+struct __pyx_obj_15sgd_fast_sparse_LossFunction {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
+  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
+
+
 31:     """Base class for convex loss functions"""
+
 32:     cpdef double loss(self, double p, double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __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 = 32; __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 = 32; __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 = 32; __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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 33:         """Evaluate the loss function.
+
 34: 
+
 35:         :arg p: The prediction.
+
 36:         :type p: double
+
 37:         :arg y: The true value.
+
 38:         :type y: double
+
 39:         :returns: double"""
+
 40:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 41:     cpdef double dloss(self, double p, double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __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 = 41; __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 = 41; __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 = 41; __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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 42:         """Evaluate the derivative of the loss function.
+
 43: 
+
 44:         :arg p: The prediction.
+
 45:         :type p: double
+
 46:         :arg y: The true value.
+
 47:         :type y: double
+
 48:         :returns: double"""
+
 49:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 50: 
+
 51: cdef class Regression(LossFunction):
+
+struct __pyx_obj_15sgd_fast_sparse_Regression {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
+
+
 52:     """Base class for loss functions for regression."""
+
 53:     cpdef double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __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 = 53; __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 = 53; __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 = 53; __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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 54:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 55:     cpdef double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __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 = 55; __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 = 55; __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 = 55; __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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 56:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 57: 
+
 58: 
+
 59: cdef class Classification(LossFunction):
+
+struct __pyx_obj_15sgd_fast_sparse_Classification {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
+
+
 60:     """Base class for loss functions for classification."""
+
 61:     cpdef double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __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 = 61; __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 = 61; __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 = 61; __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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 62:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 63:     cpdef double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __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 = 63; __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 = 63; __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 = 63; __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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 64:         raise NotImplementedError()
+
+    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 65: 
+
 66: cdef class ModifiedHuber(Classification):
+
+struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
+
+
 67:     """Modified Huber loss function for binary
+
 68:     classification tasks with y in {-1,1}.
+
 69:     Its equivalent to quadratically smoothed SVM
+
 70:     with gamma = 2.
+
 71: 
+
 72:     See T. Zhang 'Solving
+
 73:     Large Scale Linear Prediction Problems Using
+
 74:     Stochastic Gradient Descent', ICML'04.
+
 75:     """
+
 76:     cpdef double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __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 = 76; __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 = 76; __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 = 76; __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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 77:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 78:         if z >= 1:
+
+    __pyx_t_6 = (__pyx_v_z >= 1);
+  if (__pyx_t_6) {
+
 79:             return 0
+
+        __pyx_r = 0;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+
 80:         elif z >= -1:
+
+    __pyx_t_6 = (__pyx_v_z >= -1);
+  if (__pyx_t_6) {
+
 81:             return (1-z) * (1-z)
+
+        __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z));
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
 82:         else:
+
 83:             return -4*z
+
+        __pyx_r = (-4 * __pyx_v_z);
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 84: 
+
 85:     cpdef double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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;}
+      }
+    }
+    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:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 86:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 87:         if z >= 1:
+
+    __pyx_t_6 = (__pyx_v_z >= 1);
+  if (__pyx_t_6) {
+
 88:             return 0
+
+        __pyx_r = 0;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+
 89:         elif z >= -1:
+
+    __pyx_t_6 = (__pyx_v_z >= -1);
+  if (__pyx_t_6) {
+
 90:             return 2*(1-z)*y
+
+        __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y);
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
 91:         else:
+
 92:             return 4*y
+
+        __pyx_r = (4 * __pyx_v_y);
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 93: 
+
 94:     def __reduce__(self):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannySetupContext("__reduce__");
+
 95:         return ModifiedHuber,()
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
+  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
+  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
+  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.__reduce__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 96: 
+
 97: cdef class Hinge(Classification):
+
+struct __pyx_obj_15sgd_fast_sparse_Hinge {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
+
+
 98:     """SVM classification loss for binary
+
 99:     classification tasks with y in {-1,1}.
+
 100:     """
+
 101:     cpdef  double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __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 = 101; __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 = 101; __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 = 101; __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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 102:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 103:         if z < 1.0:
+
+    __pyx_t_6 = (__pyx_v_z < 1.0);
+  if (__pyx_t_6) {
+
 104:             return (1 - z)
+
+        __pyx_r = (1 - __pyx_v_z);
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
 105:         return 0
+
+    __pyx_r = 0;
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 106:     cpdef  double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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, 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:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 107:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 108:         if z < 1.0:
+
+    __pyx_t_6 = (__pyx_v_z < 1.0);
+  if (__pyx_t_6) {
+
 109:             return y
+
+        __pyx_r = __pyx_v_y;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
 110:         return 0
+
+    __pyx_r = 0;
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 111: 
+
 112:     def __reduce__(self):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannySetupContext("__reduce__");
+
 113:         return Hinge,()
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
+  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
+  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
+  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.__reduce__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 114: 
+
 115: 
+
 116: cdef class Log(Classification):
+
+struct __pyx_obj_15sgd_fast_sparse_Log {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
+
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+
 117:     """Logistic regression loss for binary classification
+
 118:     tasks with y in {-1,1}.
+
 119:     """
+
 120:     cpdef double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __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 = 120; __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 = 120; __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 = 120; __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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 121:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 122:         if z > 18:
+
+    __pyx_t_6 = (__pyx_v_z > 18);
+  if (__pyx_t_6) {
+
 123:             return exp(-z)
+
+        __pyx_r = exp((-__pyx_v_z));
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
 124:         if z < -18:
+
+    __pyx_t_6 = (__pyx_v_z < -18);
+  if (__pyx_t_6) {
+
 125:             return -z * y
+
+        __pyx_r = ((-__pyx_v_z) * __pyx_v_y);
+    goto __pyx_L0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
 126:         return log(1.0+exp(-z))
+
+    __pyx_r = log((1.0 + exp((-__pyx_v_z))));
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 127: 
+
 128:     cpdef  double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __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 = 128; __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 = 128; __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 = 128; __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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 129:         cdef double z = p*y
+
+    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
+
 130:         if z > 18:
+
+    __pyx_t_6 = (__pyx_v_z > 18);
+  if (__pyx_t_6) {
+
 131:             return exp(-z) * y
+
+        __pyx_r = (exp((-__pyx_v_z)) * __pyx_v_y);
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  __pyx_L3:;
+
 132:         if z < -18:
+
+    __pyx_t_6 = (__pyx_v_z < -18);
+  if (__pyx_t_6) {
+
 133:             return y
+
+        __pyx_r = __pyx_v_y;
+    goto __pyx_L0;
+    goto __pyx_L4;
+  }
+  __pyx_L4:;
+
 134:         return y / (exp(z) + 1.0)
+
+    __pyx_t_5 = (exp(__pyx_v_z) + 1.0);
+  if (unlikely(__pyx_t_5 == 0)) {
+    PyErr_Format(PyExc_ZeroDivisionError, "float division");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_r = (__pyx_v_y / __pyx_t_5);
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 135: 
+
 136:     def __reduce__(self):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannySetupContext("__reduce__");
+
 137:         return Log,()
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
+  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
+  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
+  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Log.__reduce__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 138: 
+
 139: cdef class SquaredError(Regression):
+
+struct __pyx_obj_15sgd_fast_sparse_SquaredError {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
+
+
 140:     """
+
 141:     """
+
 142:     cpdef  double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __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 = 142; __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 = 142; __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 = 142; __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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); 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_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 143:         return 0.5 * (p-y) * (p-y)
+
+    __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 144:     cpdef  double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __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 = 144; __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 = 144; __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 = 144; __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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 145:         return y - p
+
+    __pyx_r = (__pyx_v_y - __pyx_v_p);
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 146: 
+
 147:     def __reduce__(self):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannySetupContext("__reduce__");
+
 148:         return SquaredError,()
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
+  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
+  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
+  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.__reduce__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 149: 
+
 150: cdef class Huber(Regression):
+
+struct __pyx_obj_15sgd_fast_sparse_Huber {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+  double c;
+};
+
+struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
+
+
 151:     """
+
 152:     """
+
 153:     cdef double c
+
 154:     def __init__(self,c):
+
+static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyObject *__pyx_v_c = 0;
+  int __pyx_r;
+  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};
+    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 = 154; __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:;
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
+  return -1;
+  __pyx_L4_argument_unpacking_done:;
+
 155:         self.c = c
+
+    __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
+  __pyx_r = -1;
+  __pyx_L0:;
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 156:     cpdef  double loss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __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 = 156; __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 = 156; __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 = 156; __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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 157:         cdef double r = p-y
+
+    __pyx_v_r = (__pyx_v_p - __pyx_v_y);
+
 158:         cdef double abs_r = abs(r)
+
+    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __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 = 158; __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 = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_abs_r = __pyx_t_5;
+
 159:         if abs_r <= self.c:
+
+    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_6) {
+
 160:             return 0.5 * r * r
+
+        __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
 161:         else:
+
 162:             return self.c * abs_r - (0.5*self.c*self.c)
+
+        __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 163: 
+
 164:     cpdef  double dloss(self,double p,double y):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  double __pyx_v_p;
+  double __pyx_v_y;
+  PyObject *__pyx_r = NULL;
+  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};
+    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 = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 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:;
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 165:         cdef double r = y - p
+
+    __pyx_v_r = (__pyx_v_y - __pyx_v_p);
+
 166:         cdef double abs_r = abs(r)
+
+    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __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 = 166; __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 = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_abs_r = __pyx_t_5;
+
 167:         if abs_r <= self.c:
+
+    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_6) {
+
 168:             return r
+
+        __pyx_r = __pyx_v_r;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+
 169:         elif r > 0:
+
+    __pyx_t_6 = (__pyx_v_r > 0);
+  if (__pyx_t_6) {
+
 170:             return self.c
+
+        __pyx_r = __pyx_v_self->c;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
 171:         else:
+
 172:             return -self.c
+
+        __pyx_r = (-__pyx_v_self->c);
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 173: 
+
 174:     def __reduce__(self):
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+  PyObject *__pyx_r = NULL;
+  __Pyx_RefNannySetupContext("__reduce__");
+
 175:         return Huber,(self.c,)
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
+  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__reduce__");
+  __pyx_r = NULL;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 176: 
+
 177: @cython.boundscheck(False)
+
 178: @cython.wraparound(False)
+
 179: @cython.cdivision(True)
+
 180: def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
+
+static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
+static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n\n    \n    ";
+static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
+  PyArrayObject *__pyx_v_w = 0;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_intercept;
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_loss = 0;
+  int __pyx_v_penalty_type;
+  double __pyx_v_alpha;
+  double __pyx_v_rho;
+  PyArrayObject *__pyx_v_X_data = 0;
+  PyArrayObject *__pyx_v_X_indices = 0;
+  PyArrayObject *__pyx_v_X_indptr = 0;
+  PyArrayObject *__pyx_v_y = 0;
+  int __pyx_v_n_iter;
+  int __pyx_v_fit_intercept;
+  int __pyx_v_verbose;
+  int __pyx_v_shuffle;
+  unsigned int __pyx_v_n_samples;
+  unsigned int __pyx_v_n_features;
+  PyArrayObject *__pyx_v_index = 0;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_p;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_update;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sumloss;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wnorm;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_t;
+  unsigned int __pyx_v_count;
+  unsigned int __pyx_v_epoch;
+  unsigned int __pyx_v_i;
+  unsigned int __pyx_v_sample;
+  PyArrayObject *__pyx_v_q = 0;
+  double __pyx_v_u;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_typw;
+  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta0;
+  PyObject *__pyx_v_t_start;
+  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_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_q;
+  Py_ssize_t __pyx_bstride_0_q = 0;
+  Py_ssize_t __pyx_bshape_0_q = 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_w;
+  Py_ssize_t __pyx_bstride_0_w = 0;
+  Py_ssize_t __pyx_bshape_0_w = 0;
+  Py_buffer __pyx_bstruct_y;
+  Py_ssize_t __pyx_bstride_0_y = 0;
+  Py_ssize_t __pyx_bshape_0_y = 0;
+  PyObject *__pyx_r = NULL;
+  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,0};
+  __Pyx_RefNannySetupContext("plain_sgd");
+  __pyx_self = __pyx_self;
+  if (unlikely(__pyx_kwds)) {
+    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
+    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+    switch (PyTuple_GET_SIZE(__pyx_args)) {
+      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, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+    }
+    if (unlikely(kw_args > 0)) {
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
+    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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  }
+  goto __pyx_L4_argument_unpacking_done;
+  __pyx_L5_argtuple_error:;
+  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __pyx_L3_error:;
+  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
+  return NULL;
+  __pyx_L4_argument_unpacking_done:;
+  __Pyx_INCREF((PyObject *)__pyx_v_w);
+  __Pyx_INCREF((PyObject *)__pyx_v_loss);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
+  __Pyx_INCREF((PyObject *)__pyx_v_y);
+  __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
+  __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;
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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];
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __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_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __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_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __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_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_bstride_0_y = __pyx_bstruct_y.strides[0];
+  __pyx_bshape_0_y = __pyx_bstruct_y.shape[0];
+
 181:               DOUBLE intercept,
+
 182:               LossFunction loss,
+
 183:               int penalty_type,
+
 184:               double alpha, double rho,
+
 185:               np.ndarray[DOUBLE, ndim=1] X_data,
+
 186:               np.ndarray[INTEGER, ndim=1] X_indices,
+
 187:               np.ndarray[INTEGER, ndim=1] X_indptr,
+
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
+static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+  int __pyx_v_copy_shape;
+  int __pyx_v_i;
+  int __pyx_v_ndim;
+  int __pyx_v_endian_detector;
+  int __pyx_v_little_endian;
+  int __pyx_v_t;
+  char *__pyx_v_f;
+  PyArray_Descr *__pyx_v_descr = 0;
+  int __pyx_v_offset;
+  int __pyx_v_hasfields;
+  int __pyx_r;
+  __Pyx_RefNannySetupContext("__getbuffer__");
+  if (__pyx_v_info == NULL) return 0;
+  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
+  __Pyx_GIVEREF(__pyx_v_info->obj);
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+
 188:               np.ndarray[DOUBLE, ndim=1] y,
+
 189:               int n_iter, int fit_intercept,
+
 190:               int verbose, int shuffle):
+
 191:     """Cython implementation of SGD with different loss functions and
+
 192:     penalties.
+
 193: 
+
+    __pyx_v_endian_detector = 1;
+
 194: 
+
+    __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
+
 195:     """
+
 196:     # get the data information into easy vars
+
+    __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
+
 197:     cdef unsigned int n_samples = y.shape[0]
+
+    __pyx_v_n_samples = (__pyx_v_y->dimensions[0]);
+
 198:     cdef unsigned int n_features = w.shape[0]
+
+    __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
+
+    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_1) {
+
 199: 
+
+        __pyx_v_copy_shape = 1;
+    goto __pyx_L5;
+  }
+  /*else*/ {
+
 200:     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples) # FIXME unsined int?
+
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = ((PyArrayObject *)__pyx_t_1);
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, 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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
+      __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
+    }
+  }
+  __pyx_t_4 = 0;
+  __pyx_v_index = ((PyArrayObject *)__pyx_t_1);
+  __pyx_t_1 = 0;
+
 201:     cdef DOUBLE wscale = 1.0
+
+    __pyx_v_wscale = 1.0;
+
+        __pyx_v_copy_shape = 0;
+  }
+  __pyx_L5:;
+
 202:     cdef DOUBLE eta = 0.0
+
+    __pyx_v_eta = 0.0;
+
 203:     cdef DOUBLE p = 0.0
+
+    __pyx_v_p = 0.0;
+
+    __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
+  if (__pyx_t_1) {
+
 204:     cdef DOUBLE update = 0.0
+
+    __pyx_v_update = 0.0;
+
+        __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
+    __pyx_t_3 = __pyx_t_2;
+  } else {
+    __pyx_t_3 = __pyx_t_1;
+  }
+  if (__pyx_t_3) {
+
 205:     cdef DOUBLE sumloss = 0.0
+
+    __pyx_v_sumloss = 0.0;
+
+        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
+    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
+    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
 206:     cdef DOUBLE wnorm = 0.0
+
+    __pyx_v_wnorm = 0.0;
+
 207:     cdef DOUBLE t = 0.0
+
+    __pyx_v_t = 0.0;
+
+    __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
+  if (__pyx_t_3) {
+
 208:     cdef unsigned int count = 0
+
+    __pyx_v_count = 0;
+
+        __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
+    __pyx_t_2 = __pyx_t_1;
+  } else {
+    __pyx_t_2 = __pyx_t_3;
+  }
+  if (__pyx_t_2) {
+
 209:     cdef unsigned int epoch = 0
+
+    __pyx_v_epoch = 0;
+
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
+    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
+    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    goto __pyx_L7;
+  }
+  __pyx_L7:;
+
 210:     cdef unsigned int i = 0
+
+    __pyx_v_i = 0;
+
 211:     cdef unsigned int sample = 0
+
+    __pyx_v_sample = 0;
+
+    __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
+
 212: 
+
+    __pyx_v_info->ndim = __pyx_v_ndim;
+
 213:     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = np.zeros((n_features,),
+
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __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 = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__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(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+
+    __pyx_t_6 = __pyx_v_copy_shape;
+  if (__pyx_t_6) {
+
 214:                                                            dtype = np.float64,
+
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_3, __pyx_t_1, ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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 = 213; __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_v_q = ((PyArrayObject *)__pyx_t_6);
+  __pyx_t_6 = 0;
+
 215:                                                            order = "c" )
+
 216:     cdef double u = 0.0
+
+    __pyx_v_u = 0.0;
+
+        __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
+
 217:     # computing eta0
+
+        __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
+
 218:     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
+
+    __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
+
+        __pyx_t_6 = __pyx_v_ndim;
+    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
+      __pyx_v_i = __pyx_t_7;
+
 219:     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+
+    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_typw); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_2 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)); 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_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_2 = 0;
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_max, __pyx_t_3, 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_8 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_v_eta0 = __pyx_t_8;
+
+            (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
+
 220:     t = 1.0 / (eta0 * alpha)
+
+    __pyx_v_t = (1.0 / ((double)(__pyx_v_eta0 * __pyx_v_alpha)));
+
+            (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
+    }
+    goto __pyx_L8;
+  }
+  /*else*/ {
+
 221:     t_start = time()
+
+    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(__pyx_v_t_start);
+  __pyx_v_t_start = __pyx_t_1;
+  __pyx_t_1 = 0;
+
 222:     for epoch from 0 <= epoch < n_iter:
+
+    __pyx_t_9 = __pyx_v_n_iter;
+  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
+
+        __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
+
 223:         if verbose > 0:
+
+        __pyx_t_10 = (__pyx_v_verbose > 0);
+    if (__pyx_t_10) {
+
+        __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self)));
+  }
+  __pyx_L8:;
+
 224:             print("-- Epoch %d" % (epoch + 1))
+
+            __pyx_t_1 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      goto __pyx_L8;
+    }
+    __pyx_L8:;
+
+    __pyx_v_info->suboffsets = NULL;
+
 225:         if shuffle:
+
+        __pyx_t_11 = __pyx_v_shuffle;
+    if (__pyx_t_11) {
+
+    __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
+
 226:             np.random.shuffle(index)
+
+            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__random); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_INCREF(((PyObject *)__pyx_v_index));
+      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_index));
+      __Pyx_GIVEREF(((PyObject *)__pyx_v_index));
+      __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      goto __pyx_L9;
+    }
+    __pyx_L9:;
+
+    __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
+
 227:         for i from 0 <= i < n_samples:
+
+        __pyx_t_12 = __pyx_v_n_samples;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
+
 228:             sample = index[i]
+
+            __pyx_t_13 = __pyx_v_i;
+      __pyx_v_sample = (*__Pyx_BufPtrCContig1d(__pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_bstruct_index.buf, __pyx_t_13, __pyx_bstride_0_index));
+
 229:             eta = 1.0 / (alpha * t)
+
+            __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
+
+    __pyx_v_f = NULL;
+
 230:             p = 0.0#(dot(wdata, xdata, xnnz) * wscale) + intercept
+
+            __pyx_v_p = 0.0;
+
+    __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
+  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
+
 231:             sumloss += loss.loss(p,y)
+
+            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0);
+
 232:             update = eta * loss.dloss(p,y)
+
+            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0));
+
 233:             if update != 0:
+
+            __pyx_t_10 = (__pyx_v_update != 0);
+      if (__pyx_t_10) {
+
 234:                 #add(wdata, wscale, xdata,
+
+    __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
+
 235:                 #    xnnz,update)
+
 236:                 if fit_intercept == 1:
+
+                __pyx_t_10 = (__pyx_v_fit_intercept == 1);
+        if (__pyx_t_10) {
+
+    __pyx_t_2 = (!__pyx_v_hasfields);
+  if (__pyx_t_2) {
+    __pyx_t_3 = (!__pyx_v_copy_shape);
+    __pyx_t_1 = __pyx_t_3;
+  } else {
+    __pyx_t_1 = __pyx_t_2;
+  }
+  if (__pyx_t_1) {
+
 237:                     intercept += update * 0.01
+
+                    __pyx_v_intercept += (__pyx_v_update * 0.01);
+          goto __pyx_L13;
+        }
+        __pyx_L13:;
+        goto __pyx_L12;
+      }
+      __pyx_L12:;
+
 238:             if penalty_type != L1:
+
+            __pyx_t_10 = (__pyx_v_penalty_type != 1);
+      if (__pyx_t_10) {
+
+        __Pyx_INCREF(Py_None);
+    __Pyx_GIVEREF(Py_None);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = Py_None;
+    goto __pyx_L11;
+  }
+  /*else*/ {
+
 239:                 wscale *= (1 - rho * eta * alpha)
+
+                __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
+
 240:                 if wscale < 1e-9:
+
+                __pyx_t_10 = (__pyx_v_wscale < 1.0000000000000001e-09);
+        if (__pyx_t_10) {
+
 241:                     w*=wscale
+
+                    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
+          __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __pyx_t_15 = ((PyArrayObject *)__pyx_t_1);
+          {
+            __Pyx_BufFmt_StackElem __pyx_stack[1];
+            __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+            __pyx_t_11 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+            if (unlikely(__pyx_t_11 < 0)) {
+              PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
+              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+                Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
+                __Pyx_RaiseBufferFallbackError();
+              } else {
+                PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
+              }
+            }
+            __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
+            __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
+            if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
+          __pyx_t_15 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_v_w));
+          __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
+          __pyx_t_1 = 0;
+
+        __Pyx_INCREF(__pyx_v_self);
+    __Pyx_GIVEREF(__pyx_v_self);
+    __Pyx_GOTREF(__pyx_v_info->obj);
+    __Pyx_DECREF(__pyx_v_info->obj);
+    __pyx_v_info->obj = __pyx_v_self;
+  }
+  __pyx_L11:;
+
 242:                     wscale = 1.0
+
+                    __pyx_v_wscale = 1.0;
+          goto __pyx_L15;
+        }
+        __pyx_L15:;
+        goto __pyx_L14;
+      }
+      __pyx_L14:;
+
 243:             if penalty_type == L2 or penalty_type == ELASTICNET:
+
+            switch (__pyx_v_penalty_type) {
+        case 2:
+        case 3:
+
+    __pyx_t_1 = (!__pyx_v_hasfields);
+  if (__pyx_t_1) {
+
 244:                 u += ((1.0 - rho) * eta * alpha)
+
+                __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+        break;
+      }
+
+        __pyx_v_t = __pyx_v_descr->type_num;
+
 245:                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+
+        __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
+    if (__pyx_t_1) {
+      __pyx_t_2 = __pyx_v_little_endian;
+    } else {
+      __pyx_t_2 = __pyx_t_1;
+    }
+    if (!__pyx_t_2) {
+
 246:             t += 1
+
+            __pyx_v_t += 1;
+
+            __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
+      if (__pyx_t_1) {
+        __pyx_t_3 = (!__pyx_v_little_endian);
+        __pyx_t_8 = __pyx_t_3;
+      } else {
+        __pyx_t_8 = __pyx_t_1;
+      }
+      __pyx_t_1 = __pyx_t_8;
+    } else {
+      __pyx_t_1 = __pyx_t_2;
+    }
+    if (__pyx_t_1) {
+
 247:             count += 1
+
+            __pyx_v_count += 1;
+    }
+
+            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
+      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_Raise(__pyx_t_5, 0, 0);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L13;
+    }
+    __pyx_L13:;
+
 248:         # report epoche information
+
+        __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__b;
+      goto __pyx_L14;
+    }
+
 249:         if verbose > 0:
+
+        __pyx_t_10 = (__pyx_v_verbose > 0);
+    if (__pyx_t_10) {
+
+        __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__B;
+      goto __pyx_L14;
+    }
+
 250:             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
+
+            __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dot); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__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 = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__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));
+      __Pyx_INCREF(((PyObject *)__pyx_v_w));
+      PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_w));
+      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
+      __pyx_t_3 = PyObject_Call(__pyx_t_6, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = PyNumber_Multiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = PyNumber_Multiply(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_v_wnorm = sqrt(__pyx_t_14);
+
+        __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__h;
+      goto __pyx_L14;
+    }
+
 251:             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 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shape); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_6 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_5 = PyFloat_FromDouble((((double)__pyx_v_sumloss) / ((double)__pyx_v_count))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_6);
+      __Pyx_GIVEREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      __pyx_t_3 = 0;
+      __pyx_t_1 = 0;
+      __pyx_t_6 = 0;
+      __pyx_t_2 = 0;
+      __pyx_t_5 = 0;
+      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      if (__Pyx_PrintOne(__pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+
+        __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__H;
+      goto __pyx_L14;
+    }
+
 252:             print("Total training time: %.2f seconds." % (time()-t_start))
+
+            __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_19 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      goto __pyx_L16;
+    }
+    __pyx_L16:;
+
+        __pyx_t_1 = (__pyx_v_t == NPY_INT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__i;
+      goto __pyx_L14;
+    }
+
 253: 
+
+        __pyx_t_1 = (__pyx_v_t == NPY_UINT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__I;
+      goto __pyx_L14;
+    }
+
 254:         # floating-point under-/overflow check.
+
+        __pyx_t_1 = (__pyx_v_t == NPY_LONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__l;
+      goto __pyx_L14;
+    }
+
 255:         if np.any(np.isinf(w)) or np.any(np.isnan(w)) or np.isnan(intercept) or np.isinf(intercept):
+
+        __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_5 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__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_6 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_19);
+    PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_6);
+    __Pyx_GIVEREF(__pyx_t_6);
+    __pyx_t_6 = 0;
+    __pyx_t_6 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+    if (!__pyx_t_10) {
+      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_INCREF(((PyObject *)__pyx_v_w));
+      PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
+      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
+      __pyx_t_2 = PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      __pyx_t_2 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (!__pyx_t_20) {
+        __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_6 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_6);
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_19);
+        PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_2);
+        __Pyx_GIVEREF(__pyx_t_2);
+        __pyx_t_2 = 0;
+        __pyx_t_2 = PyObject_Call(__pyx_t_6, __pyx_t_19, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
+        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+        __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        if (!__pyx_t_21) {
+          __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_19 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_19);
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_6);
+          PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_2 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_23 = __pyx_t_22;
+        } else {
+          __pyx_t_23 = __pyx_t_21;
+        }
+        __pyx_t_21 = __pyx_t_23;
+      } else {
+        __pyx_t_21 = __pyx_t_20;
+      }
+      __pyx_t_20 = __pyx_t_21;
+    } else {
+      __pyx_t_20 = __pyx_t_10;
+    }
+    if (__pyx_t_20) {
+
+        __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__L;
+      goto __pyx_L14;
+    }
+
 256:             raise ValueError("floating-point under-/overflow occured.")
+
+            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
+      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_4));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
+      __pyx_t_6 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __Pyx_Raise(__pyx_t_6, 0, 0);
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      goto __pyx_L17;
+    }
+    __pyx_L17:;
+  }
+
+        __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__q;
+      goto __pyx_L14;
+    }
+
 257: 
+
+        __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Q;
+      goto __pyx_L14;
+    }
+
 258:     w *= wscale
+
+    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __pyx_t_2 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  __pyx_t_15 = ((PyArrayObject *)__pyx_t_2);
+  {
+    __Pyx_BufFmt_StackElem __pyx_stack[1];
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+    if (unlikely(__pyx_t_9 < 0)) {
+      PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
+      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
+        Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
+        __Pyx_RaiseBufferFallbackError();
+      } else {
+        PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
+      }
+    }
+    __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 = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __pyx_t_15 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_v_w));
+  __pyx_v_w = ((PyArrayObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
+
+        __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__f;
+      goto __pyx_L14;
+    }
+
 259:     return w, intercept
+
+    __Pyx_XDECREF(__pyx_r);
+  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_6);
+  __Pyx_INCREF(((PyObject *)__pyx_v_w));
+  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
+  __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
+  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_6;
+  __pyx_t_6 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_19);
+  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
+    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
+  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
+  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
+  __pyx_r = NULL;
+  goto __pyx_L2;
+  __pyx_L0:;
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
+  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
+  __pyx_L2:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_index);
+  __Pyx_XDECREF((PyObject *)__pyx_v_q);
+  __Pyx_DECREF(__pyx_v_t_start);
+  __Pyx_DECREF((PyObject *)__pyx_v_w);
+  __Pyx_DECREF((PyObject *)__pyx_v_loss);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
+  __Pyx_DECREF((PyObject *)__pyx_v_y);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+        __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__d;
+      goto __pyx_L14;
+    }
+
 260: 
+
+        __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__g;
+      goto __pyx_L14;
+    }
+
 261: 
+
+        __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zf;
+      goto __pyx_L14;
+    }
+
 262: ## # ----------------------------------------
+
+        __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zd;
+      goto __pyx_L14;
+    }
+
 263: ## # Python function for external prediction
+
+        __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zg;
+      goto __pyx_L14;
+    }
+
 264: ## # ----------------------------------------
+
+        __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__O;
+      goto __pyx_L14;
+    }
+    /*else*/ {
+
 265: ## def predict(np.ndarray x, np.ndarray w,
+
 266: ##             double bias):
+
+            __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_4 = 0;
+      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_4, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
+    __pyx_L14:;
+
 267: ##     """Computes x*w + b efficiently.
+
+        __pyx_v_info->format = __pyx_v_f;
+
 268: 
+
+        __pyx_r = 0;
+    goto __pyx_L0;
+    goto __pyx_L12;
+  }
+  /*else*/ {
+
 269: ##     :arg x: the instance represented as a sparse vector.
+
 270: ##     :type x: np.ndarray(dtype=bolt.sparsedtype)
+
+        __pyx_v_info->format = ((char *)malloc(255));
+
 271: ##     :arg w: the weight vector represented as a dense vector.
+
+        (__pyx_v_info->format[0]) = '^';
+
 272: ##     :type w: np.ndarray(dtype=bolt.densedtype)
+
+        __pyx_v_offset = 0;
+
 273: ##     :arg b: the bias term (aka offset or intercept).
+
 274: ##     :type b: float
+
 275: ##     :returns: A double representing `x*w + b`.
+
+        __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_9;
+
 276: ##     """
+
+        (__pyx_v_f[0]) = 0;
+  }
+  __pyx_L12:;
+
+  __pyx_r = 0;
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
+  __pyx_r = -1;
+  __Pyx_GOTREF(__pyx_v_info->obj);
+  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
+  goto __pyx_L2;
+  __pyx_L0:;
+  if (__pyx_v_info->obj == Py_None) {
+    __Pyx_GOTREF(Py_None);
+    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
+  }
+  __pyx_L2:;
+  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
 277: ##     cdef int xnnz = x.shape[0]
+
 278: ##     cdef int wdim = w.shape[0]
+
+static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
+static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+  __Pyx_RefNannySetupContext("__releasebuffer__");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
+
 279: ##     cdef double y = 0.0
+
+    __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
+  if (__pyx_t_1) {
+
 280: ##     if xnnz == 0:
+
+        free(__pyx_v_info->format);
+    goto __pyx_L5;
+  }
+  __pyx_L5:;
+
 281: ##         y = bias
+
+    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_1) {
+
 282: ##     else:
+
+        free(__pyx_v_info->strides);
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+}
+
 283: ##         y = dot_checked(<double *>w.data,<Pair *>x.data,xnnz,wdim) + bias
+
 284: ##     return y
+
 285: 
+
 286: ##  # ----------------------------------------
+
 287: ##  # C functions for fast sparse-dense vector operations
+
 288: ##  # ----------------------------------------
+
 289: 
+
 290: ## cdef struct Pair:
+
 291: ##     np.uint32_t idx
+
 292: ##     np.float32_t val
+
 293: 
+
 294: ## cdef inline double max(double a, double b):
+
 295: ##     return a if a >= b else b
+
 296: 
+
 297: ## cdef inline double min(double a, double b):
+
 298: ##     return a if a <= b else b
+
 299: 
+
 300: ## cdef double dot(double *w, Pair *x, int nnz):
+
 301: ##     """Dot product of weight vector w and example x.
+
 302: ##     """
+
 303: ##     cdef double sum = 0.0
+
 304: ##     cdef Pair pair
+
 305: ##     cdef int i
+
 306: ##     for i from 0 <= i < nnz:
+
 307: ##         pair = x[i]
+
 308: ##         sum += w[pair.idx] * pair.val
+
 309: ##     return sum
+
 310: 
+
 311: ## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
+
 312: ##     """ Checked version of dot product. Ignores features in x
+
 313: ##     with a higher index than dimension of w.
+
 314: ##     """
+
 315: ##     cdef double sum = 0.0
+
 316: ##     cdef Pair pair
+
 317: ##     cdef int i
+
 318: ##     for i from 0 <= i < nnz:
+
 319: ##         pair = x[i]
+
 320: ##         if pair.idx < wdim:
+
 321: ##             sum +=w[pair.idx]*pair.val
+
 322: ##     return sum
+
 323: 
+
 324: ## cdef double add(double *w, double wscale, Pair *x, int nnz, double c):
+
 325: ##     """Scales example x by constant c and adds it to the weight vector w.
+
 326: ##     """
+
 327: ##     cdef Pair pair
+
 328: ##     cdef int i
+
 329: ##     cdef double innerprod = 0.0
+
 330: ##     cdef double xsqnorm = 0.0
+
 331: ##     for i from 0 <= i < nnz:
+
 332: ##         pair = x[i]
+
 333: ##         innerprod += (w[pair.idx] * pair.val)
+
 334: ##         xsqnorm += (pair.val*pair.val)
+
 335: ##         w[pair.idx] += pair.val * (c / wscale)
+
 336: 
+
 337: ##     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+
 338: 
+
 339: ## # ----------------------------------------
+
 340: ## # Extension type for Stochastic Gradient Descent
+
 341: ## # ----------------------------------------
+
 342: 
+
 343: ## cdef class SGD:
+
 344: 
+
 345: ##     cdef int epochs
+
 346: ##     cdef double reg
+
 347: ##     cdef LossFunction loss
+
 348: ##     cdef int norm
+
 349: ##     cdef double alpha
+
 350: 
+
 351: ##     def __init__(self, loss, reg, epochs = 5, norm = 2, alpha = 0.85):
+
 352: ##         """
+
 353: 
+
 354: ##         :arg loss: The :class:`LossFunction` (default ModifiedHuber) .
+
 355: ##         :arg reg: The regularization parameter lambda (>0).
+
 356: ##         :type reg: float.
+
 357: ##         :arg epochs: The number of iterations through the dataset.
+
 358: ##         :type epochs: int
+
 359: ##         :arg norm: Whether to minimize the L1, L2 norm or the Elastic Net.
+
 360: ##         :type norm: 1 or 2 or 3
+
 361: ##         :arg alpha: The elastic net penality parameter. A value of 1 amounts to L2 regularization whereas a value of 0 gives L1 penalty.
+
 362: ##         :type alpha: float (0 <= alpha <= 1)
+
 363: ##         """
+
 364: ##         if loss == None:
+
 365: ##             raise ValueError("Loss function must not be None.")
+
 366: ##         if reg < 0.0:
+
 367: ##             raise ValueError("reg must be larger than 0. ")
+
 368: ##         if norm not in [1,2,3]:
+
 369: ##             raise ValueError("norm must be in {1,2,3}. ")
+
 370: ##         if alpha > 1.0 or alpha < 0.0:
+
 371: ##             raise ValueError("alpha must be in [0,1]. ")
+
 372: ##         self.loss = loss
+
 373: ##         self.reg = reg
+
 374: ##         self.epochs = epochs
+
 375: ##         self.norm = norm
+
 376: ##         self.alpha = alpha
+
 377: 
+
 378: ##     def __reduce__(self):
+
 379: ##         return SGD,(self.loss,self.reg, self.epochs, self.norm, self.alpha)
+
 380: 
+
 381: ##     def train(self, model, dataset, verbose = 0, shuffle = False):
+
 382: ##         """Train `model` on the `dataset` using SGD.
+
 383: 
+
 384: ##         :arg model: The :class:`bolt.model.LinearModel` that is going to be trained.
+
 385: ##         :arg dataset: The :class:`bolt.io.Dataset`.
+
 386: ##         :arg verbose: The verbosity level. If 0 no output to stdout.
+
 387: ##         :arg shuffle: Whether or not the training data should be shuffled after each epoch.
+
 388: ##         """
+
 389: ##         self._train(model, dataset, verbose, shuffle)
+
 390: 
+
 391: ##     cdef void _train(self,model, dataset, verbose, shuffle):
+
 392: 
+
 393: ##         cdef LossFunction loss = self.loss
+
 394: ##         cdef int m = model.m
+
 395: ##         cdef int n = dataset.n
+
 396: ##         cdef double reg = self.reg
+
 397: 
+
 398: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] w = model.w
+
 399: ##         # weight vector w as c array
+
 400: ##         cdef double *wdata = <double *>w.data
+
 401: ##         # the scale of w
+
 402: ##         cdef double wscale = 1.0
+
 403: 
+
 404: ##         # training instance
+
 405: ##         cdef np.ndarray x = None
+
 406: ##         cdef Pair *xdata = NULL
+
 407: 
+
 408: ##         cdef double y = 0.0
+
 409: 
+
 410: ##         # Variables for penalty term
+
 411: ##         cdef int norm = self.norm
+
 412: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] q = None
+
 413: ##         cdef double *qdata = NULL
+
 414: ##         cdef double u = 0.0
+
 415: ##         if norm == 1 or norm == 3:
+
 416: ##             q = np.zeros((m,), dtype = np.float64, order = "c" )
+
 417: ##             qdata = <double *>q.data
+
 418: 
+
 419: ##         cdef double alpha = 1.0
+
 420: ##         if norm == 1:
+
 421: ##             alpha = 0.0
+
 422: ##         elif norm == 3:
+
 423: ##             alpha = self.alpha
+
 424: 
+
 425: ##         # bias term (aka offset or intercept)
+
 426: ##         cdef int usebias = 1
+
 427: ##         if model.biasterm == False:
+
 428: ##             usebias = 0
+
 429: 
+
 430: ##         cdef double b = 0.0,p = 0.0, wnorm = 0.0, t = 0.0, update = 0.0,sumloss = 0.0, eta = 0.0
+
 431: ##         cdef int xnnz = 0, count = 0, i = 0, e = 0
+
 432: 
+
 433: ##         # computing eta0
+
 434: ##         cdef double typw = sqrt(1.0 / sqrt(reg))
+
 435: ##         cdef double eta0 = typw /max(1.0,loss.dloss(-typw,1.0))
+
 436: ##         t = 1.0 / (eta0 * reg)
+
 437: ##         t1=time()
+
 438: ##         for e from 0 <= e < self.epochs:
+
 439: ##             if verbose > 0:
+
 440: ##                 print("-- Epoch %d" % (e+1))
+
 441: ##             if shuffle:
+
 442: ##                 dataset.shuffle()
+
 443: ##             for x,y in dataset:
+
 444: ##                 eta = 1.0 / (reg * t)
+
 445: ##                 xnnz = x.shape[0]
+
 446: ##                 xdata = <Pair *>x.data
+
 447: ##                 p = (dot(wdata, xdata, xnnz) * wscale) + b
+
 448: ##                 sumloss += loss.loss(p,y)
+
 449: ##                 update = eta * loss.dloss(p,y)
+
 450: ##                 if update != 0:
+
 451: ##                     add(wdata, wscale, xdata,
+
 452: ##                         xnnz,update)
+
 453: ##                     if usebias == 1:
+
 454: ##                         b += update * 0.01
+
 455: 
+
 456: ##                 if norm != 1:
+
 457: ##                     wscale *= (1 - alpha * eta * reg)
+
 458: ##                     if wscale < 1e-9:
+
 459: ##                         w*=wscale
+
 460: ##                         wscale = 1
+
 461: ##                 if norm == 1 or norm == 3:
+
 462: ##                     u += ((1-alpha) * eta * reg)
+
 463: ##                     l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+
 464: 
+
 465: ##                 t += 1
+
 466: ##                 count += 1
+
 467: 
+
 468: ##             # report epoche information
+
 469: ##             if verbose > 0:
+
 470: ##                 wnorm = sqrt(np.dot(w,w) * wscale * wscale)
+
 471: ##                 print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,w.nonzero()[0].shape[0],b,count,sumloss/count))
+
 472: ##                 print("Total training time: %.2f seconds." % (time()-t1))
+
 473: 
+
 474: ##         # floating-point under-/overflow check.
+
 475: ##         if np.any(np.isinf(w)) or np.any(np.isnan(w))or np.isnan(b) or np.isinf(b):
+
 476: ##             raise ValueError("floating-point under-/overflow occured.")
+
 477: ##         if norm == 3:
+
 478: ##             # FIXME rescale naive elastic net coefficient?
+
 479: ##             model.w = w * wscale #* (1.0 + alpha)
+
 480: ##         else:
+
 481: ##             model.w = w * wscale
+
 482: ##         model.bias = b
+
 483: 
+
 484: ## cdef void l1penalty(double wscale, double *w, double *q,
+
 485: ##                     Pair *x, int nnz, double u):
+
 486: ##     cdef double z = 0.0
+
 487: ##     cdef Pair pair
+
 488: ##     cdef int i,j
+
 489: ##     for i from 0 <= i < nnz:
+
 490: ##         pair = x[i]
+
 491: ##         j = pair.idx
+
 492: ##         z = w[j]
+
 493: ##         if (wscale * w[j]) > 0:
+
 494: ##             w[j] = max(0,w[j] - ((u + q[j])/wscale) )
+
 495: ##         elif (wscale * w[j]) < 0:
+
 496: ##             w[j] = min(0,w[j] + ((u - q[j])/wscale) )
+
 497: ##         q[j] += (wscale * (w[j] - z))
+
 498: 
+

diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
new file mode 100644
index 0000000000000..e6ab3eb04c50b
--- /dev/null
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -0,0 +1,521 @@
+# Author: Peter Prettenhofer 
+#
+# License: BSD Style.
+from __future__ import division
+
+import numpy as np
+import sys
+from time import time
+
+cimport numpy as np
+cimport cython
+
+cdef extern from "math.h":
+    cdef extern double exp(double x)
+    cdef extern double log(double x)
+    cdef extern double sqrt(double x)
+
+ctypedef np.float64_t DOUBLE
+ctypedef np.float32_t FLOAT
+ctypedef np.int32_t INTEGER
+
+DEF L1 = 1
+DEF L2 = 2
+DEF ELASTICNET = 3
+
+
+# ----------------------------------------
+# Extension Types for Loss Functions
+# ----------------------------------------
+
+cdef class LossFunction:
+    """Base class for convex loss functions"""
+    cpdef double loss(self, double p, double y):
+        """Evaluate the loss function.
+        
+        :arg p: The prediction.
+        :type p: double
+        :arg y: The true value.
+        :type y: double
+        :returns: double"""
+        raise NotImplementedError()
+    cpdef double dloss(self, double p, double y):
+        """Evaluate the derivative of the loss function.
+        
+        :arg p: The prediction.
+        :type p: double
+        :arg y: The true value.
+        :type y: double
+        :returns: double"""
+        raise NotImplementedError()
+
+cdef class Regression(LossFunction):
+    """Base class for loss functions for regression."""
+    cpdef double loss(self,double p,double y):
+        raise NotImplementedError()
+    cpdef double dloss(self,double p,double y):
+        raise NotImplementedError()
+
+
+cdef class Classification(LossFunction):
+    """Base class for loss functions for classification."""
+    cpdef double loss(self,double p,double y):
+        raise NotImplementedError()
+    cpdef double dloss(self,double p,double y):
+        raise NotImplementedError()
+
+cdef class ModifiedHuber(Classification):
+    """Modified Huber loss function for binary
+    classification tasks with y in {-1,1}.
+    Its equivalent to quadratically smoothed SVM
+    with gamma = 2.
+
+    See T. Zhang 'Solving
+    Large Scale Linear Prediction Problems Using
+    Stochastic Gradient Descent', ICML'04.
+    """
+    cpdef double loss(self,double p,double y):
+        cdef double z = p*y
+        if z >= 1:
+            return 0
+        elif z >= -1:
+            return (1-z) * (1-z) 
+        else:
+            return -4*z
+
+    cpdef double dloss(self,double p,double y):
+        cdef double z = p*y
+        if z >= 1:
+            return 0
+        elif z >= -1:
+            return 2*(1-z)*y
+        else:
+            return 4*y
+
+    def __reduce__(self):
+        return ModifiedHuber,()
+
+cdef class Hinge(Classification):
+    """SVM classification loss for binary
+    classification tasks with y in {-1,1}.
+    """
+    cpdef  double loss(self,double p,double y):
+        cdef double z = p*y
+        if z < 1.0:
+            return (1 - z)
+        return 0
+    cpdef  double dloss(self,double p,double y):
+        cdef double z = p*y
+        if z < 1.0:
+            return y
+        return 0
+
+    def __reduce__(self):
+        return Hinge,()
+
+
+cdef class Log(Classification):
+    """Logistic regression loss for binary classification
+    tasks with y in {-1,1}.
+    """
+    cpdef double loss(self,double p,double y):
+        cdef double z = p*y
+        if z > 18:
+            return exp(-z)
+        if z < -18:
+            return -z * y
+        return log(1.0+exp(-z)) 
+
+    cpdef  double dloss(self,double p,double y):
+        cdef double z = p*y
+        if z > 18:
+            return exp(-z) * y
+        if z < -18:
+            return y
+        return y / (exp(z) + 1.0)
+
+    def __reduce__(self):
+        return Log,()
+
+cdef class SquaredError(Regression):
+    """
+    """
+    cpdef  double loss(self,double p,double y):
+        return 0.5 * (p-y) * (p-y)
+    cpdef  double dloss(self,double p,double y):
+        return y - p
+
+    def __reduce__(self):
+        return SquaredError,()
+
+cdef class Huber(Regression):
+    """
+    """
+    cdef double c
+    def __init__(self,c):
+        self.c = c
+    cpdef  double loss(self,double p,double y):
+        cdef double r = p-y
+        cdef double abs_r = abs(r)
+        if abs_r <= self.c:
+            return 0.5 * r * r
+        else:
+            return self.c * abs_r - (0.5*self.c*self.c)
+
+    cpdef  double dloss(self,double p,double y):
+        cdef double r = y - p 
+        cdef double abs_r = abs(r)
+        if abs_r <= self.c:
+            return r
+        elif r > 0:
+            return self.c
+        else:
+            return -self.c
+
+    def __reduce__(self):
+        return Huber,(self.c,)
+
+@cython.boundscheck(False)
+@cython.wraparound(False)
+@cython.cdivision(True)
+def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
+              DOUBLE intercept,
+              LossFunction loss,
+              int penalty_type,
+              double alpha, double rho,
+              np.ndarray[FLOAT, ndim=1] X_data,
+              np.ndarray[INTEGER, ndim=1] X_indices,
+              np.ndarray[INTEGER, ndim=1] X_indptr,
+              np.ndarray[DOUBLE, ndim=1] Y,
+              int n_iter, int fit_intercept,
+              int verbose, int shuffle):
+    """Cython implementation of SGD with different loss functions and
+    penalties.
+    
+    """
+    # get the data information into easy vars
+    cdef unsigned int n_samples = Y.shape[0]
+    cdef unsigned int n_features = w.shape[0]
+
+    # FIXME double to DOUBLE
+    cdef DOUBLE *w_data_ptr = w.data
+    cdef FLOAT *X_data_ptr = X_data.data
+    cdef INTEGER *X_indptr_ptr = X_indptr.data
+    cdef INTEGER *X_indices_ptr = X_indices.data
+
+    # FIXME unsined int?
+    cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples,
+                                                                 dtype = np.int32)
+    cdef INTEGER *index_ptr = index.data
+    cdef INTEGER offset = 0
+    cdef INTEGER xnnz = 0
+    cdef DOUBLE wscale = 1.0
+    cdef DOUBLE eta = 0.0
+    cdef DOUBLE p = 0.0
+    cdef DOUBLE update = 0.0
+    cdef DOUBLE sumloss = 0.0
+    cdef DOUBLE wnorm = 0.0
+    cdef DOUBLE t = 0.0
+    cdef DOUBLE y = 0.0
+    cdef unsigned int count = 0
+    cdef unsigned int epoch = 0
+    cdef unsigned int i = 0
+    cdef unsigned int sample_idx = 0
+    cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None
+    cdef DOUBLE *q_ptr
+    if penalty_type != L2:
+        q = np.zeros((n_features,), dtype = np.float64, order = "c")
+        q_ptr =  q.data
+    cdef double u = 0.0
+    # computing eta0
+    cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
+    cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+    t = 1.0 / (eta0 * alpha)
+    t_start = time()
+    for epoch from 0 <= epoch < n_iter:
+        if verbose > 0:
+            print("-- Epoch %d" % (epoch + 1))
+        if shuffle:
+            np.random.shuffle(index)
+        for i from 0 <= i < n_samples:
+            sample_idx = index[i]
+            offset = X_indptr_ptr[sample_idx]
+            xnnz = X_indptr_ptr[sample_idx + 1] - offset
+            y = Y[sample_idx]
+            eta = 1.0 / (alpha * t)
+            p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
+                     offset, xnnz) * wscale) + intercept
+            sumloss += loss.loss(p, y)
+            update = eta * loss.dloss(p, y)
+            if update != 0:
+                add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
+                    offset, xnnz, update)
+                if fit_intercept == 1:
+                    intercept += update * 0.01
+            if penalty_type != L1:
+                wscale *= (1 - rho * eta * alpha)
+                if wscale < 1e-9:
+                    w *= wscale
+                    wscale = 1.0
+            if penalty_type == L2 or penalty_type == ELASTICNET:
+                u += ((1.0 - rho) * eta * alpha)
+                #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+            t += 1
+            count += 1
+        # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count))
+            print("Total training time: %.2f seconds." % (time()-t_start))
+
+        # 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.")     
+
+    w *= wscale
+    return w, intercept
+    
+
+## # ----------------------------------------
+## # Python function for external prediction
+## # ----------------------------------------
+## def predict(np.ndarray x, np.ndarray w,
+##             double bias):
+##     """Computes x*w + b efficiently.
+
+##     :arg x: the instance represented as a sparse vector. 
+##     :type x: np.ndarray(dtype=bolt.sparsedtype)
+##     :arg w: the weight vector represented as a dense vector.
+##     :type w: np.ndarray(dtype=bolt.densedtype)
+##     :arg b: the bias term (aka offset or intercept).
+##     :type b: float
+##     :returns: A double representing `x*w + b`.
+##     """
+##     cdef int xnnz = x.shape[0]
+##     cdef int wdim = w.shape[0]
+##     cdef double y = 0.0
+##     if xnnz == 0:
+##         y = bias
+##     else:
+##         y = dot_checked(w.data,x.data,xnnz,wdim) + bias
+##     return y
+
+cdef inline double max(DOUBLE a, DOUBLE b):
+    return a if a >= b else b
+
+cdef inline DOUBLE min(DOUBLE a, DOUBLE b):
+    return a if a <= b else b
+
+cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr,
+                INTEGER offset, INTEGER xnnz):
+    cdef DOUBLE sum = 0.0
+    cdef int j
+    for j from 0 <= j < xnnz:
+        sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
+    return sum
+
+cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr,
+                INTEGER *X_indices_ptr, INTEGER offset, INTEGER xnnz, DOUBLE c):
+    """Scales example x by constant c and adds it to the weight vector w. 
+    """
+    cdef INTEGER j
+    cdef INTEGER idx
+    cdef DOUBLE val
+    cdef DOUBLE innerprod = 0.0
+    cdef DOUBLE xsqnorm = 0.0
+    for j from 0 <= j < xnnz:
+        idx = X_indices_ptr[offset + j]
+        val = X_data_ptr[offset + j]
+        innerprod += (w_data_ptr[idx] * val)
+        xsqnorm += (val * val)
+        w_data_ptr[idx] += val * (c / wscale)    
+    return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+
+## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
+##     """ Checked version of dot product. Ignores features in x
+##     with a higher index than dimension of w. 
+##     """
+##     cdef double sum = 0.0
+##     cdef Pair pair
+##     cdef int i
+##     for i from 0 <= i < nnz:
+##         pair = x[i]
+##         if pair.idx < wdim:
+##             sum +=w[pair.idx]*pair.val
+##     return sum
+
+## cdef double add(double *w, double wscale, Pair *x, int nnz, double c):
+##     """Scales example x by constant c and adds it to the weight vector w. 
+##     """
+##     cdef Pair pair
+##     cdef int i
+##     cdef double innerprod = 0.0
+##     cdef double xsqnorm = 0.0
+##     for i from 0 <= i < nnz:
+##         pair = x[i]
+##         innerprod += (w[pair.idx] * pair.val)
+##         xsqnorm += (pair.val*pair.val)
+##         w[pair.idx] += pair.val * (c / wscale)
+        
+##     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+
+## # ----------------------------------------
+## # Extension type for Stochastic Gradient Descent
+## # ----------------------------------------
+
+## cdef class SGD:
+
+##     cdef int epochs
+##     cdef double reg
+##     cdef LossFunction loss
+##     cdef int norm
+##     cdef double alpha
+    
+##     def __init__(self, loss, reg, epochs = 5, norm = 2, alpha = 0.85):
+##         """
+
+##         :arg loss: The :class:`LossFunction` (default ModifiedHuber) .
+##         :arg reg: The regularization parameter lambda (>0).
+##         :type reg: float.
+##         :arg epochs: The number of iterations through the dataset.
+##         :type epochs: int
+##         :arg norm: Whether to minimize the L1, L2 norm or the Elastic Net.
+##         :type norm: 1 or 2 or 3
+##         :arg alpha: The elastic net penality parameter. A value of 1 amounts to L2 regularization whereas a value of 0 gives L1 penalty. 
+##         :type alpha: float (0 <= alpha <= 1)
+##         """
+##         if loss == None:
+##             raise ValueError("Loss function must not be None.")
+##         if reg < 0.0:
+##             raise ValueError("reg must be larger than 0. ")
+##         if norm not in [1,2,3]:
+##             raise ValueError("norm must be in {1,2,3}. ")
+##         if alpha > 1.0 or alpha < 0.0:
+##             raise ValueError("alpha must be in [0,1]. ")
+##         self.loss = loss
+##         self.reg = reg
+##         self.epochs = epochs
+##         self.norm = norm
+##         self.alpha = alpha
+
+##     def __reduce__(self):
+##         return SGD,(self.loss,self.reg, self.epochs, self.norm, self.alpha)
+
+##     def train(self, model, dataset, verbose = 0, shuffle = False):
+##         """Train `model` on the `dataset` using SGD.
+
+##         :arg model: The :class:`bolt.model.LinearModel` that is going to be trained. 
+##         :arg dataset: The :class:`bolt.io.Dataset`. 
+##         :arg verbose: The verbosity level. If 0 no output to stdout.
+##         :arg shuffle: Whether or not the training data should be shuffled after each epoch. 
+##         """
+##         self._train(model, dataset, verbose, shuffle)
+
+##     cdef void _train(self,model, dataset, verbose, shuffle):
+        
+##         cdef LossFunction loss = self.loss
+##         cdef int m = model.m
+##         cdef int n = dataset.n
+##         cdef double reg = self.reg
+
+##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] w = model.w
+##         # weight vector w as c array
+##         cdef double *wdata = w.data
+##         # the scale of w
+##         cdef double wscale = 1.0
+
+##         # training instance
+##         cdef np.ndarray x = None
+##         cdef Pair *xdata = NULL
+
+##         cdef double y = 0.0
+        
+##         # Variables for penalty term
+##         cdef int norm = self.norm
+##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] q = None
+##         cdef double *qdata = NULL
+##         cdef double u = 0.0
+##         if norm == 1 or norm == 3:
+##             q = np.zeros((m,), dtype = np.float64, order = "c" )
+##             qdata = q.data
+            
+##         cdef double alpha = 1.0
+##         if norm == 1:
+##             alpha = 0.0
+##         elif norm == 3:
+##             alpha = self.alpha
+
+##         # bias term (aka offset or intercept)
+##         cdef int usebias = 1
+##         if model.biasterm == False:
+##             usebias = 0
+
+##         cdef double b = 0.0,p = 0.0, wnorm = 0.0, t = 0.0, update = 0.0,sumloss = 0.0, eta = 0.0
+##         cdef int xnnz = 0, count = 0, i = 0, e = 0
+        
+##         # computing eta0
+##         cdef double typw = sqrt(1.0 / sqrt(reg))
+##         cdef double eta0 = typw /max(1.0,loss.dloss(-typw,1.0))
+##         t = 1.0 / (eta0 * reg)
+##         t1=time()
+##         for e from 0 <= e < self.epochs:
+##             if verbose > 0:
+##                 print("-- Epoch %d" % (e+1))
+##             if shuffle:
+##                 dataset.shuffle()
+##             for x,y in dataset:
+##                 eta = 1.0 / (reg * t)
+##                 xnnz = x.shape[0]
+##                 xdata = x.data
+##                 p = (dot(wdata, xdata, xnnz) * wscale) + b
+##                 sumloss += loss.loss(p,y)
+##                 update = eta * loss.dloss(p,y)
+##                 if update != 0:
+##                     add(wdata, wscale, xdata,
+##                         xnnz,update)
+##                     if usebias == 1:
+##                         b += update * 0.01
+
+##                 if norm != 1:
+##                     wscale *= (1 - alpha * eta * reg)
+##                     if wscale < 1e-9:
+##                         w*=wscale
+##                         wscale = 1
+##                 if norm == 1 or norm == 3:
+##                     u += ((1-alpha) * eta * reg)
+##                     l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+                
+##                 t += 1
+##                 count += 1
+
+##             # 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,w.nonzero()[0].shape[0],b,count,sumloss/count))
+##                 print("Total training time: %.2f seconds." % (time()-t1))
+
+##         # floating-point under-/overflow check.
+##         if np.any(np.isinf(w)) or np.any(np.isnan(w))or np.isnan(b) or np.isinf(b):
+##             raise ValueError("floating-point under-/overflow occured.")
+##         if norm == 3:
+##             # FIXME rescale naive elastic net coefficient?
+##             model.w = w * wscale #* (1.0 + alpha)
+##         else:
+##             model.w = w * wscale
+##         model.bias = b
+
+## cdef void l1penalty(double wscale, double *w, double *q,
+##                     Pair *x, int nnz, double u):
+##     cdef double z = 0.0
+##     cdef Pair pair
+##     cdef int i,j
+##     for i from 0 <= i < nnz:
+##         pair = x[i]
+##         j = pair.idx
+##         z = w[j]
+##         if (wscale * w[j]) > 0:
+##             w[j] = max(0,w[j] - ((u + q[j])/wscale) )
+##         elif (wscale * w[j]) < 0:
+##             w[j] = min(0,w[j] + ((u - q[j])/wscale) )
+##         q[j] += (wscale * (w[j] - z))
+
diff --git a/scikits/learn/sgd/tests/__init__.py b/scikits/learn/sgd/tests/__init__.py
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
new file mode 100644
index 0000000000000..b4cbf931468d2
--- /dev/null
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -0,0 +1,50 @@
+import numpy as np
+from scipy import sparse
+from scikits.learn import datasets, sgd
+from numpy.testing import assert_array_almost_equal, \
+     assert_array_equal, assert_equal
+
+from nose.tools import assert_raises
+
+import bolt
+
+# test sample 1
+X = np.array([[-2, -1], [-1, -1], [-1, -2], [1, 1], [1, 2], [2, 1]])
+Y = [1, 1, 1, 2, 2, 2]
+T = np.array([[-1, -1], [2, 2], [3, 2]])
+true_result = [1, 2, 2]
+
+# test sample 2
+X2 = np.array([[0, 0, 0], [1, 1, 1], [2, 0, 0, ],
+               [0, 0, 2], [3, 3, 3]])
+Y2 = [1, 2, 2, 2, 3]
+T2 = np.array([[-1, -1, -1], [1, 1, 1], [2, 2, 2]])
+true_result2 = [1, 2, 3]
+
+
+def test_sgd():
+    """Check that sparse SGD gives any results :-)"""
+    
+    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.001, fit_intercept = True)
+    clf.fit(X, Y)
+    assert_array_equal(clf.coef_, np.zeros((len(clf.coef_),)))
+
+def test_rcv1():
+    ds = bolt.io.MemoryDataset.load("/home/pprett/corpora/rcv1-ccat/test.npy")
+    m, n = ds.n, ds.dim
+    X = sparse.lil_matrix((m, n), dtype = np.float32)
+    print "Build sparse matrix... ", 
+    for i, x in enumerate(ds.iterinstances()):
+	X[i, x['f0']] = x['f1']
+    print "[done]"
+
+    X = X.tocsr()
+    Y = ds.labels
+    print "Fitting model... "
+    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.0001, fit_intercept = True)
+    clf.fit(X, Y)
+    #clf.score(X,Y)
+
+if __name__ == "__main__":
+    test_rcv1()
+    

From 920b7dfd0985ece3216533a33d3d8e480869ddb4 Mon Sep 17 00:00:00 2001
From: pprett 
Date: Tue, 19 Oct 2010 14:02:31 +0200
Subject: [PATCH 02/17] set rho on 1 or 0 if L2 or L1 penalty.

---
 scikits/learn/sgd/base.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index 79ca734179834..e889fc0ab6a32 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -55,6 +55,10 @@ def _get_penalty_type(self):
 	penalty_types = {"l2":2, "l1":1, "elasticnet":3}
 	try:
 	    self.penalty_type = penalty_types[self.penalty]
+	    if self.penalty_type == 2:
+		self.rho = 1.0
+	    elif self.penalty_type == 1:
+		self.rho = 0.0
 	except KeyError:
 	    raise ValueError("The penalty %s is not supported. " % self.penalty)
 

From 21a99d117e598e807d978def11a38820f18f8b3d Mon Sep 17 00:00:00 2001
From: pprett 
Date: Tue, 19 Oct 2010 17:10:52 +0200
Subject: [PATCH 03/17] l1 penalty implemented. different loss functions
 supported.

---
 scikits/learn/sgd/base.py                     |   15 +-
 scikits/learn/sgd/sparse/sgd.py               |   76 +-
 .../learn/sgd/sparse/src/sgd_fast_sparse.c    | 7274 ++++++++---------
 .../learn/sgd/sparse/src/sgd_fast_sparse.pyx  |  326 +-
 scikits/learn/sgd/tests/test_sparse.py        |    6 +-
 5 files changed, 3405 insertions(+), 4292 deletions(-)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index e889fc0ab6a32..75c37e0d16ed3 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -15,16 +15,20 @@ class LinearModel(BaseEstimator):
     
     Parameters
     ----------
-    loss : Loss
+    loss : str, ('hinge'|'log'|'modifiedhuber')
         The loss function to be used. 
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
+    reg : float
+        The regularization parameter, i.e. tradeoff between loss and penalty.
     alpha : float
-        Constant that multiplies the penalty. Defaults to 0.0001.
+        Constant that multiplies the L1 term. Defaults to 1.0
     rho : float
-        The ElasticNet mixing parameter, with 0 < rho <= 1. 
+        The ElasticNet mixing parameter, with 0 < rho <= 1.
     coef_ : ndarray of shape n_features
         The initial coeffients to warm-start the optimization
+    intercept_ : float
+        The initial intercept to warm-start the optimization
     fit_intercept: bool
         Whether the intercept should be estimated or not. If False, the
         data is assumed to be already centered.
@@ -39,16 +43,17 @@ class LinearModel(BaseEstimator):
 
     """
 
-    def __init__(self, penalty='l2', loss="hinge", alpha = 0.0001,
+    def __init__(self, loss = "hinge", penalty = 'l2', alpha = 0.0001,
 		 rho = 0.85, coef_ = None, intercept_ = 0.0,
 		 fit_intercept = True):
-        self.penalty = penalty
         self.loss = loss
+	self.penalty = penalty
 	self.alpha = alpha
         self.rho = rho
 	self.coef_ = coef_
 	self.intercept_ = intercept_
         self.fit_intercept = fit_intercept
+	self._get_loss_function()
 	self._get_penalty_type()
 
     def _get_penalty_type(self):
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index b7e03cee3c3e1..6b5125dc6336a 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -19,7 +19,7 @@ class SGD(LinearModel, ClassifierMixin):
     
     Parameters
     ----------
-    loss : Loss
+    loss : str, ('hinge'|'log'|'modifiedhuber')
         The loss function to be used. 
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
@@ -46,6 +46,16 @@ class SGD(LinearModel, ClassifierMixin):
         Constants in decision function.
 
     """
+
+    def _get_loss_function(self):
+	loss_functions = {"hinge" : sgd_fast_sparse.Hinge(),
+			  "log" : sgd_fast_sparse.Log(),
+			  "modifiedhuber" : sgd_fast_sparse.ModifiedHuber(),
+			  }
+	try:
+	    self.loss_function = loss_functions[self.loss]
+	except KeyError:
+	    raise ValueError("The loss %s is not supported. " % self.loss)
     
     def _set_coef(self, coef_):
         self.coef_ = coef_
@@ -56,13 +66,14 @@ def _set_coef(self, coef_):
             # sparse representation of the fitted coef for the predict method
             self.sparse_coef_ = sparse.csr_matrix(coef_)
 
-    def fit(self, X, Y, n_iter=5, **params):
+    def fit(self, X, Y, n_iter = 5, **params):
         """Fit current model with SGD
 
         X is expected to be a sparse matrix. For maximum efficiency, use a
         sparse matrix in CSR format (scipy.sparse.csr_matrix)
         """
         self._set_params(**params)
+	self.n_iter = int(n_iter)
         X = sparse.csr_matrix(X)
         Y = np.asanyarray(Y, dtype = np.float64)
 
@@ -70,19 +81,20 @@ def fit(self, X, Y, n_iter=5, **params):
         if self.coef_ is None:
             self.coef_ = np.zeros(n_features, dtype=np.float64, order = "c")
         
-        X_data = np.array(X.data, np.float32, order = "c")
+        X_data = np.array(X.data, np.float64, order = "c")
 	X_indices = X.indices
 	X_indptr = X.indptr
-	loss = sgd_fast_sparse.Hinge()
 	verbose = 2
 	shuffle = 0
+	print "norm: ", self.penalty_type
+	print "rho: ", self.rho
+	print "alpha:", self.alpha
 	coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_, self.intercept_,
-						      loss, int(self.penalty_type),
+						      self.loss_function, self.penalty_type,
 						      self.alpha, self.rho, X_data,
 						      X_indices, X_indptr, Y,
-						      int(n_iter),
-						      int(self.fit_intercept),
-						      int(verbose), int(shuffle))
+						      self.n_iter, int(self.fit_intercept),
+						      verbose, int(shuffle))
 
         # update self.coef_ and self.sparse_coef_ consistently
         self._set_coef(coef_)
@@ -91,32 +103,32 @@ def fit(self, X, Y, n_iter=5, **params):
         # return self for chaining fit and predict calls
         return self
 
-    ## def predict(self, X):
-## 	"""Predict using the linear model
-
-##         Parameters
-##         ----------
-##         X : numpy array of shape [n_samples, n_features]
+    def predict(self, X):
+        """Predict using the linear model
 
-##         Returns
-##         -------
-##         C : array, shape = [n_samples]
-##             Returns predicted class labeles (either 1 or -1 or 0).
-##         """
-## 	raise NotImplemented("not implemented yet")
+        Parameters
+        ----------
+        X : scipy.sparse matrix of shape [n_samples, n_features]
 
-##     def predict_margin(self, T):
-## 	"""Predict signed 'distance' to the hyperplane (aka confidence score). 
+        Returns
+        -------
+        array, shape = [n_samples] with the predicted class labels (either -1, 1, or 0).
+        """        
+        return np.sign(self.predict_margin(X))
 
-## 	If 
+    def predict_margin(self, X):
+        """Predict signed 'distance' to the hyperplane (aka confidence score). 
 
-##         Parameters
-##         ----------
-##         X : numpy array of shape [n_samples, n_features]
+        Parameters
+        ----------
+        X : scipy.sparse matrix of shape [n_samples, n_features]
 
-##         Returns
-##         -------
-##         C : array, shape = [n_samples]
-##             Returns signed 'distance' to the hyperplane
-##         """
-## 	raise NotImplemented("not implemented yet")
+        Returns
+        -------
+        array, shape = [n_samples] with signed 'distances' to the hyperplane.
+        """
+        # np.dot only works correctly if both arguments are sparse matrices
+        if not sparse.issparse(X):
+            X = sparse.csr_matrix(X)
+        return np.ravel(np.dot(self.sparse_coef_, X.T).todense()
+                        + self.intercept_)
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
index 1ebb232581b43..7218d06e9b551 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
@@ -1,12 +1,11 @@
-/* Generated by Cython 0.12.1 on Mon Oct 18 23:48:21 2010 */
+/* Generated by Cython 0.11.2 on Tue Oct 19 16:25:58 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #include "structmember.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#else
-
+#endif
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
@@ -16,9 +15,7 @@
 #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
@@ -28,9 +25,7 @@
   #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)
   #define PyNumber_Index(o)    PyNumber_Int(o)
   #define PyIndex_Check(o)     PyNumber_Check(o)
-  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
 #endif
-
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -40,17 +35,17 @@
   #define PyType_Modified(t)
 
   typedef struct {
-     void *buf;
-     PyObject *obj;
-     Py_ssize_t len;
-     Py_ssize_t itemsize;
-     int readonly;
-     int ndim;
-     char *format;
-     Py_ssize_t *shape;
-     Py_ssize_t *strides;
-     Py_ssize_t *suboffsets;
-     void *internal;
+       void *buf;
+       PyObject *obj;
+       Py_ssize_t len;
+       Py_ssize_t itemsize;
+       int readonly;
+       int ndim;
+       char *format;
+       Py_ssize_t *shape;
+       Py_ssize_t *strides;
+       Py_ssize_t *suboffsets;
+       void *internal;
   } Py_buffer;
 
   #define PyBUF_SIMPLE 0
@@ -64,32 +59,22 @@
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
 
 #endif
-
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
-  #define PyString_Type                PyUnicode_Type
-  #define PyString_CheckExact          PyUnicode_CheckExact
-#else
-  #define PyBytes_Type                 PyString_Type
-  #define PyBytes_CheckExact           PyString_CheckExact
-#endif
-
-#if PY_MAJOR_VERSION >= 3
+  #define PyString_Type                PyBytes_Type
+  #define PyString_CheckExact          PyBytes_CheckExact
   #define PyInt_Type                   PyLong_Type
   #define PyInt_Check(op)              PyLong_Check(op)
   #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
@@ -104,17 +89,13 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
   #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
 #else
-  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
-  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
-
+  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
+  #define PyBytes_Type                 PyString_Type
 #endif
-
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
 #endif
-
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -128,7 +109,6 @@
 #else
   #define _USE_MATH_DEFINES
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -138,7 +118,6 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
-
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -154,22 +133,24 @@
 #include 
 #define __PYX_HAVE_API__sgd_fast_sparse
 #include "stdlib.h"
-#include "stdio.h"
 #include "numpy/arrayobject.h"
-#include "numpy/ufuncobject.h"
 #include "math.h"
+#define __PYX_USE_C99_COMPLEX defined(_Complex_I)
 
-#ifndef CYTHON_INLINE
-  #if defined(__GNUC__)
-    #define CYTHON_INLINE __inline__
-  #elif defined(_MSC_VER)
-    #define CYTHON_INLINE __inline
-  #else
-    #define CYTHON_INLINE 
-  #endif
+
+#ifdef __GNUC__
+#define INLINE __inline__
+#elif _WIN32
+#define INLINE __inline
+#else
+#define INLINE 
 #endif
 
-typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
+typedef struct {PyObject **p; char *s; long n; char is_unicode; char intern; char is_identifier;} __Pyx_StringTabEntry; /*proto*/
+
+
+
+static int __pyx_skip_dispatch = 0;
 
 
 /* Type Conversion Predeclarations */
@@ -184,12 +165,9 @@ typedef struct {PyObject **p; char *s; const long n; const char* encoding; const
 #define __Pyx_PyBytes_AsString            PyBytes_AsString
 #endif
 
-#define __Pyx_PyBytes_FromUString(s)      __Pyx_PyBytes_FromString((char*)s)
-#define __Pyx_PyBytes_AsUString(s)        ((unsigned char*) __Pyx_PyBytes_AsString(s))
-
 #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
+static INLINE int __Pyx_PyObject_IsTrue(PyObject*);
+static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 
 #if !defined(T_PYSSIZET)
 #if PY_VERSION_HEX < 0x02050000
@@ -206,40 +184,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 #endif
 #endif
 
-
-#if !defined(T_ULONGLONG)
-#define __Pyx_T_UNSIGNED_INT(x) \
-        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
-        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
-        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
-        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : -1))))
-#else
-#define __Pyx_T_UNSIGNED_INT(x) \
-        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
-        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
-        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
-        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : \
-        ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
-#endif
-#if !defined(T_LONGLONG)
-#define __Pyx_T_SIGNED_INT(x) \
-        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
-        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
-        ((sizeof(x) == sizeof(int))   ? T_INT : \
-        ((sizeof(x) == sizeof(long))  ? T_LONG : -1))))
-#else
-#define __Pyx_T_SIGNED_INT(x) \
-        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
-        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
-        ((sizeof(x) == sizeof(int))   ? T_INT : \
-        ((sizeof(x) == sizeof(long))  ? T_LONG : \
-        ((sizeof(x) == sizeof(PY_LONG_LONG))   ? T_LONGLONG : -1)))))
-#endif
-
-#define __Pyx_T_FLOATING(x) \
-        ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
-        ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
-
 #if !defined(T_SIZET)
 #if !defined(T_ULONGLONG)
 #define T_SIZET \
@@ -253,9 +197,9 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 #endif
 #endif
 
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
+static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
+static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 
@@ -277,7 +221,6 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 static PyObject *__pyx_m;
 static PyObject *__pyx_b;
 static PyObject *__pyx_empty_tuple;
-static PyObject *__pyx_empty_bytes;
 static int __pyx_lineno;
 static int __pyx_clineno = 0;
 static const char * __pyx_cfilenm= __FILE__;
@@ -285,661 +228,710 @@ static const char *__pyx_filename;
 static const char **__pyx_f;
 
 
-#if !defined(CYTHON_CCOMPLEX)
-  #if defined(__cplusplus)
-    #define CYTHON_CCOMPLEX 1
-  #elif defined(_Complex_I)
-    #define CYTHON_CCOMPLEX 1
-  #else
-    #define CYTHON_CCOMPLEX 0
-  #endif
-#endif
-
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    #include 
-  #else
-    #include 
-  #endif
-#endif
-
-#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)
-  #undef _Complex_I
-  #define _Complex_I 1.0fj
-#endif
+#ifdef CYTHON_REFNANNY
+typedef struct {
+  void (*INCREF)(void*, PyObject*, int);
+  void (*DECREF)(void*, PyObject*, int);
+  void (*GOTREF)(void*, PyObject*, int);
+  void (*GIVEREF)(void*, PyObject*, int);
+  void* (*NewContext)(const char*, int, const char*);
+  void (*FinishContext)(void**);
+} __Pyx_RefnannyAPIStruct;
+static __Pyx_RefnannyAPIStruct *__Pyx_Refnanny = NULL;
+#define __Pyx_ImportRefcountAPI(name)   (__Pyx_RefnannyAPIStruct *) PyCObject_Import((char *)name, (char *)"RefnannyAPI")
+#define __Pyx_INCREF(r) __Pyx_Refnanny->INCREF(__pyx_refchk, (PyObject *)(r), __LINE__)
+#define __Pyx_DECREF(r) __Pyx_Refnanny->DECREF(__pyx_refchk, (PyObject *)(r), __LINE__)
+#define __Pyx_GOTREF(r) __Pyx_Refnanny->GOTREF(__pyx_refchk, (PyObject *)(r), __LINE__)
+#define __Pyx_GIVEREF(r) __Pyx_Refnanny->GIVEREF(__pyx_refchk, (PyObject *)(r), __LINE__)
+#define __Pyx_XDECREF(r) if((r) == NULL) ; else __Pyx_DECREF(r)
+#define __Pyx_SetupRefcountContext(name)   void* __pyx_refchk = __Pyx_Refnanny->NewContext((name), __LINE__, __FILE__)
+#define __Pyx_FinishRefcountContext()   __Pyx_Refnanny->FinishContext(&__pyx_refchk)
+#else
+#define __Pyx_INCREF(r) Py_INCREF(r)
+#define __Pyx_DECREF(r) Py_DECREF(r)
+#define __Pyx_GOTREF(r)
+#define __Pyx_GIVEREF(r)
+#define __Pyx_XDECREF(r) Py_XDECREF(r)
+#define __Pyx_SetupRefcountContext(name)
+#define __Pyx_FinishRefcountContext()
+#endif /* CYTHON_REFNANNY */
+#define __Pyx_XGIVEREF(r) if((r) == NULL) ; else __Pyx_GIVEREF(r)
+#define __Pyx_XGOTREF(r) if((r) == NULL) ; else __Pyx_GOTREF(r)
 
-typedef npy_int8 __pyx_t_5numpy_int8_t;
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name, PyObject* kw_name); /*proto*/
 
-typedef npy_int16 __pyx_t_5numpy_int16_t;
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
 
-typedef npy_int32 __pyx_t_5numpy_int32_t;
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
 
-typedef npy_int64 __pyx_t_5numpy_int64_t;
+/* Run-time type information about structs used with buffers */
+struct __Pyx_StructField_;
 
-typedef npy_uint8 __pyx_t_5numpy_uint8_t;
+typedef struct {
+  const char* name; /* for error messages only */
+  struct __Pyx_StructField_* fields;
+  size_t size;     /* sizeof(type) */
+  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
+} __Pyx_TypeInfo;
 
-typedef npy_uint16 __pyx_t_5numpy_uint16_t;
+typedef struct __Pyx_StructField_ {
+  __Pyx_TypeInfo* type;
+  const char* name;
+  size_t offset;
+} __Pyx_StructField;
 
-typedef npy_uint32 __pyx_t_5numpy_uint32_t;
+typedef struct {
+  __Pyx_StructField* field;
+  size_t parent_offset;
+} __Pyx_BufFmt_StackElem;
 
-typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-typedef npy_float32 __pyx_t_5numpy_float32_t;
+static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
+static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
 
-typedef npy_float64 __pyx_t_5numpy_float64_t;
+static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-typedef npy_long __pyx_t_5numpy_int_t;
+static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
+#define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0)
+#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
 
-typedef npy_longlong __pyx_t_5numpy_long_t;
 
-typedef npy_intp __pyx_t_5numpy_intp_t;
+static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+    PyObject *r;
+    if (!j) return NULL;
+    r = PyObject_GetItem(o, j);
+    Py_DECREF(j);
+    return r;
+}
 
-typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-typedef npy_ulong __pyx_t_5numpy_uint_t;
+#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+static INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+}
 
-typedef npy_double __pyx_t_5numpy_float_t;
+#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-typedef npy_double __pyx_t_5numpy_double_t;
+static INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+}
 
-typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 
-typedef __pyx_t_5numpy_float64_t __pyx_t_15sgd_fast_sparse_DOUBLE;
+#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-typedef __pyx_t_5numpy_float32_t __pyx_t_15sgd_fast_sparse_FLOAT;
+static INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    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) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+    }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
+    }
+    else {
+        r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+    }
+    return r;
+}
 
-typedef __pyx_t_5numpy_int32_t __pyx_t_15sgd_fast_sparse_INTEGER;
+static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    typedef ::std::complex< float > __pyx_t_float_complex;
-  #else
-    typedef float _Complex __pyx_t_float_complex;
-  #endif
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact); /*proto*/
+#if PY_MAJOR_VERSION < 3
+static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
+static void __Pyx_ReleaseBuffer(Py_buffer *view);
 #else
-    typedef struct { float real, imag; } __pyx_t_float_complex;
+#define __Pyx_GetBuffer PyObject_GetBuffer
+#define __Pyx_ReleaseBuffer PyBuffer_Release
 #endif
 
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    typedef ::std::complex< double > __pyx_t_double_complex;
-  #else
-    typedef double _Complex __pyx_t_double_complex;
-  #endif
-#else
-    typedef struct { double real, imag; } __pyx_t_double_complex;
-#endif
+Py_ssize_t __Pyx_zeros[] = {0};
+Py_ssize_t __Pyx_minusones[] = {-1};
 
-/* Type declarations */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
 
-typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
-typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
 
-typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
+static int __Pyx_Print(PyObject *, int); /*proto*/
+#if PY_MAJOR_VERSION >= 3
+static PyObject* __pyx_print = 0;
+static PyObject* __pyx_print_kwargs = 0;
+#endif
 
-typedef npy_cdouble __pyx_t_5numpy_complex_t;
+static int __Pyx_PrintOne(PyObject *o); /*proto*/
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":31
- * # ----------------------------------------
- * 
- * cdef class LossFunction:             # <<<<<<<<<<<<<<
- *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
- */
+#if __PYX_USE_C99_COMPLEX
+    #define __Pyx_REAL_PART(z) __real__(z)
+    #define __Pyx_IMAG_PART(z) __imag__(z)
+#else
+    #define __Pyx_REAL_PART(z) ((z).real)
+    #define __Pyx_IMAG_PART(z) ((z).imag)
+#endif
 
-struct __pyx_obj_15sgd_fast_sparse_LossFunction {
-  PyObject_HEAD
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
-};
+#define __pyx_PyObject_from_complex(z) PyComplex_FromDoubles((double)__Pyx_REAL_PART(z), (double)__Pyx_IMAG_PART(z))
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52
- *         raise NotImplementedError()
- * 
- * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
- */
+#if __PYX_USE_C99_COMPLEX
 
-struct __pyx_obj_15sgd_fast_sparse_Regression {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
+    typedef float _Complex __pyx_t_float_complex;
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      return x + y*(__pyx_t_float_complex)_Complex_I;
+    }
+    
+    #define __pyx_t_float_complex_is_zero(a) ((a) == 0)
+    #define __pyx_t_float_complex_eq(a, b) ((a) == (b))
+    #define __pyx_t_float_complex_add(a, b) ((a)+(b))
+    #define __pyx_t_float_complex_sub(a, b) ((a)-(b))
+    #define __pyx_t_float_complex_mul(a, b) ((a)*(b))
+    #define __pyx_t_float_complex_div(a, b) ((a)/(b))
+    #define __pyx_t_float_complex_neg(a) (-(a))
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
- *         return SquaredError,()
- * 
- * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+#else
 
-struct __pyx_obj_15sgd_fast_sparse_Huber {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-  double c;
-};
+    typedef struct { float real, imag; } __pyx_t_float_complex;
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      __pyx_t_float_complex c; c.real = x; c.imag = y; return c;
+    }
+    
+    static INLINE int __pyx_t_float_complex_is_zero(__pyx_t_float_complex a) {
+       return (a.real == 0) & (a.imag == 0);
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
- *         return Log,()
- * 
- * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+    static INLINE int __pyx_t_float_complex_eq(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+       return (a.real == b.real) & (a.imag == b.imag);
+    }
 
-struct __pyx_obj_15sgd_fast_sparse_SquaredError {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-};
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_add(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
- * 
- * 
- * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
- */
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_sub(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
 
-struct __pyx_obj_15sgd_fast_sparse_Classification {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_mul(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
- *         return ModifiedHuber,()
- * 
- * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
- */
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_div(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        float denom = b.real*b.real + b.imag*b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
 
-struct __pyx_obj_15sgd_fast_sparse_Hinge {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+    static INLINE __pyx_t_float_complex __pyx_t_float_complex_neg(__pyx_t_float_complex a) {
+        __pyx_t_float_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
- *         raise NotImplementedError()
- * 
- * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
- */
+#endif
 
-struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+#if __PYX_USE_C99_COMPLEX
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
- * 
- * 
- * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
- */
+    typedef double _Complex __pyx_t_double_complex;
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      return x + y*(__pyx_t_double_complex)_Complex_I;
+    }
+    
+    #define __pyx_t_double_complex_is_zero(a) ((a) == 0)
+    #define __pyx_t_double_complex_eq(a, b) ((a) == (b))
+    #define __pyx_t_double_complex_add(a, b) ((a)+(b))
+    #define __pyx_t_double_complex_sub(a, b) ((a)-(b))
+    #define __pyx_t_double_complex_mul(a, b) ((a)*(b))
+    #define __pyx_t_double_complex_div(a, b) ((a)/(b))
+    #define __pyx_t_double_complex_neg(a) (-(a))
 
-struct __pyx_obj_15sgd_fast_sparse_Log {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+#else
 
+    typedef struct { double real, imag; } __pyx_t_double_complex;
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      __pyx_t_double_complex c; c.real = x; c.imag = y; return c;
+    }
+    
+    static INLINE int __pyx_t_double_complex_is_zero(__pyx_t_double_complex a) {
+       return (a.real == 0) & (a.imag == 0);
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":31
- * # ----------------------------------------
- * 
- * cdef class LossFunction:             # <<<<<<<<<<<<<<
- *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
- */
+    static INLINE int __pyx_t_double_complex_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+       return (a.real == b.real) & (a.imag == b.imag);
+    }
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
-  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_add(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
 
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_sub(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52
- *         raise NotImplementedError()
- * 
- * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
- */
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_mul(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_div(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        double denom = b.real*b.real + b.imag*b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
 
+    static INLINE __pyx_t_double_complex __pyx_t_double_complex_neg(__pyx_t_double_complex a) {
+        __pyx_t_double_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
- *         return Log,()
- * 
- * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+#endif
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
+#if __PYX_USE_C99_COMPLEX
 
+    typedef long double _Complex __pyx_t_long__double_complex;
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_from_parts(long double x, long double y) {
+      return x + y*(__pyx_t_long__double_complex)_Complex_I;
+    }
+    
+    #define __pyx_t_long__double_complex_is_zero(a) ((a) == 0)
+    #define __pyx_t_long__double_complex_eq(a, b) ((a) == (b))
+    #define __pyx_t_long__double_complex_add(a, b) ((a)+(b))
+    #define __pyx_t_long__double_complex_sub(a, b) ((a)-(b))
+    #define __pyx_t_long__double_complex_mul(a, b) ((a)*(b))
+    #define __pyx_t_long__double_complex_div(a, b) ((a)/(b))
+    #define __pyx_t_long__double_complex_neg(a) (-(a))
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
- *         return SquaredError,()
- * 
- * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+#else
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
+    typedef struct { long double real, imag; } __pyx_t_long__double_complex;
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_from_parts(long double x, long double y) {
+      __pyx_t_long__double_complex c; c.real = x; c.imag = y; return c;
+    }
+    
+    static INLINE int __pyx_t_long__double_complex_is_zero(__pyx_t_long__double_complex a) {
+       return (a.real == 0) & (a.imag == 0);
+    }
 
+    static INLINE int __pyx_t_long__double_complex_eq(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
+       return (a.real == b.real) & (a.imag == b.imag);
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
- * 
- * 
- * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
- */
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_add(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
+        __pyx_t_long__double_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_sub(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
+        __pyx_t_long__double_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
 
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_mul(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
+        __pyx_t_long__double_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
- *         return ModifiedHuber,()
- * 
- * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
- */
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_div(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
+        __pyx_t_long__double_complex z;
+        long double denom = b.real*b.real + b.imag*b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
+    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_neg(__pyx_t_long__double_complex a) {
+        __pyx_t_long__double_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
 
+#endif
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
- *         raise NotImplementedError()
- * 
- * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
- */
+static INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
+static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
+static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
- * 
- * 
- * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
- */
+static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_sparse_Log;
+static INLINE char __Pyx_PyInt_AsChar(PyObject *);
 
-#ifndef CYTHON_REFNANNY
-  #define CYTHON_REFNANNY 0
-#endif
+static INLINE short __Pyx_PyInt_AsShort(PyObject *);
 
-#if CYTHON_REFNANNY
-  typedef struct {
-    void (*INCREF)(void*, PyObject*, int);
-    void (*DECREF)(void*, PyObject*, int);
-    void (*GOTREF)(void*, PyObject*, int);
-    void (*GIVEREF)(void*, PyObject*, int);
-    void* (*SetupContext)(const char*, int, const char*);
-    void (*FinishContext)(void**);
-  } __Pyx_RefNannyAPIStruct;
-  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
-  static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {
-    PyObject *m = NULL, *p = NULL;
-    void *r = NULL;
-    m = PyImport_ImportModule((char *)modname);
-    if (!m) goto end;
-    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
-    if (!p) goto end;
-    r = PyLong_AsVoidPtr(p);
-  end:
-    Py_XDECREF(p);
-    Py_XDECREF(m);
-    return (__Pyx_RefNannyAPIStruct *)r;
-  }
-  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
-  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
-  #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
-  #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
-  #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
-  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
-  #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)
-#else
-  #define __Pyx_RefNannySetupContext(name)
-  #define __Pyx_RefNannyFinishContext()
-  #define __Pyx_INCREF(r) Py_INCREF(r)
-  #define __Pyx_DECREF(r) Py_DECREF(r)
-  #define __Pyx_GOTREF(r)
-  #define __Pyx_GIVEREF(r)
-  #define __Pyx_XDECREF(r) Py_XDECREF(r)
-#endif /* CYTHON_REFNANNY */
-#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
-#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)
+static INLINE int __Pyx_PyInt_AsInt(PyObject *);
 
-static void __Pyx_RaiseDoubleKeywordsError(
-    const char* func_name, PyObject* kw_name); /*proto*/
+static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
 
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
+static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
 
-/* Run-time type information about structs used with buffers */
-struct __Pyx_StructField_;
+static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
 
-typedef struct {
-  const char* name; /* for error messages only */
-  struct __Pyx_StructField_* fields;
-  size_t size;     /* sizeof(type) */
-  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
-} __Pyx_TypeInfo;
+static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
 
-typedef struct __Pyx_StructField_ {
-  __Pyx_TypeInfo* type;
-  const char* name;
-  size_t offset;
-} __Pyx_StructField;
+static INLINE long __Pyx_PyInt_AsLong(PyObject *);
 
-typedef struct {
-  __Pyx_StructField* field;
-  size_t parent_offset;
-} __Pyx_BufFmt_StackElem;
+static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
 
+static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
 
-static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
-static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
+static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
 
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
+static void __Pyx_WriteUnraisable(const char *name); /*proto*/
 
-static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
-#define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0)
-#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
+static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
 
+static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size);  /*proto*/
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
-    PyObject *r;
-    if (!j) return NULL;
-    r = PyObject_GetItem(o, j);
-    Py_DECREF(j);
-    return r;
-}
+static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
 
+static void __Pyx_AddTraceback(const char *funcname); /*proto*/
 
-#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
-    }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
+/* Type declarations */
 
-#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
-    }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
+typedef npy_int16 __pyx_t_5numpy_int16_t;
 
+typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    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) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-    }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
-        r = PySequence_GetItem(o, i);
-    }
-    else {
-        r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-    }
-    return r;
-}
+typedef npy_uint8 __pyx_t_5numpy_uint8_t;
+
+typedef npy_uint16 __pyx_t_5numpy_uint16_t;
+
+typedef npy_uint32 __pyx_t_5numpy_uint32_t;
+
+typedef npy_uint64 __pyx_t_5numpy_uint64_t;
+
+typedef npy_float32 __pyx_t_5numpy_float32_t;
+
+typedef npy_float64 __pyx_t_5numpy_float64_t;
+
+typedef npy_complex64 __pyx_t_5numpy_complex64_t;
+
+typedef npy_complex128 __pyx_t_5numpy_complex128_t;
+
+typedef npy_long __pyx_t_5numpy_int_t;
+
+typedef npy_longlong __pyx_t_5numpy_long_t;
+
+typedef npy_ulong __pyx_t_5numpy_uint_t;
+
+typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+
+typedef npy_double __pyx_t_5numpy_float_t;
+
+typedef npy_double __pyx_t_5numpy_double_t;
+
+typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
+
+typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
+
+typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
+typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void);
+typedef __pyx_t_5numpy_float64_t __pyx_t_15sgd_fast_sparse_DOUBLE;
 
-static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
-static int __Pyx_EndUnpack(PyObject *); /*proto*/
+typedef __pyx_t_5numpy_int32_t __pyx_t_15sgd_fast_sparse_INTEGER;
 
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+ * # ----------------------------------------
+ * 
+ * cdef class LossFunction:             # <<<<<<<<<<<<<<
+ *     """Base class for convex loss functions"""
+ *     cpdef double loss(self, double p, double y):
+ */
+
+struct __pyx_obj_15sgd_fast_sparse_LossFunction {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
+};
+
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+ *         raise NotImplementedError()
+ * 
+ * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for regression."""
+ *     cpdef double loss(self,double p,double y):
+ */
+
+struct __pyx_obj_15sgd_fast_sparse_Regression {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return SquaredError,()
+ * 
+ * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
+
+struct __pyx_obj_15sgd_fast_sparse_Huber {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+  double c;
+};
+
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+ *         return Log,()
+ * 
+ * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
+struct __pyx_obj_15sgd_fast_sparse_SquaredError {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+};
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact); /*proto*/
-#if PY_MAJOR_VERSION < 3
-static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
-static void __Pyx_ReleaseBuffer(Py_buffer *view);
-#else
-#define __Pyx_GetBuffer PyObject_GetBuffer
-#define __Pyx_ReleaseBuffer PyBuffer_Release
-#endif
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+ * 
+ * 
+ * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for classification."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-Py_ssize_t __Pyx_zeros[] = {0};
-Py_ssize_t __Pyx_minusones[] = {-1};
+struct __pyx_obj_15sgd_fast_sparse_Classification {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
 
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+ *         return ModifiedHuber,()
+ * 
+ * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
+ *     """SVM classification loss for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+struct __pyx_obj_15sgd_fast_sparse_Hinge {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+ *         raise NotImplementedError()
+ * 
+ * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
+ *     """Modified Huber loss function for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static int __Pyx_Print(PyObject *, int); /*proto*/
-#if PY_MAJOR_VERSION >= 3
-static PyObject* __pyx_print = 0;
-static PyObject* __pyx_print_kwargs = 0;
-#endif
+struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-static int __Pyx_PrintOne(PyObject *o); /*proto*/
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+ * 
+ * 
+ * cdef class Log(Classification):             # <<<<<<<<<<<<<<
+ *     """Logistic regression loss for binary classification
+ *     tasks with y in {-1,1}.
+ */
 
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    #define __Pyx_CREAL(z) ((z).real())
-    #define __Pyx_CIMAG(z) ((z).imag())
-  #else
-    #define __Pyx_CREAL(z) (__real__(z))
-    #define __Pyx_CIMAG(z) (__imag__(z))
-  #endif
-#else
-    #define __Pyx_CREAL(z) ((z).real)
-    #define __Pyx_CIMAG(z) ((z).imag)
-#endif
+struct __pyx_obj_15sgd_fast_sparse_Log {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX
-    #define __Pyx_SET_CREAL(z,x) ((z).real(x))
-    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
-#else
-    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
-    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
-#endif
 
-static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);
-
-#if CYTHON_CCOMPLEX
-    #define __Pyx_c_eqf(a, b)   ((a)==(b))
-    #define __Pyx_c_sumf(a, b)  ((a)+(b))
-    #define __Pyx_c_difff(a, b) ((a)-(b))
-    #define __Pyx_c_prodf(a, b) ((a)*(b))
-    #define __Pyx_c_quotf(a, b) ((a)/(b))
-    #define __Pyx_c_negf(a)     (-(a))
-  #ifdef __cplusplus
-    #define __Pyx_c_is_zerof(z) ((z)==(float)0)
-    #define __Pyx_c_conjf(z)    (::std::conj(z))
-    /*#define __Pyx_c_absf(z)     (::std::abs(z))*/
-  #else
-    #define __Pyx_c_is_zerof(z) ((z)==0)
-    #define __Pyx_c_conjf(z)    (conjf(z))
-    /*#define __Pyx_c_absf(z)     (cabsf(z))*/
- #endif
-#else
-    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);
-    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);
-    /*static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);*/
-#endif
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+ * # ----------------------------------------
+ * 
+ * cdef class LossFunction:             # <<<<<<<<<<<<<<
+ *     """Base class for convex loss functions"""
+ *     cpdef double loss(self, double p, double y):
+ */
 
-static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);
-
-#if CYTHON_CCOMPLEX
-    #define __Pyx_c_eq(a, b)   ((a)==(b))
-    #define __Pyx_c_sum(a, b)  ((a)+(b))
-    #define __Pyx_c_diff(a, b) ((a)-(b))
-    #define __Pyx_c_prod(a, b) ((a)*(b))
-    #define __Pyx_c_quot(a, b) ((a)/(b))
-    #define __Pyx_c_neg(a)     (-(a))
-  #ifdef __cplusplus
-    #define __Pyx_c_is_zero(z) ((z)==(double)0)
-    #define __Pyx_c_conj(z)    (::std::conj(z))
-    /*#define __Pyx_c_abs(z)     (::std::abs(z))*/
-  #else
-    #define __Pyx_c_is_zero(z) ((z)==0)
-    #define __Pyx_c_conj(z)    (conj(z))
-    /*#define __Pyx_c_abs(z)     (cabs(z))*/
- #endif
-#else
-    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);
-    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);
-    /*static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);*/
-#endif
+struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
+  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
 
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+ *         raise NotImplementedError()
+ * 
+ * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for regression."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
 
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
 
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+ *         return Log,()
+ * 
+ * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
 
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
 
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return SquaredError,()
+ * 
+ * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
 
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
 
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+ * 
+ * 
+ * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for classification."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
 
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
 
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+ *         return ModifiedHuber,()
+ * 
+ * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
+ *     """SVM classification loss for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
 
-static void __Pyx_WriteUnraisable(const char *name); /*proto*/
 
-static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+ *         raise NotImplementedError()
+ * 
+ * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
+ *     """Modified Huber loss function for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict);  /*proto*/
+struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
 
-static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
 
-static void __Pyx_AddTraceback(const char *funcname); /*proto*/
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+ * 
+ * 
+ * cdef class Log(Classification):             # <<<<<<<<<<<<<<
+ *     """Logistic regression loss for binary classification
+ *     tasks with y in {-1,1}.
+ */
 
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_sparse_Log;
 /* Module declarations from python_buffer */
 
-/* Module declarations from python_ref */
-
 /* Module declarations from stdlib */
 
-/* Module declarations from stdio */
-
 /* Module declarations from numpy */
 
 /* Module declarations from numpy */
 
 static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
-static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
-static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
-static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
-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*/
+static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
 /* Module declarations from cython */
 
 /* Module declarations from sgd_fast_sparse */
@@ -952,183 +944,166 @@ static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Hinge = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Log = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_SquaredError = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Huber = 0;
-static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(__pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/
-static CYTHON_INLINE __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_min(__pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/
-static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_t_15sgd_fast_sparse_FLOAT *, __pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_INTEGER); /*proto*/
-static __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_add(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_t_15sgd_fast_sparse_DOUBLE, __pyx_t_15sgd_fast_sparse_FLOAT *, __pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_INTEGER, __pyx_t_15sgd_fast_sparse_DOUBLE); /*proto*/
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE = { "sgd_fast_sparse.DOUBLE", NULL, sizeof(__pyx_t_15sgd_fast_sparse_DOUBLE), 'R' };
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_FLOAT = { "sgd_fast_sparse.FLOAT", NULL, sizeof(__pyx_t_15sgd_fast_sparse_FLOAT), 'R' };
-static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER = { "sgd_fast_sparse.INTEGER", NULL, sizeof(__pyx_t_15sgd_fast_sparse_INTEGER), 'I' };
+static INLINE double __pyx_f_15sgd_fast_sparse_max(double, double); /*proto*/
+static INLINE double __pyx_f_15sgd_fast_sparse_min(double, double); /*proto*/
+static double __pyx_f_15sgd_fast_sparse_dot(double *, double *, int *, int, int); /*proto*/
+static double __pyx_f_15sgd_fast_sparse_add(double *, double, double *, int *, int, int, double); /*proto*/
+static void __pyx_f_15sgd_fast_sparse_l1penalty(double *, double, double *, int *, int, int, double); /*proto*/
+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 "sgd_fast_sparse"
 int __pyx_module_is_main_sgd_fast_sparse = 0;
 
 /* Implementation of sgd_fast_sparse */
+static char __pyx_k___main__[] = "__main__";
+static PyObject *__pyx_kp___main__;
+static char __pyx_k_loss[] = "loss";
+static PyObject *__pyx_kp_loss;
+static char __pyx_k_dloss[] = "dloss";
+static PyObject *__pyx_kp_dloss;
+static char __pyx_k___reduce__[] = "__reduce__";
+static PyObject *__pyx_kp___reduce__;
+static char __pyx_k___init__[] = "__init__";
+static PyObject *__pyx_kp___init__;
+static char __pyx_k_p[] = "p";
+static PyObject *__pyx_kp_p;
+static char __pyx_k_y[] = "y";
+static PyObject *__pyx_kp_y;
+static char __pyx_k_c[] = "c";
+static PyObject *__pyx_kp_c;
+static char __pyx_k_w[] = "w";
+static PyObject *__pyx_kp_w;
+static char __pyx_k_intercept[] = "intercept";
+static PyObject *__pyx_kp_intercept;
+static char __pyx_k_penalty_type[] = "penalty_type";
+static PyObject *__pyx_kp_penalty_type;
+static char __pyx_k_alpha[] = "alpha";
+static PyObject *__pyx_kp_alpha;
+static char __pyx_k_rho[] = "rho";
+static PyObject *__pyx_kp_rho;
+static char __pyx_k_X_data[] = "X_data";
+static PyObject *__pyx_kp_X_data;
+static char __pyx_k_X_indices[] = "X_indices";
+static PyObject *__pyx_kp_X_indices;
+static char __pyx_k_X_indptr[] = "X_indptr";
+static PyObject *__pyx_kp_X_indptr;
+static char __pyx_k_Y[] = "Y";
+static PyObject *__pyx_kp_Y;
+static char __pyx_k_n_iter[] = "n_iter";
+static PyObject *__pyx_kp_n_iter;
+static char __pyx_k_fit_intercept[] = "fit_intercept";
+static PyObject *__pyx_kp_fit_intercept;
+static char __pyx_k_verbose[] = "verbose";
+static PyObject *__pyx_kp_verbose;
+static char __pyx_k_shuffle[] = "shuffle";
+static PyObject *__pyx_kp_shuffle;
+static char __pyx_k_numpy[] = "numpy";
+static PyObject *__pyx_kp_numpy;
+static char __pyx_k_np[] = "np";
+static PyObject *__pyx_kp_np;
+static char __pyx_k_sys[] = "sys";
+static PyObject *__pyx_kp_sys;
+static char __pyx_k_time[] = "time";
+static PyObject *__pyx_kp_time;
+static char __pyx_k_NotImplementedError[] = "NotImplementedError";
+static PyObject *__pyx_kp_NotImplementedError;
+static char __pyx_k_arange[] = "arange";
+static PyObject *__pyx_kp_arange;
+static char __pyx_k_dtype[] = "dtype";
+static PyObject *__pyx_kp_dtype;
+static char __pyx_k_31[] = "int32";
+static PyObject *__pyx_kp_31;
+static char __pyx_k_zeros[] = "zeros";
+static PyObject *__pyx_kp_zeros;
+static char __pyx_k_32[] = "float64";
+static PyObject *__pyx_kp_32;
+static char __pyx_k_order[] = "order";
+static PyObject *__pyx_kp_order;
+static char __pyx_k_33[] = "c";
+static PyObject *__pyx_kp_33;
+static char __pyx_k_random[] = "random";
+static PyObject *__pyx_kp_random;
+static char __pyx_k_dot[] = "dot";
+static PyObject *__pyx_kp_dot;
+static char __pyx_k_nonzero[] = "nonzero";
+static PyObject *__pyx_kp_nonzero;
+static char __pyx_k_shape[] = "shape";
+static PyObject *__pyx_kp_shape;
+static char __pyx_k_any[] = "any";
+static PyObject *__pyx_kp_any;
+static char __pyx_k_isinf[] = "isinf";
+static PyObject *__pyx_kp_isinf;
+static char __pyx_k_isnan[] = "isnan";
+static PyObject *__pyx_kp_isnan;
+static char __pyx_k_ValueError[] = "ValueError";
+static PyObject *__pyx_kp_ValueError;
 static PyObject *__pyx_builtin_NotImplementedError;
 static PyObject *__pyx_builtin_ValueError;
+static PyObject *__pyx_kp_34;
+static PyObject *__pyx_kp_35;
+static PyObject *__pyx_kp_36;
+static PyObject *__pyx_kp_37;
+static char __pyx_k_34[] = "-- Epoch %d";
+static char __pyx_k_35[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f";
+static char __pyx_k_36[] = "Total training time: %.2f seconds.";
+static char __pyx_k_37[] = "floating-point under-/overflow occured.";
+static PyObject *__pyx_int_15;
+static char __pyx_k___getbuffer__[] = "__getbuffer__";
+static PyObject *__pyx_kp___getbuffer__;
+static char __pyx_k___releasebuffer__[] = "__releasebuffer__";
+static PyObject *__pyx_kp___releasebuffer__;
+static char __pyx_k_info[] = "info";
+static PyObject *__pyx_kp_info;
+static char __pyx_k_flags[] = "flags";
+static PyObject *__pyx_kp_flags;
+static char __pyx_k_range[] = "range";
+static PyObject *__pyx_kp_range;
+static char __pyx_k_itervalues[] = "itervalues";
+static PyObject *__pyx_kp_itervalues;
+static char __pyx_k_RuntimeError[] = "RuntimeError";
+static PyObject *__pyx_kp_RuntimeError;
+static PyObject *__pyx_kp_1;
+static PyObject *__pyx_kp_2;
+static PyObject *__pyx_kp_5;
+static PyObject *__pyx_kp_23;
 static PyObject *__pyx_builtin_range;
 static PyObject *__pyx_builtin_RuntimeError;
-static char __pyx_k_1[] = "-- Epoch %d";
-static char __pyx_k_2[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f";
-static char __pyx_k_3[] = "Total training time: %.2f seconds.";
-static char __pyx_k_4[] = "floating-point under-/overflow occured.";
-static char __pyx_k_5[] = "ndarray is not C contiguous";
-static char __pyx_k_6[] = "ndarray is not Fortran contiguous";
-static char __pyx_k_7[] = "Non-native byte order not supported";
-static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)";
-static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd";
-static char __pyx_k_10[] = "Format string allocated too short.";
-static char __pyx_k_11[] = "LossFunction.loss (line 33)";
-static char __pyx_k_12[] = "LossFunction.dloss (line 42)";
-static char __pyx_k_13[] = "plain_sgd (line 181)";
-static char __pyx_k__B[] = "B";
-static char __pyx_k__H[] = "H";
-static char __pyx_k__I[] = "I";
-static char __pyx_k__L[] = "L";
-static char __pyx_k__O[] = "O";
-static char __pyx_k__Q[] = "Q";
-static char __pyx_k__Y[] = "Y";
-static char __pyx_k__b[] = "b";
-static char __pyx_k__c[] = "c";
-static char __pyx_k__d[] = "d";
-static char __pyx_k__f[] = "f";
-static char __pyx_k__g[] = "g";
-static char __pyx_k__h[] = "h";
-static char __pyx_k__i[] = "i";
-static char __pyx_k__l[] = "l";
-static char __pyx_k__p[] = "p";
-static char __pyx_k__q[] = "q";
-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__buf[] = "buf";
-static char __pyx_k__dot[] = "dot";
-static char __pyx_k__obj[] = "obj";
-static char __pyx_k__rho[] = "rho";
-static char __pyx_k__sys[] = "sys";
-static char __pyx_k__base[] = "base";
-static char __pyx_k__data[] = "data";
-static char __pyx_k__loss[] = "loss";
-static char __pyx_k__ndim[] = "ndim";
-static char __pyx_k__time[] = "time";
-static char __pyx_k__alpha[] = "alpha";
-static char __pyx_k__descr[] = "descr";
-static char __pyx_k__dloss[] = "dloss";
-static char __pyx_k__dtype[] = "dtype";
-static char __pyx_k__int32[] = "int32";
-static char __pyx_k__isinf[] = "isinf";
-static char __pyx_k__isnan[] = "isnan";
-static char __pyx_k__names[] = "names";
-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__zeros[] = "zeros";
-static char __pyx_k__X_data[] = "X_data";
-static char __pyx_k__arange[] = "arange";
-static char __pyx_k__fields[] = "fields";
-static char __pyx_k__format[] = "format";
-static char __pyx_k__n_iter[] = "n_iter";
-static char __pyx_k__random[] = "random";
-static char __pyx_k__float64[] = "float64";
-static char __pyx_k__nonzero[] = "nonzero";
-static char __pyx_k__shuffle[] = "shuffle";
-static char __pyx_k__strides[] = "strides";
-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__itemsize[] = "itemsize";
-static char __pyx_k__readonly[] = "readonly";
-static char __pyx_k__type_num[] = "type_num";
-static char __pyx_k__X_indices[] = "X_indices";
-static char __pyx_k__byteorder[] = "byteorder";
-static char __pyx_k__intercept[] = "intercept";
-static char __pyx_k__plain_sgd[] = "plain_sgd";
-static char __pyx_k__ValueError[] = "ValueError";
-static char __pyx_k__suboffsets[] = "suboffsets";
-static char __pyx_k__LossFunction[] = "LossFunction";
-static char __pyx_k__RuntimeError[] = "RuntimeError";
-static char __pyx_k__penalty_type[] = "penalty_type";
-static char __pyx_k__fit_intercept[] = "fit_intercept";
-static char __pyx_k__NotImplementedError[] = "NotImplementedError";
-static PyObject *__pyx_kp_s_1;
-static PyObject *__pyx_kp_u_10;
-static PyObject *__pyx_kp_u_11;
-static PyObject *__pyx_kp_u_12;
-static PyObject *__pyx_kp_u_13;
-static PyObject *__pyx_kp_s_2;
-static PyObject *__pyx_kp_s_3;
-static PyObject *__pyx_kp_s_4;
-static PyObject *__pyx_kp_u_5;
-static PyObject *__pyx_kp_u_6;
-static PyObject *__pyx_kp_u_7;
-static PyObject *__pyx_kp_u_8;
-static PyObject *__pyx_kp_u_9;
-static PyObject *__pyx_n_s__LossFunction;
-static PyObject *__pyx_n_s__NotImplementedError;
-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_indices;
-static PyObject *__pyx_n_s__X_indptr;
-static PyObject *__pyx_n_s__Y;
-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__base;
-static PyObject *__pyx_n_s__buf;
-static PyObject *__pyx_n_s__byteorder;
-static PyObject *__pyx_n_s__c;
-static PyObject *__pyx_n_s__data;
-static PyObject *__pyx_n_s__descr;
-static PyObject *__pyx_n_s__dloss;
-static PyObject *__pyx_n_s__dot;
-static PyObject *__pyx_n_s__dtype;
-static PyObject *__pyx_n_s__fields;
-static PyObject *__pyx_n_s__fit_intercept;
-static PyObject *__pyx_n_s__float64;
-static PyObject *__pyx_n_s__format;
-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__itemsize;
-static PyObject *__pyx_n_s__loss;
-static PyObject *__pyx_n_s__n_iter;
-static PyObject *__pyx_n_s__names;
-static PyObject *__pyx_n_s__ndim;
-static PyObject *__pyx_n_s__nonzero;
-static PyObject *__pyx_n_s__np;
-static PyObject *__pyx_n_s__numpy;
-static PyObject *__pyx_n_s__obj;
-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__random;
-static PyObject *__pyx_n_s__range;
-static PyObject *__pyx_n_s__readonly;
-static PyObject *__pyx_n_s__rho;
-static PyObject *__pyx_n_s__shape;
-static PyObject *__pyx_n_s__shuffle;
-static PyObject *__pyx_n_s__strides;
-static PyObject *__pyx_n_s__suboffsets;
-static PyObject *__pyx_n_s__sys;
-static PyObject *__pyx_n_s__time;
-static PyObject *__pyx_n_s__type_num;
-static PyObject *__pyx_n_s__verbose;
-static PyObject *__pyx_n_s__w;
-static PyObject *__pyx_n_s__y;
-static PyObject *__pyx_n_s__zeros;
-static PyObject *__pyx_int_15;
-
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+static char __pyx_k_1[] = "ndarray is not C contiguous";
+static char __pyx_k_2[] = "ndarray is not Fortran contiguous";
+static char __pyx_k_3[] = ">";
+static char __pyx_k_4[] = "<";
+static char __pyx_k_5[] = "Non-native byte order not supported";
+static char __pyx_k_6[] = "b";
+static char __pyx_k_7[] = "B";
+static char __pyx_k_8[] = "h";
+static char __pyx_k_9[] = "H";
+static char __pyx_k_10[] = "i";
+static char __pyx_k_11[] = "I";
+static char __pyx_k_12[] = "l";
+static char __pyx_k_13[] = "L";
+static char __pyx_k_14[] = "q";
+static char __pyx_k_15[] = "Q";
+static char __pyx_k_16[] = "f";
+static char __pyx_k_17[] = "d";
+static char __pyx_k_18[] = "g";
+static char __pyx_k_19[] = "Zf";
+static char __pyx_k_20[] = "Zd";
+static char __pyx_k_21[] = "Zg";
+static char __pyx_k_22[] = "O";
+static char __pyx_k_23[] = "unknown dtype code in numpy.pxd (%d)";
+static char __pyx_k_24[] = "^";
+static PyObject *__pyx_kp_25;
+static PyObject *__pyx_kp_28;
+static PyObject *__pyx_kp_29;
+static PyObject *__pyx_kp_30;
+static char __pyx_k_25[] = "Format string allocated too short, see comment in numpy.pxd";
+static char __pyx_k_26[] = ">";
+static char __pyx_k_27[] = "<";
+static char __pyx_k_28[] = "Non-native byte order not supported";
+static char __pyx_k_29[] = "Format string allocated too short.";
+static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
+
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1139,71 +1114,71 @@ static PyObject *__pyx_int_15;
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("loss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __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 = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":41
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self, double p, double y):
  *         """Evaluate the derivative of the loss function.
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1218,8 +1193,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1231,36 +1206,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 33; __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 = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 33; __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 = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1274,11 +1249,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":42
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1289,71 +1264,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("dloss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __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 = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":50
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":53
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class Regression(LossFunction):
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":42
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1368,8 +1343,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1381,36 +1356,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 42; __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 = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 42; __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 = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1424,11 +1399,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1439,71 +1414,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("loss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __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 = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1517,8 +1492,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1530,36 +1505,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __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 = 54; __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 = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __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 = 54; __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 = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1573,11 +1548,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1588,71 +1563,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("dloss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1666,8 +1641,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1679,36 +1654,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1722,11 +1697,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1737,71 +1712,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("loss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __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 = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1815,8 +1790,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1828,36 +1803,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __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 = 62; __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 = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __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 = 62; __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 = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1871,11 +1846,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1886,71 +1861,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("dloss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class ModifiedHuber(Classification):
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_Raise(__pyx_t_2, 0, 0);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1964,8 +1939,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -1977,36 +1952,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2020,11 +1995,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":77
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2036,46 +2011,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
 static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __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 = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":78
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
  *     """
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2084,17 +2058,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z >= 1);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2106,17 +2080,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
  *             return (1-z) * (1-z)
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z >= -1);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
  *             return 0
  *         elif z >= -1:
  *             return (1-z) * (1-z)             # <<<<<<<<<<<<<<
@@ -2129,7 +2103,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
  *             return (1-z) * (1-z)
  *         else:
  *             return -4*z             # <<<<<<<<<<<<<<
@@ -2144,19 +2118,18 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":77
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2170,8 +2143,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -2183,36 +2156,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __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 = 77; __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 = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __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 = 77; __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 = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 77; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2226,11 +2199,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
  *             return -4*z
  * 
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2242,46 +2215,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
 static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __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 = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
  * 
  *     cpdef double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2290,17 +2262,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
  *     cpdef double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z >= 1);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2312,17 +2284,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
  *             return 2*(1-z)*y
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z >= -1);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
  *             return 0
  *         elif z >= -1:
  *             return 2*(1-z)*y             # <<<<<<<<<<<<<<
@@ -2335,7 +2307,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
  *             return 2*(1-z)*y
  *         else:
  *             return 4*y             # <<<<<<<<<<<<<<
@@ -2350,19 +2322,18 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
  *             return -4*z
  * 
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2376,8 +2347,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -2389,36 +2360,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __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 = 86; __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 = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __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 = 86; __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 = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2432,11 +2403,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
  *             return 4*y
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2448,9 +2419,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
+  __Pyx_SetupRefcountContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":99
  * 
  *     def __reduce__(self):
  *         return ModifiedHuber,()             # <<<<<<<<<<<<<<
@@ -2458,15 +2429,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
  * cdef class Hinge(Classification):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __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 = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -2478,11 +2449,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":102
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
  *     classification tasks with y in {-1,1}.
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2494,46 +2465,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
 static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __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 = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":103
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
  *     """
  *     cpdef  double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2542,17 +2512,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
  *     cpdef  double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return (1 - z)
  *         return 0
  */
-  __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z < 1.0);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return (1 - z)             # <<<<<<<<<<<<<<
@@ -2565,7 +2535,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
  *         if z < 1.0:
  *             return (1 - z)
  *         return 0             # <<<<<<<<<<<<<<
@@ -2578,19 +2548,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":102
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
  *     classification tasks with y in {-1,1}.
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2604,8 +2573,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -2617,36 +2586,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __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 = 102; __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 = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __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 = 102; __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 = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2660,11 +2629,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2676,46 +2645,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
 static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
  *         return 0
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2724,17 +2692,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return y
  *         return 0
  */
-  __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z < 1.0);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return y             # <<<<<<<<<<<<<<
@@ -2747,7 +2715,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
  *         if z < 1.0:
  *             return y
  *         return 0             # <<<<<<<<<<<<<<
@@ -2760,19 +2728,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2786,8 +2753,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -2799,36 +2766,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __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 = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __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 = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2842,11 +2809,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
  *         return 0
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2858,9 +2825,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
 static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
+  __Pyx_SetupRefcountContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
  * 
  *     def __reduce__(self):
  *         return Hinge,()             # <<<<<<<<<<<<<<
@@ -2868,15 +2835,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __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 = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -2888,11 +2855,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2904,46 +2871,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
 static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __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);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":122
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
  *     """
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2952,17 +2918,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z)
  *         if z < -18:
  */
-  __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z > 18);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z)             # <<<<<<<<<<<<<<
@@ -2975,17 +2941,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
  *         if z > 18:
  *             return exp(-z)
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return -z * y
  *         return log(1.0+exp(-z))
  */
-  __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z < -18);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
  *             return exp(-z)
  *         if z < -18:
  *             return -z * y             # <<<<<<<<<<<<<<
@@ -2998,7 +2964,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
  *         if z < -18:
  *             return -z * y
  *         return log(1.0+exp(-z))             # <<<<<<<<<<<<<<
@@ -3011,19 +2977,18 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3037,8 +3002,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -3050,36 +3015,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3093,11 +3058,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  *         return log(1.0+exp(-z))
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3109,46 +3074,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
 static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __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 = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
  * 
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -3157,17 +3121,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z) * y
  *         if z < -18:
  */
-  __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z > 18);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z) * y             # <<<<<<<<<<<<<<
@@ -3180,17 +3144,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *         if z > 18:
  *             return exp(-z) * y
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return y
  *         return y / (exp(z) + 1.0)
  */
-  __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_z < -18);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
  *             return exp(-z) * y
  *         if z < -18:
  *             return y             # <<<<<<<<<<<<<<
@@ -3203,37 +3167,31 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
  *         if z < -18:
  *             return y
  *         return y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-  __pyx_t_5 = (exp(__pyx_v_z) + 1.0);
-  if (unlikely(__pyx_t_5 == 0)) {
-    PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_r = (__pyx_v_y / __pyx_t_5);
+  __pyx_r = (__pyx_v_y / (exp(__pyx_v_z) + 1.0));
   goto __pyx_L0;
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  *         return log(1.0+exp(-z))
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3247,8 +3205,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -3260,36 +3218,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __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 = 129; __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 = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __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 = 129; __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 = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3303,11 +3261,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
  *         return y / (exp(z) + 1.0)
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3319,9 +3277,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
+  __Pyx_SetupRefcountContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
  * 
  *     def __reduce__(self):
  *         return Log,()             # <<<<<<<<<<<<<<
@@ -3329,15 +3287,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
  * cdef class SquaredError(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __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 = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -3349,11 +3307,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
  *     """
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3364,44 +3322,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("loss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __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 = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":144
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
  *     """
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)             # <<<<<<<<<<<<<<
@@ -3414,18 +3372,18 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
  *     """
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3439,8 +3397,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -3452,36 +3410,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __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 = 143; __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 = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __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 = 143; __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 = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3495,11 +3453,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3510,44 +3468,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  __Pyx_RefNannySetupContext("dloss");
+  double __pyx_t_4;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):
  *         return y - p             # <<<<<<<<<<<<<<
@@ -3560,18 +3518,18 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3585,8 +3543,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -3598,36 +3556,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3641,11 +3599,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
  *         return y - p
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3657,9 +3615,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
+  __Pyx_SetupRefcountContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
  * 
  *     def __reduce__(self):
  *         return SquaredError,()             # <<<<<<<<<<<<<<
@@ -3667,15 +3625,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
  * cdef class Huber(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __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 = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -3687,11 +3645,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":155
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
  *     """
  *     cdef double c
  *     def __init__(self,c):             # <<<<<<<<<<<<<<
@@ -3704,8 +3662,8 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   PyObject *__pyx_v_c = 0;
   int __pyx_r;
   double __pyx_t_1;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__c,0};
-  __Pyx_RefNannySetupContext("__init__");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_c,0};
+  __Pyx_SetupRefcountContext("__init__");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[1] = {0};
@@ -3716,12 +3674,12 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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 = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_c = values[0];
   } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
@@ -3731,20 +3689,20 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
   return -1;
   __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":156
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
  *     cdef double c
  *     def __init__(self,c):
  *         self.c = c             # <<<<<<<<<<<<<<
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y
  */
-  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
 
   __pyx_r = 0;
@@ -3753,11 +3711,11 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
   __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
  *     def __init__(self,c):
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3770,46 +3728,45 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   double __pyx_v_r;
   double __pyx_v_abs_r;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __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 = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y             # <<<<<<<<<<<<<<
@@ -3818,33 +3775,33 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
  */
   __pyx_v_r = (__pyx_v_p - __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); 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_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_2); 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_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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
+  __pyx_v_abs_r = __pyx_t_4;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return 0.5 * r * r
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":164
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return 0.5 * r * r             # <<<<<<<<<<<<<<
@@ -3857,7 +3814,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
  *             return 0.5 * r * r
  *         else:
  *             return self.c * abs_r - (0.5*self.c*self.c)             # <<<<<<<<<<<<<<
@@ -3872,19 +3829,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
  *     def __init__(self,c):
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3898,8 +3854,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("loss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("loss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -3911,36 +3867,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __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 = 157; __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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __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 = 157; __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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3954,11 +3910,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3971,46 +3927,45 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   double __pyx_v_r;
   double __pyx_v_abs_r;
   double __pyx_r;
+  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  double __pyx_t_5;
-  int __pyx_t_6;
-  __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  double __pyx_t_4;
+  int __pyx_t_5;
+  __Pyx_SetupRefcountContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); 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_t_4 = PyTuple_New(2); 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);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
+      __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, 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_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_r = __pyx_t_5;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_r = __pyx_t_4;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
  * 
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double r = y - p             # <<<<<<<<<<<<<<
@@ -4019,33 +3974,33 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
  */
   __pyx_v_r = (__pyx_v_y - __pyx_v_p);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_2); 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_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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
+  __pyx_v_abs_r = __pyx_t_4;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return r
  *         elif r > 0:
  */
-  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return r             # <<<<<<<<<<<<<<
@@ -4057,17 +4012,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
  *         if abs_r <= self.c:
  *             return r
  *         elif r > 0:             # <<<<<<<<<<<<<<
  *             return self.c
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_r > 0);
-  if (__pyx_t_6) {
+  __pyx_t_5 = (__pyx_v_r > 0);
+  if (__pyx_t_5) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":174
  *             return r
  *         elif r > 0:
  *             return self.c             # <<<<<<<<<<<<<<
@@ -4080,7 +4035,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
  *             return self.c
  *         else:
  *             return -self.c             # <<<<<<<<<<<<<<
@@ -4095,19 +4050,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -4121,8 +4075,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};
-  __Pyx_RefNannySetupContext("dloss");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
+  __Pyx_SetupRefcountContext("dloss");
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
     PyObject* values[2] = {0,0};
@@ -4134,36 +4088,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_y);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __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 = 165; __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 = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __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 = 165; __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 = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 0)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4177,11 +4131,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
  *             return -self.c
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -4194,9 +4148,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
+  __Pyx_SetupRefcountContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
  * 
  *     def __reduce__(self):
  *         return Huber,(self.c,)             # <<<<<<<<<<<<<<
@@ -4204,22 +4158,22 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
  * @cython.boundscheck(False)
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __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 = 176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 176; __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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));
+  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
   __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_1;
+  __pyx_r = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -4232,15 +4186,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":181
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":184
  * @cython.wraparound(False)
  * @cython.cdivision(True)
- * def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,             # <<<<<<<<<<<<<<
- *               DOUBLE intercept,
+ * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
+ *               double intercept,
  *               LossFunction loss,
  */
 
@@ -4248,7 +4202,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
 static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n    \n    ";
 static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_w = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_intercept;
+  double __pyx_v_intercept;
   struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_loss = 0;
   int __pyx_v_penalty_type;
   double __pyx_v_alpha;
@@ -4263,31 +4217,31 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   int __pyx_v_shuffle;
   unsigned int __pyx_v_n_samples;
   unsigned int __pyx_v_n_features;
-  __pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr;
-  __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr;
-  __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indptr_ptr;
-  __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr;
+  double *__pyx_v_w_data_ptr;
+  double *__pyx_v_X_data_ptr;
+  int *__pyx_v_X_indptr_ptr;
+  int *__pyx_v_X_indices_ptr;
   PyArrayObject *__pyx_v_index = 0;
-  __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_index_ptr;
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset;
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_p;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_update;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sumloss;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wnorm;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_t;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_y;
+  int *__pyx_v_index_ptr;
+  int __pyx_v_offset;
+  int __pyx_v_xnnz;
+  double __pyx_v_wscale;
+  double __pyx_v_eta;
+  double __pyx_v_p;
+  double __pyx_v_update;
+  double __pyx_v_sumloss;
+  double __pyx_v_wnorm;
+  double __pyx_v_t;
+  double __pyx_v_y;
   unsigned int __pyx_v_count;
   unsigned int __pyx_v_epoch;
   unsigned int __pyx_v_i;
   unsigned int __pyx_v_sample_idx;
   PyArrayObject *__pyx_v_q = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_q_ptr;
+  double *__pyx_v_q_data_ptr;
   double __pyx_v_u;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_typw;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta0;
+  double __pyx_v_typw;
+  double __pyx_v_eta0;
   PyObject *__pyx_v_t_start;
   Py_buffer __pyx_bstruct_index;
   Py_ssize_t __pyx_bstride_0_index = 0;
@@ -4311,31 +4265,32 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   Py_ssize_t __pyx_bstride_0_w = 0;
   Py_ssize_t __pyx_bshape_0_w = 0;
   PyObject *__pyx_r = NULL;
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
-  PyArrayObject *__pyx_t_6 = NULL;
-  PyArrayObject *__pyx_t_7 = NULL;
-  int __pyx_t_8;
-  int __pyx_t_9;
+  PyArrayObject *__pyx_t_4 = NULL;
+  PyArrayObject *__pyx_t_5 = NULL;
+  int __pyx_t_6;
+  int __pyx_t_7;
+  PyObject *__pyx_t_8 = NULL;
+  PyObject *__pyx_t_9 = NULL;
   PyObject *__pyx_t_10 = NULL;
-  PyObject *__pyx_t_11 = NULL;
-  PyObject *__pyx_t_12 = NULL;
-  int __pyx_t_13;
+  int __pyx_t_11;
+  unsigned int __pyx_t_12;
+  unsigned int __pyx_t_13;
   unsigned int __pyx_t_14;
-  unsigned int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  PyArrayObject *__pyx_t_17 = NULL;
-  double __pyx_t_18;
-  PyObject *__pyx_t_19 = NULL;
+  PyArrayObject *__pyx_t_15 = NULL;
+  double __pyx_t_16;
+  PyObject *__pyx_t_17 = NULL;
+  PyObject *__pyx_t_18 = NULL;
+  int __pyx_t_19;
   int __pyx_t_20;
   int __pyx_t_21;
   int __pyx_t_22;
-  int __pyx_t_23;
-  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,0};
-  __Pyx_RefNannySetupContext("plain_sgd");
+  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_w,&__pyx_kp_intercept,&__pyx_kp_loss,&__pyx_kp_penalty_type,&__pyx_kp_alpha,&__pyx_kp_rho,&__pyx_kp_X_data,&__pyx_kp_X_indices,&__pyx_kp_X_indptr,&__pyx_kp_Y,&__pyx_kp_n_iter,&__pyx_kp_fit_intercept,&__pyx_kp_verbose,&__pyx_kp_shuffle,0};
+  __Pyx_SetupRefcountContext("plain_sgd");
   __pyx_self = __pyx_self;
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
@@ -4360,136 +4315,131 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__w);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_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);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_kp_intercept);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  2:
-      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
+      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_kp_loss);
       if (likely(values[2])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  3:
-      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
+      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_kp_penalty_type);
       if (likely(values[3])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  4:
-      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
+      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_kp_alpha);
       if (likely(values[4])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  5:
-      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
+      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_kp_rho);
       if (likely(values[5])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  6:
-      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_data);
+      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_data);
       if (likely(values[6])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  7:
-      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indices);
+      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_indices);
       if (likely(values[7])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  8:
-      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indptr);
+      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_indptr);
       if (likely(values[8])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  9:
-      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
+      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_kp_Y);
       if (likely(values[9])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 10:
-      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
+      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_kp_n_iter);
       if (likely(values[10])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 11:
-      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
+      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_kp_fit_intercept);
       if (likely(values[11])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 12:
-      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
+      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_kp_verbose);
       if (likely(values[12])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 13:
-      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
+      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_kp_shuffle);
       if (likely(values[13])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 184; __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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 184; __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 = 185; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_rho = __pyx_PyFloat_AsDouble(values[5]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __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 = 190; __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 = 190; __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 = 191; __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 = 191; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 193; __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 = 193; __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 = 194; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
     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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 184; __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 = 185; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_alpha = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 4)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_rho = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 5)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __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 = 190; __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 = 190; __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 = 191; __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 = 191; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 193; __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 = 193; __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 = 194; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __Pyx_INCREF((PyObject *)__pyx_v_loss);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_INCREF((PyObject *)__pyx_v_Y);
   __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
   __pyx_bstruct_index.buf = NULL;
   __pyx_bstruct_q.buf = NULL;
@@ -4498,44 +4448,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_bstruct_X_indices.buf = NULL;
   __pyx_bstruct_X_indptr.buf = NULL;
   __pyx_bstruct_Y.buf = NULL;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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 = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __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 = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 = 184; __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];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_FLOAT, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_bstruct_Y, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
   __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":197
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
  *     """
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]             # <<<<<<<<<<<<<<
@@ -4544,217 +4494,217 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":198
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]
  *     cdef unsigned int n_features = w.shape[0]             # <<<<<<<<<<<<<<
  * 
- *     # FIXME double to DOUBLE
+ *     # FIXME double to double
  */
   __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
  * 
- *     # FIXME double to DOUBLE
- *     cdef DOUBLE *w_data_ptr = w.data             # <<<<<<<<<<<<<<
- *     cdef FLOAT *X_data_ptr = X_data.data
- *     cdef INTEGER *X_indptr_ptr = X_indptr.data
+ *     # FIXME double to double
+ *     cdef double *w_data_ptr = w.data             # <<<<<<<<<<<<<<
+ *     cdef double *X_data_ptr = X_data.data
+ *     cdef int *X_indptr_ptr = X_indptr.data
  */
-  __pyx_v_w_data_ptr = ((__pyx_t_15sgd_fast_sparse_DOUBLE *)__pyx_v_w->data);
+  __pyx_v_w_data_ptr = ((double *)__pyx_v_w->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":202
- *     # FIXME double to DOUBLE
- *     cdef DOUBLE *w_data_ptr = w.data
- *     cdef FLOAT *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
- *     cdef INTEGER *X_indptr_ptr = X_indptr.data
- *     cdef INTEGER *X_indices_ptr = X_indices.data
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
+ *     # FIXME double to double
+ *     cdef double *w_data_ptr = w.data
+ *     cdef double *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
+ *     cdef int *X_indptr_ptr = X_indptr.data
+ *     cdef int *X_indices_ptr = X_indices.data
  */
-  __pyx_v_X_data_ptr = ((__pyx_t_15sgd_fast_sparse_FLOAT *)__pyx_v_X_data->data);
+  __pyx_v_X_data_ptr = ((double *)__pyx_v_X_data->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":203
- *     cdef DOUBLE *w_data_ptr = w.data
- *     cdef FLOAT *X_data_ptr = X_data.data
- *     cdef INTEGER *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
- *     cdef INTEGER *X_indices_ptr = X_indices.data
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":206
+ *     cdef double *w_data_ptr = w.data
+ *     cdef double *X_data_ptr = X_data.data
+ *     cdef int *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
+ *     cdef int *X_indices_ptr = X_indices.data
  * 
  */
-  __pyx_v_X_indptr_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_X_indptr->data);
+  __pyx_v_X_indptr_ptr = ((int *)__pyx_v_X_indptr->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
- *     cdef FLOAT *X_data_ptr = X_data.data
- *     cdef INTEGER *X_indptr_ptr = X_indptr.data
- *     cdef INTEGER *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207
+ *     cdef double *X_data_ptr = X_data.data
+ *     cdef int *X_indptr_ptr = X_indptr.data
+ *     cdef int *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
  * 
  *     # FIXME unsined int?
  */
-  __pyx_v_X_indices_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_X_indices->data);
+  __pyx_v_X_indices_ptr = ((int *)__pyx_v_X_indices->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
  * 
  *     # FIXME unsined int?
- *     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
+ *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
  *                                                                  dtype = np.int32)
- *     cdef INTEGER *index_ptr = index.data
+ *     cdef int *index_ptr = index.data
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_1);
+  __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_arange); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+  __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __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 = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
+  __pyx_t_2 = 0;
+  __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_1));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":208
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
  *     # FIXME unsined int?
- *     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples,
+ *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                                  dtype = np.int32)             # <<<<<<<<<<<<<<
- *     cdef INTEGER *index_ptr = index.data
- *     cdef INTEGER offset = 0
- */
-  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); 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_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); 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;
-  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+ *     cdef int *index_ptr = index.data
+ *     cdef int offset = 0
+ */
+  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_2);
+  __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_31); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+  if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
+  __pyx_t_2 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
+  if (!(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = ((PyArrayObject *)__pyx_t_2);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_4, &__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 = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
       __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
   }
-  __pyx_t_6 = 0;
-  __pyx_v_index = ((PyArrayObject *)__pyx_t_5);
-  __pyx_t_5 = 0;
+  __pyx_t_4 = 0;
+  __pyx_v_index = ((PyArrayObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":209
- *     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples,
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
+ *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                                  dtype = np.int32)
- *     cdef INTEGER *index_ptr = index.data             # <<<<<<<<<<<<<<
- *     cdef INTEGER offset = 0
- *     cdef INTEGER xnnz = 0
+ *     cdef int *index_ptr = index.data             # <<<<<<<<<<<<<<
+ *     cdef int offset = 0
+ *     cdef int xnnz = 0
  */
-  __pyx_v_index_ptr = ((__pyx_t_15sgd_fast_sparse_INTEGER *)__pyx_v_index->data);
+  __pyx_v_index_ptr = ((int *)__pyx_v_index->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
  *                                                                  dtype = np.int32)
- *     cdef INTEGER *index_ptr = index.data
- *     cdef INTEGER offset = 0             # <<<<<<<<<<<<<<
- *     cdef INTEGER xnnz = 0
- *     cdef DOUBLE wscale = 1.0
+ *     cdef int *index_ptr = index.data
+ *     cdef int offset = 0             # <<<<<<<<<<<<<<
+ *     cdef int xnnz = 0
+ *     cdef double wscale = 1.0
  */
   __pyx_v_offset = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
- *     cdef INTEGER *index_ptr = index.data
- *     cdef INTEGER offset = 0
- *     cdef INTEGER xnnz = 0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE wscale = 1.0
- *     cdef DOUBLE eta = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+ *     cdef int *index_ptr = index.data
+ *     cdef int offset = 0
+ *     cdef int xnnz = 0             # <<<<<<<<<<<<<<
+ *     cdef double wscale = 1.0
+ *     cdef double eta = 0.0
  */
   __pyx_v_xnnz = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
- *     cdef INTEGER offset = 0
- *     cdef INTEGER xnnz = 0
- *     cdef DOUBLE wscale = 1.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE eta = 0.0
- *     cdef DOUBLE p = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
+ *     cdef int offset = 0
+ *     cdef int xnnz = 0
+ *     cdef double wscale = 1.0             # <<<<<<<<<<<<<<
+ *     cdef double eta = 0.0
+ *     cdef double p = 0.0
  */
   __pyx_v_wscale = 1.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
- *     cdef INTEGER xnnz = 0
- *     cdef DOUBLE wscale = 1.0
- *     cdef DOUBLE eta = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE p = 0.0
- *     cdef DOUBLE update = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
+ *     cdef int xnnz = 0
+ *     cdef double wscale = 1.0
+ *     cdef double eta = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double p = 0.0
+ *     cdef double update = 0.0
  */
   __pyx_v_eta = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
- *     cdef DOUBLE wscale = 1.0
- *     cdef DOUBLE eta = 0.0
- *     cdef DOUBLE p = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE update = 0.0
- *     cdef DOUBLE sumloss = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
+ *     cdef double wscale = 1.0
+ *     cdef double eta = 0.0
+ *     cdef double p = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double update = 0.0
+ *     cdef double sumloss = 0.0
  */
   __pyx_v_p = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
- *     cdef DOUBLE eta = 0.0
- *     cdef DOUBLE p = 0.0
- *     cdef DOUBLE update = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE sumloss = 0.0
- *     cdef DOUBLE wnorm = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
+ *     cdef double eta = 0.0
+ *     cdef double p = 0.0
+ *     cdef double update = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double sumloss = 0.0
+ *     cdef double wnorm = 0.0
  */
   __pyx_v_update = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
- *     cdef DOUBLE p = 0.0
- *     cdef DOUBLE update = 0.0
- *     cdef DOUBLE sumloss = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE wnorm = 0.0
- *     cdef DOUBLE t = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
+ *     cdef double p = 0.0
+ *     cdef double update = 0.0
+ *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double wnorm = 0.0
+ *     cdef double t = 0.0
  */
   __pyx_v_sumloss = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
- *     cdef DOUBLE update = 0.0
- *     cdef DOUBLE sumloss = 0.0
- *     cdef DOUBLE wnorm = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE t = 0.0
- *     cdef DOUBLE y = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
+ *     cdef double update = 0.0
+ *     cdef double sumloss = 0.0
+ *     cdef double wnorm = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double t = 0.0
+ *     cdef double y = 0.0
  */
   __pyx_v_wnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
- *     cdef DOUBLE sumloss = 0.0
- *     cdef DOUBLE wnorm = 0.0
- *     cdef DOUBLE t = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE y = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
+ *     cdef double sumloss = 0.0
+ *     cdef double wnorm = 0.0
+ *     cdef double t = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  */
   __pyx_v_t = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
- *     cdef DOUBLE wnorm = 0.0
- *     cdef DOUBLE t = 0.0
- *     cdef DOUBLE y = 0.0             # <<<<<<<<<<<<<<
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+ *     cdef double wnorm = 0.0
+ *     cdef double t = 0.0
+ *     cdef double y = 0.0             # <<<<<<<<<<<<<<
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  */
   __pyx_v_y = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
- *     cdef DOUBLE t = 0.0
- *     cdef DOUBLE y = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+ *     cdef double t = 0.0
+ *     cdef double y = 0.0
  *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  */
   __pyx_v_count = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
- *     cdef DOUBLE y = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+ *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<
  *     cdef unsigned int i = 0
@@ -4762,280 +4712,280 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_epoch = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
  *     cdef unsigned int sample_idx = 0
- *     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None
+ *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  */
   __pyx_v_i = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0             # <<<<<<<<<<<<<<
- *     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None
- *     cdef DOUBLE *q_ptr
+ *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
+ *     cdef double *q_data_ptr
  */
   __pyx_v_sample_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0
- *     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
- *     cdef DOUBLE *q_ptr
+ *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
+ *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  */
-  __pyx_t_7 = ((PyArrayObject *)Py_None);
+  __pyx_t_5 = ((PyArrayObject *)Py_None);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_5, &__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 = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __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_t_5 = 0;
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
- *     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None
- *     cdef DOUBLE *q_ptr
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+ *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
+ *     cdef double *q_data_ptr
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
- *         q_ptr =  q.data
+ *         q_data_ptr =  q.data
  */
-  __pyx_t_8 = (__pyx_v_penalty_type != 2);
-  if (__pyx_t_8) {
+  __pyx_t_6 = (__pyx_v_penalty_type != 2);
+  if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
- *     cdef DOUBLE *q_ptr
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
+ *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")             # <<<<<<<<<<<<<<
- *         q_ptr =  q.data
+ *         q_data_ptr =  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 = 227; __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 = 227; __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 = 227; __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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_2);
+    __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+    __pyx_t_3 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
+    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __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 = 227; __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 = 227; __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 = 227; __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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
+    __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+    __pyx_t_1 = 0;
+    __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_1));
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_2);
+    __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+    if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (PyDict_SetItem(__pyx_1, __pyx_kp_order, __pyx_kp_33) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __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_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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
+    __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
+    if (!(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
       __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_bstruct_q, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_t_7 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
+      if (unlikely(__pyx_t_7 < 0)) {
+        PyErr_Fetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
+        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_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);
           __Pyx_RaiseBufferFallbackError();
         } else {
-          PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+          PyErr_Restore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
         }
       }
       __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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_t_7 = 0;
+    __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_q));
-    __pyx_v_q = ((PyArrayObject *)__pyx_t_4);
-    __pyx_t_4 = 0;
+    __pyx_v_q = ((PyArrayObject *)__pyx_t_1);
+    __pyx_t_1 = 0;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
- *         q_ptr =  q.data             # <<<<<<<<<<<<<<
+ *         q_data_ptr =  q.data             # <<<<<<<<<<<<<<
  *     cdef double u = 0.0
  *     # computing eta0
  */
-    __pyx_v_q_ptr = ((__pyx_t_15sgd_fast_sparse_DOUBLE *)__pyx_v_q->data);
+    __pyx_v_q_data_ptr = ((double *)__pyx_v_q->data);
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
- *         q_ptr =  q.data
+ *         q_data_ptr =  q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
  *     # computing eta0
- *     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  */
   __pyx_v_u = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
  *     cdef double u = 0.0
  *     # computing eta0
- *     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
- *     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
+ *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
  *     # computing eta0
- *     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
- *     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  */
-  __pyx_v_eta0 = (__pyx_v_typw / ((__pyx_t_15sgd_fast_sparse_DOUBLE)__pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0))));
+  __pyx_v_eta0 = (__pyx_v_typw / __pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
- *     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
- *     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+ *     cdef double typw = sqrt(1.0 / sqrt(alpha))
+ *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  */
-  __pyx_v_t = (1.0 / ((double)(__pyx_v_eta0 * __pyx_v_alpha)));
+  __pyx_v_t = (1.0 / (__pyx_v_eta0 * __pyx_v_alpha));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
- *     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+ *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch from 0 <= epoch < 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 = 234; __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 = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_2);
+  __pyx_t_1 = PyObject_Call(__pyx_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
   __Pyx_DECREF(__pyx_v_t_start);
-  __pyx_v_t_start = __pyx_t_3;
-  __pyx_t_3 = 0;
+  __pyx_v_t_start = __pyx_t_1;
+  __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:             # <<<<<<<<<<<<<<
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  */
-  __pyx_t_9 = __pyx_v_n_iter;
-  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
+  __pyx_t_7 = __pyx_v_n_iter;
+  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_7; __pyx_v_epoch++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:             # <<<<<<<<<<<<<<
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  */
-    __pyx_t_8 = (__pyx_v_verbose > 0);
-    if (__pyx_t_8) {
+    __pyx_t_6 = (__pyx_v_verbose > 0);
+    if (__pyx_t_6) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.shuffle(index)
  */
-      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = PyNumber_Remainder(__pyx_kp_34, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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 = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L9;
     }
     __pyx_L9:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  */
-    __pyx_t_13 = __pyx_v_shuffle;
-    if (__pyx_t_13) {
+    __pyx_t_11 = __pyx_v_shuffle;
+    if (__pyx_t_11) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.shuffle(index)             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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 = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_1);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_1, __pyx_kp_random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __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__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_kp_shuffle); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __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 = 239; __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 = 242; __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_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       goto __pyx_L10;
     }
     __pyx_L10:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
  *         if shuffle:
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:             # <<<<<<<<<<<<<<
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  */
-    __pyx_t_14 = __pyx_v_n_samples;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
+    __pyx_t_12 = __pyx_v_n_samples;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]             # <<<<<<<<<<<<<<
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  */
-      __pyx_t_15 = __pyx_v_i;
-      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(__pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index));
+      __pyx_t_13 = __pyx_v_i;
+      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_13, __pyx_bstride_0_index));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -5044,7 +4994,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -5053,17 +5003,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]             # <<<<<<<<<<<<<<
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  */
-      __pyx_t_16 = __pyx_v_sample_idx;
-      __pyx_v_y = (*__Pyx_BufPtrStrided1d(__pyx_t_15sgd_fast_sparse_DOUBLE *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y));
+      __pyx_t_14 = __pyx_v_sample_idx;
+      __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_14, __pyx_bstride_0_Y));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]
  *             eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5072,7 +5022,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -5081,7 +5031,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_p = ((__pyx_f_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);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -5090,7 +5040,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<
@@ -5099,17 +5049,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)
  *             if update != 0:             # <<<<<<<<<<<<<<
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  */
-      __pyx_t_8 = (__pyx_v_update != 0);
-      if (__pyx_t_8) {
+      __pyx_t_6 = (__pyx_v_update != 0);
+      if (__pyx_t_6) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
  *             if update != 0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)             # <<<<<<<<<<<<<<
@@ -5118,17 +5068,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_f_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);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
  */
-        __pyx_t_8 = (__pyx_v_fit_intercept == 1);
-        if (__pyx_t_8) {
+        __pyx_t_6 = (__pyx_v_fit_intercept == 1);
+        if (__pyx_t_6) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
+          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01             # <<<<<<<<<<<<<<
@@ -5143,17 +5093,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L13:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
  *                 wscale *= (1 - rho * eta * alpha)
  *                 if wscale < 1e-9:
  */
-      __pyx_t_8 = (__pyx_v_penalty_type != 1);
-      if (__pyx_t_8) {
+      __pyx_t_6 = (__pyx_v_penalty_type != 1);
+      if (__pyx_t_6) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
  *                 wscale *= (1 - rho * eta * alpha)             # <<<<<<<<<<<<<<
@@ -5162,58 +5112,58 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
  *             if penalty_type != L1:
  *                 wscale *= (1 - rho * eta * alpha)
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
  *                     w *= wscale
  *                     wscale = 1.0
  */
-        __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09);
-        if (__pyx_t_8) {
+        __pyx_t_6 = (__pyx_v_wscale < 1.0000000000000001e-09);
+        if (__pyx_t_6) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
+          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
  *                 wscale *= (1 - rho * eta * alpha)
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
- *             if penalty_type == L2 or penalty_type == ELASTICNET:
- */
-          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_17 = ((PyArrayObject *)__pyx_t_3);
+ *             if penalty_type == L1 or penalty_type == ELASTICNET:
+ */
+          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_2 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_2);
+          if (!(__Pyx_TypeTest(__pyx_2, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_15 = ((PyArrayObject *)__pyx_2);
           {
             __Pyx_BufFmt_StackElem __pyx_stack[1];
             __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-            __pyx_t_13 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-            if (unlikely(__pyx_t_13 < 0)) {
-              PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10);
-              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_t_11 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+            if (unlikely(__pyx_t_11 < 0)) {
+              PyErr_Fetch(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);
+              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_9); Py_XDECREF(__pyx_t_8);
                 __Pyx_RaiseBufferFallbackError();
               } else {
-                PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10);
+                PyErr_Restore(__pyx_t_10, __pyx_t_9, __pyx_t_8);
               }
             }
             __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
             __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_t_17 = 0;
+          __pyx_t_15 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
-          __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
-          __pyx_t_3 = 0;
+          __pyx_v_w = ((PyArrayObject *)__pyx_2);
+          __pyx_2 = 0;
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
+          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
- *             if penalty_type == L2 or penalty_type == ELASTICNET:
- *                 u += ((1.0 - rho) * eta * alpha)
+ *             if penalty_type == L1 or penalty_type == ELASTICNET:
+ *                 u += ((1 - rho) * eta * alpha)
  */
           __pyx_v_wscale = 1.0;
           goto __pyx_L16;
@@ -5223,39 +5173,48 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L15:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
  *                     w *= wscale
  *                     wscale = 1.0
- *             if penalty_type == L2 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
- *                 u += ((1.0 - rho) * eta * alpha)
- *                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+ *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
+ *                 u += ((1 - rho) * eta * alpha)
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
  */
       switch (__pyx_v_penalty_type) {
-        case 2:
+        case 1:
         case 3:
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
  *                     wscale = 1.0
- *             if penalty_type == L2 or penalty_type == ELASTICNET:
- *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
- *                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+ *             if penalty_type == L1 or penalty_type == ELASTICNET:
+ *                 u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
+ *             t += 1
+ */
+        __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+
+        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
+ *             if penalty_type == L1 or penalty_type == ELASTICNET:
+ *                 u += ((1 - rho) * eta * alpha)
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
  *             t += 1
+ *             count += 1
  */
-        __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+        __pyx_f_15sgd_fast_sparse_l1penalty(__pyx_v_w_data_ptr, __pyx_v_wscale, __pyx_v_q_data_ptr, __pyx_v_X_indices_ptr, __pyx_v_offset, __pyx_v_xnnz, __pyx_v_u);
         break;
       }
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
- *                 u += ((1.0 - rho) * eta * alpha)
- *                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
+ *                 u += ((1 - rho) * eta * alpha)
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
  *             count += 1
  *         # report epoche information
  */
       __pyx_v_t += 1;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
- *                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
  *         # report epoche information
@@ -5264,312 +5223,320 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_v_count += 1;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
  *             count += 1
  *         # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count))
+ *             print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm, w.nonzero()[0].shape[0],
  */
-    __pyx_t_8 = (__pyx_v_verbose > 0);
-    if (__pyx_t_8) {
+    __pyx_t_6 = (__pyx_v_verbose > 0);
+    if (__pyx_t_6) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
  *         # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count))
- *             print("Total training time: %.2f seconds." % (time()-t_start))
+ *             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 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_1);
+      __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_dot); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __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_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __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 = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __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_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 = 270; __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 = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 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 = 267; __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 = 270; __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 = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_v_wnorm = sqrt(__pyx_t_18);
+      __pyx_t_16 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_v_wnorm = sqrt(__pyx_t_16);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
  *         if verbose > 0:
  *             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, sumloss / count))             # <<<<<<<<<<<<<<
+ *             print("Norm: %.2f, NNZs: %d, 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_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __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 = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_kp_nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble((((double)__pyx_v_sumloss) / ((double)__pyx_v_count))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_2 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __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 = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_5);
-      __Pyx_GIVEREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_1);
+      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+      __pyx_1 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_1);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
+ *             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, sumloss / count))             # <<<<<<<<<<<<<<
+ *             print("Total training time: %.2f seconds." % (time()-t_start))
+ * 
+ */
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_3 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_17 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_17);
+      __pyx_t_18 = PyTuple_New(5); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_18));
+      PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_2);
+      PyTuple_SET_ITEM(__pyx_t_18, 1, __pyx_1);
+      __Pyx_GIVEREF(__pyx_1);
+      PyTuple_SET_ITEM(__pyx_t_18, 2, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_4 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_5 = 0;
+      PyTuple_SET_ITEM(__pyx_t_18, 3, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_18, 4, __pyx_t_17);
+      __Pyx_GIVEREF(__pyx_t_17);
       __pyx_t_1 = 0;
+      __pyx_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
- *             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, sumloss / count))
+      __pyx_t_3 = 0;
+      __pyx_t_17 = 0;
+      __pyx_t_17 = PyNumber_Remainder(__pyx_kp_35, ((PyObject *)__pyx_t_18)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_17);
+      __Pyx_DECREF(((PyObject *)__pyx_t_18)); __pyx_t_18 = 0;
+      if (__Pyx_PrintOne(__pyx_t_17) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
+ *             print("Norm: %.2f, NNZs: %d, 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))             # <<<<<<<<<<<<<<
  * 
  *         # 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 = 269; __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 = 269; __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 = 269; __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 = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_2);
+      __pyx_t_17 = PyObject_Call(__pyx_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_17);
+      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+      __pyx_t_18 = PyNumber_Subtract(__pyx_t_17, __pyx_v_t_start); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_18);
+      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+      __pyx_t_17 = PyNumber_Remainder(__pyx_kp_36, __pyx_t_18); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_17);
+      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+      if (__Pyx_PrintOne(__pyx_t_17) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       goto __pyx_L17;
     }
     __pyx_L17:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
  * 
  *         # 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 = 272; __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 = 272; __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 = 272; __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
+    __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    __pyx_t_17 = PyObject_GetAttr(__pyx_1, __pyx_kp_any); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_17);
+    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_2);
+    __pyx_t_18 = PyObject_GetAttr(__pyx_2, __pyx_kp_isinf); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_18);
+    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
     __Pyx_INCREF(((PyObject *)__pyx_v_w));
-    PyTuple_SET_ITEM(__pyx_t_19, 0, ((PyObject *)__pyx_v_w));
+    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-    __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
-    __Pyx_GIVEREF(__pyx_t_5);
-    __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
+    __pyx_t_2 = PyObject_Call(__pyx_t_18, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+    __Pyx_DECREF(((PyObject *)__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 = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+    __Pyx_GIVEREF(__pyx_t_2);
+    __pyx_t_2 = 0;
+    __pyx_t_2 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    if (!__pyx_t_8) {
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!__pyx_t_6) {
+      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_1);
+      __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_2);
+      __pyx_t_3 = PyObject_GetAttr(__pyx_2, __pyx_kp_isnan); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_17));
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
+      PyTuple_SET_ITEM(__pyx_t_17, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_18 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_18);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
+      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_17));
+      PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_18);
+      __Pyx_GIVEREF(__pyx_t_18);
+      __pyx_t_18 = 0;
+      __pyx_t_18 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_18);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_DECREF(__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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (!__pyx_t_20) {
-        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_1);
-        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __Pyx_DECREF(__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 = 272; __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 = 272; __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 = 272; __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 = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_5);
-          PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
-          __Pyx_GIVEREF(__pyx_t_1);
-          __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_t_23 = __pyx_t_22;
+      __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
+      __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_18); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+      if (!__pyx_t_19) {
+        __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_1);
+        __pyx_t_18 = PyObject_GetAttr(__pyx_1, __pyx_kp_isnan); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_18);
+        __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+        __pyx_t_17 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
+        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_17);
+        __Pyx_GIVEREF(__pyx_t_17);
+        __pyx_t_17 = 0;
+        __pyx_t_17 = PyObject_Call(__pyx_t_18, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
+        __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+        if (!__pyx_t_20) {
+          __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_2);
+          __pyx_t_17 = PyObject_GetAttr(__pyx_2, __pyx_kp_isinf); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_17);
+          __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __pyx_t_18 = PyTuple_New(1); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_18));
+          PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_2);
+          __Pyx_GIVEREF(__pyx_t_2);
+          __pyx_t_2 = 0;
+          __pyx_t_2 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_18), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_2);
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+          __Pyx_DECREF(((PyObject *)__pyx_t_18)); __pyx_t_18 = 0;
+          __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+          __pyx_t_22 = __pyx_t_21;
         } else {
-          __pyx_t_23 = __pyx_t_21;
+          __pyx_t_22 = __pyx_t_20;
         }
-        __pyx_t_21 = __pyx_t_23;
+        __pyx_t_20 = __pyx_t_22;
       } else {
-        __pyx_t_21 = __pyx_t_20;
+        __pyx_t_20 = __pyx_t_19;
       }
-      __pyx_t_20 = __pyx_t_21;
+      __pyx_t_19 = __pyx_t_20;
     } else {
-      __pyx_t_20 = __pyx_t_8;
+      __pyx_t_19 = __pyx_t_6;
     }
-    if (__pyx_t_20) {
+    if (__pyx_t_19) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
  *         # 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.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
-      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_Raise(__pyx_t_5, 0, 0);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __Pyx_INCREF(__pyx_kp_37);
+      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_37);
+      __Pyx_GIVEREF(__pyx_kp_37);
+      __pyx_t_18 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_18);
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+      __Pyx_Raise(__pyx_t_18, 0, 0);
+      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L18;
     }
     __pyx_L18:;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);
+  __pyx_t_18 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_18);
+  __pyx_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_18); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_1);
+  if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
+  __pyx_t_15 = ((PyArrayObject *)__pyx_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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_t_7 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+    if (unlikely(__pyx_t_7 < 0)) {
+      PyErr_Fetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
+      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_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);
         __Pyx_RaiseBufferFallbackError();
       } else {
-        PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
+        PyErr_Restore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
       }
     }
     __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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_17 = 0;
+  __pyx_t_15 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
-  __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
-  __pyx_t_1 = 0;
+  __pyx_v_w = ((PyArrayObject *)__pyx_1);
+  __pyx_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":280
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -5577,29 +5544,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_18 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_18);
+  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_w));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_r = __pyx_t_5;
-  __pyx_t_5 = 0;
+  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_18);
+  __Pyx_GIVEREF(__pyx_t_18);
+  __pyx_t_18 = 0;
+  __pyx_r = ((PyObject *)__pyx_t_2);
+  __pyx_t_2 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
+  __Pyx_XDECREF(__pyx_2);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_19);
+  __Pyx_XDECREF(__pyx_t_17);
+  __Pyx_XDECREF(__pyx_t_18);
   { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
     __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
@@ -5626,110 +5594,105 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_XDECREF((PyObject *)__pyx_v_q);
   __Pyx_DECREF(__pyx_v_t_start);
   __Pyx_DECREF((PyObject *)__pyx_v_w);
-  __Pyx_DECREF((PyObject *)__pyx_v_loss);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_DECREF((PyObject *)__pyx_v_Y);
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":303
- * ##     return y
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
  * 
- * cdef inline double max(DOUBLE a, DOUBLE b):             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
  *     return a if a >= b else b
  * 
  */
 
-static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(__pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_a, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_b) {
+static INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, double __pyx_v_b) {
   double __pyx_r;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_t_1;
-  __Pyx_RefNannySetupContext("max");
+  double __pyx_1;
+  __Pyx_SetupRefcountContext("max");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
  * 
- * cdef inline double max(DOUBLE a, DOUBLE b):
+ * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef inline DOUBLE min(DOUBLE a, DOUBLE b):
+ * cdef inline double min(double a, double b):
  */
   if ((__pyx_v_a >= __pyx_v_b)) {
-    __pyx_t_1 = __pyx_v_a;
+    __pyx_1 = __pyx_v_a;
   } else {
-    __pyx_t_1 = __pyx_v_b;
+    __pyx_1 = __pyx_v_b;
   }
-  __pyx_r = __pyx_t_1;
+  __pyx_r = __pyx_1;
   goto __pyx_L0;
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
  *     return a if a >= b else b
  * 
- * cdef inline DOUBLE min(DOUBLE a, DOUBLE b):             # <<<<<<<<<<<<<<
+ * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
  *     return a if a <= b else b
  * 
  */
 
-static CYTHON_INLINE __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_min(__pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_a, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_b) {
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_t_1;
-  __Pyx_RefNannySetupContext("min");
+static INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, double __pyx_v_b) {
+  double __pyx_r;
+  double __pyx_1;
+  __Pyx_SetupRefcountContext("min");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":307
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
  * 
- * cdef inline DOUBLE min(DOUBLE a, DOUBLE b):
+ * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr,
+ * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  */
   if ((__pyx_v_a <= __pyx_v_b)) {
-    __pyx_t_1 = __pyx_v_a;
+    __pyx_1 = __pyx_v_a;
   } else {
-    __pyx_t_1 = __pyx_v_b;
+    __pyx_1 = __pyx_v_b;
   }
-  __pyx_r = __pyx_t_1;
+  __pyx_r = __pyx_1;
   goto __pyx_L0;
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":289
  *     return a if a <= b else b
  * 
- * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr,             # <<<<<<<<<<<<<<
- *                 INTEGER offset, INTEGER xnnz):
- *     cdef DOUBLE sum = 0.0
+ * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
+ *                 int offset, int xnnz):
+ *     cdef double sum = 0.0
  */
 
-static  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr, __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr, __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz) {
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sum;
+static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double *__pyx_v_X_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz) {
+  double __pyx_v_sum;
   int __pyx_v_j;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r;
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_t_1;
-  __Pyx_RefNannySetupContext("dot");
-
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
- * cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr,
- *                 INTEGER offset, INTEGER xnnz):
- *     cdef DOUBLE sum = 0.0             # <<<<<<<<<<<<<<
+  double __pyx_r;
+  int __pyx_t_1;
+  __Pyx_SetupRefcountContext("dot");
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
+ * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
+ *                 int offset, int xnnz):
+ *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  */
   __pyx_v_sum = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
- *     cdef DOUBLE sum = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
+ *     cdef double sum = 0.0
  *     cdef int j
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
@@ -5738,7 +5701,7 @@ static  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_1
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5748,139 +5711,257 @@ static  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_dot(__pyx_t_1
     __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)]));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":295
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
  * 
- * cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr,
+ * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
  */
   __pyx_r = __pyx_v_sum;
   goto __pyx_L0;
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":297
  *     return sum
  * 
- * cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr,             # <<<<<<<<<<<<<<
- *                 INTEGER *X_indices_ptr, INTEGER offset, INTEGER xnnz, DOUBLE c):
- *     """Scales example x by constant c and adds it to the weight vector w.
+ * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
+ *                 int *X_indices_ptr, int offset, int xnnz, double c):
+ *     """Scales example x by constant c and adds it to the weight vector w.
+ */
+
+static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, double *__pyx_v_X_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz, double __pyx_v_c) {
+  int __pyx_v_j;
+  int __pyx_v_idx;
+  double __pyx_v_val;
+  double __pyx_v_innerprod;
+  double __pyx_v_xsqnorm;
+  double __pyx_r;
+  int __pyx_t_1;
+  __Pyx_SetupRefcountContext("add");
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
+ *     cdef int idx
+ *     cdef double val
+ *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
+ *     cdef double xsqnorm = 0.0
+ *     for j from 0 <= j < xnnz:
+ */
+  __pyx_v_innerprod = 0.0;
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":305
+ *     cdef double val
+ *     cdef double innerprod = 0.0
+ *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
+ *     for j from 0 <= j < xnnz:
+ *         idx = X_indices_ptr[offset + j]
+ */
+  __pyx_v_xsqnorm = 0.0;
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306
+ *     cdef double innerprod = 0.0
+ *     cdef double xsqnorm = 0.0
+ *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
+ *         idx = X_indices_ptr[offset + j]
+ *         val = X_data_ptr[offset + j]
+ */
+  __pyx_t_1 = __pyx_v_xnnz;
+  for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
+
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":307
+ *     cdef double xsqnorm = 0.0
+ *     for j from 0 <= j < xnnz:
+ *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
+ *         val = X_data_ptr[offset + j]
+ *         innerprod += (w_data_ptr[idx] * val)
+ */
+    __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
+
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":308
+ *     for j from 0 <= j < xnnz:
+ *         idx = X_indices_ptr[offset + j]
+ *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
+ *         innerprod += (w_data_ptr[idx] * val)
+ *         xsqnorm += (val * val)
+ */
+    __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
+
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+ *         idx = X_indices_ptr[offset + j]
+ *         val = X_data_ptr[offset + j]
+ *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
+ *         xsqnorm += (val * val)
+ *         w_data_ptr[idx] += val * (c / wscale)
+ */
+    __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
+
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":310
+ *         val = X_data_ptr[offset + j]
+ *         innerprod += (w_data_ptr[idx] * val)
+ *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
+ *         w_data_ptr[idx] += val * (c / wscale)
+ *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+ */
+    __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
+
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
+ *         innerprod += (w_data_ptr[idx] * val)
+ *         xsqnorm += (val * val)
+ *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
+ *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+ * 
+ */
+    (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
+  }
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
+ *         xsqnorm += (val * val)
+ *         w_data_ptr[idx] += val * (c / wscale)
+ *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
+ * 
+ * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
+ */
+  __pyx_r = (((__pyx_v_xsqnorm * __pyx_v_c) * __pyx_v_c) + (((2.0 * __pyx_v_innerprod) * __pyx_v_wscale) * __pyx_v_c));
+  goto __pyx_L0;
+
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_FinishRefcountContext();
+  return __pyx_r;
+}
+
+/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+ *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+ * 
+ * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
+ *                     int *X_indices_ptr, int offset, int xnnz, double u):
+ *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+ */
+
+static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, double *__pyx_v_q_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz, double __pyx_v_u) {
+  double __pyx_v_z;
+  int __pyx_v_j;
+  int __pyx_v_idx;
+  int __pyx_t_1;
+  int __pyx_t_2;
+  __Pyx_SetupRefcountContext("l1penalty");
+
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
+ *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+ *     """
+ *     cdef double z = 0.0             # <<<<<<<<<<<<<<
+ *     cdef int j = 0
+ *     cdef int idx = 0
  */
+  __pyx_v_z = 0.0;
 
-static  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_f_15sgd_fast_sparse_add(__pyx_t_15sgd_fast_sparse_DOUBLE *__pyx_v_w_data_ptr, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale, __pyx_t_15sgd_fast_sparse_FLOAT *__pyx_v_X_data_ptr, __pyx_t_15sgd_fast_sparse_INTEGER *__pyx_v_X_indices_ptr, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_offset, __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_xnnz, __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_c) {
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_j;
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_v_idx;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_val;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_innerprod;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_xsqnorm;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_r;
-  __pyx_t_15sgd_fast_sparse_INTEGER __pyx_t_1;
-  __Pyx_RefNannySetupContext("add");
-
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324
- *     cdef INTEGER idx
- *     cdef DOUBLE val
- *     cdef DOUBLE innerprod = 0.0             # <<<<<<<<<<<<<<
- *     cdef DOUBLE xsqnorm = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
+ *     """
+ *     cdef double z = 0.0
+ *     cdef int j = 0             # <<<<<<<<<<<<<<
+ *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:
  */
-  __pyx_v_innerprod = 0.0;
+  __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
- *     cdef DOUBLE val
- *     cdef DOUBLE innerprod = 0.0
- *     cdef DOUBLE xsqnorm = 0.0             # <<<<<<<<<<<<<<
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":320
+ *     cdef double z = 0.0
+ *     cdef int j = 0
+ *     cdef int idx = 0             # <<<<<<<<<<<<<<
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  */
-  __pyx_v_xsqnorm = 0.0;
+  __pyx_v_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
- *     cdef DOUBLE innerprod = 0.0
- *     cdef DOUBLE xsqnorm = 0.0
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":321
+ *     cdef int j = 0
+ *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
  *         idx = X_indices_ptr[offset + j]
- *         val = X_data_ptr[offset + j]
+ *         z = w_data_ptr[idx]
  */
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
- *     cdef DOUBLE xsqnorm = 0.0
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":322
+ *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
- *         val = X_data_ptr[offset + j]
- *         innerprod += (w_data_ptr[idx] * val)
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":323
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
- *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
- *         innerprod += (w_data_ptr[idx] * val)
- *         xsqnorm += (val * val)
+ *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
  */
-    __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
+    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324
  *         idx = X_indices_ptr[offset + j]
- *         val = X_data_ptr[offset + j]
- *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
- *         xsqnorm += (val * val)
- *         w_data_ptr[idx] += val * (c / wscale)
- */
-    __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ */
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
+    if (__pyx_t_2) {
+
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )             # <<<<<<<<<<<<<<
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+ */
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      goto __pyx_L5;
+    }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
- *         val = X_data_ptr[offset + j]
- *         innerprod += (w_data_ptr[idx] * val)
- *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
- *         w_data_ptr[idx] += val * (c / wscale)
- *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
  */
-    __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
+    if (__pyx_t_2) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
- *         innerprod += (w_data_ptr[idx] * val)
- *         xsqnorm += (val * val)
- *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
- *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )             # <<<<<<<<<<<<<<
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
  * 
  */
-    if (unlikely(__pyx_v_wscale == 0)) {
-      PyErr_Format(PyExc_ZeroDivisionError, "float division");
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      goto __pyx_L5;
     }
-    (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
-  }
+    __pyx_L5:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
- *         xsqnorm += (val * val)
- *         w_data_ptr[idx] += val * (c / wscale)
- *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
+    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
  * 
- * ## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
  */
-  __pyx_r = (((__pyx_v_xsqnorm * __pyx_v_c) * __pyx_v_c) + (((2.0 * __pyx_v_innerprod) * __pyx_v_wscale) * __pyx_v_c));
-  goto __pyx_L0;
+    (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
+  }
 
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_WriteUnraisable("sgd_fast_sparse.add");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  __Pyx_FinishRefcountContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":187
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":65
  *         # experimental exception made for __getbuffer__ and __releasebuffer__
  *         # -- the details of this may change.
  *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
@@ -5902,21 +5983,18 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   int __pyx_v_hasfields;
   int __pyx_r;
   int __pyx_t_1;
-  int __pyx_t_2;
-  int __pyx_t_3;
-  PyObject *__pyx_t_4 = NULL;
-  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  int __pyx_t_4;
+  int __pyx_t_5;
   int __pyx_t_6;
-  int __pyx_t_7;
-  int __pyx_t_8;
-  char *__pyx_t_9;
-  __Pyx_RefNannySetupContext("__getbuffer__");
+  char *__pyx_t_7;
+  __Pyx_SetupRefcountContext("__getbuffer__");
   if (__pyx_v_info == NULL) return 0;
   __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(__pyx_v_info->obj);
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":193
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":71
  *             # of flags
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -5925,7 +6003,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":194
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":72
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -5934,7 +6012,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":196
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":74
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)
  * 
  *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
@@ -5943,7 +6021,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":198
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":76
  *             ndim = PyArray_NDIM(self)
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -5953,7 +6031,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":199
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":77
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 copy_shape = 1             # <<<<<<<<<<<<<<
@@ -5965,7 +6043,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":201
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":79
  *                 copy_shape = 1
  *             else:
  *                 copy_shape = 0             # <<<<<<<<<<<<<<
@@ -5976,100 +6054,96 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":203
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":81
  *                 copy_shape = 0
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not C contiguous")
+ *                 raise ValueError("ndarray is not C contiguous")
  */
-  __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
-  if (__pyx_t_1) {
+  if (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS)) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":204
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":82
  * 
  *             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")
+ *                 raise ValueError("ndarray is not C contiguous")
  * 
  */
-    __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
-    __pyx_t_3 = __pyx_t_2;
+    __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
   } else {
-    __pyx_t_3 = __pyx_t_1;
+    __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
   }
-  if (__pyx_t_3) {
+  if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":205
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":83
  *             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")             # <<<<<<<<<<<<<<
+ *                 raise ValueError("ndarray is not C contiguous")             # <<<<<<<<<<<<<<
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
-    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_Raise(__pyx_t_5, 0, 0);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+    __Pyx_INCREF(__pyx_kp_1);
+    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_1);
+    __Pyx_GIVEREF(__pyx_kp_1);
+    __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+    __Pyx_Raise(__pyx_t_3, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":207
- *                 raise ValueError(u"ndarray is not C contiguous")
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":85
+ *                 raise ValueError("ndarray is not C contiguous")
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ *                 raise ValueError("ndarray is not Fortran contiguous")
  */
-  __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
-  if (__pyx_t_3) {
+  if (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS)) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":208
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":86
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+ *                 raise ValueError("ndarray is not Fortran contiguous")
  * 
  */
     __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
-    __pyx_t_2 = __pyx_t_1;
   } else {
-    __pyx_t_2 = __pyx_t_3;
+    __pyx_t_1 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
   }
-  if (__pyx_t_2) {
+  if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":209
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":87
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+ *                 raise ValueError("ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
  * 
  *             info.buf = PyArray_DATA(self)
  */
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
-    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
-    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __Pyx_Raise(__pyx_t_4, 0, 0);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __Pyx_INCREF(__pyx_kp_2);
+    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_2);
+    __Pyx_GIVEREF(__pyx_kp_2);
+    __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+    __Pyx_Raise(__pyx_t_2, 0, 0);
+    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L7;
   }
   __pyx_L7:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":211
- *                 raise ValueError(u"ndarray is not Fortran contiguous")
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":89
+ *                 raise ValueError("ndarray is not Fortran contiguous")
  * 
  *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
  *             info.ndim = ndim
@@ -6077,7 +6151,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":212
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":90
  * 
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim             # <<<<<<<<<<<<<<
@@ -6086,17 +6160,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":213
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":91
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim
  *             if copy_shape:             # <<<<<<<<<<<<<<
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  */
-  __pyx_t_6 = __pyx_v_copy_shape;
-  if (__pyx_t_6) {
+  __pyx_t_4 = __pyx_v_copy_shape;
+  if (__pyx_t_4) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":216
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":94
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<
@@ -6105,7 +6179,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":217
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":95
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
@@ -6114,18 +6188,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":218
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":96
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):             # <<<<<<<<<<<<<<
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  */
-    __pyx_t_6 = __pyx_v_ndim;
-    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
-      __pyx_v_i = __pyx_t_7;
+    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_v_ndim; __pyx_t_4+=1) {
+      __pyx_v_i = __pyx_t_4;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":219
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":97
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
@@ -6134,7 +6207,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
       (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":220
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":98
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
@@ -6147,7 +6220,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":222
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":100
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  *             else:
  *                 info.strides = PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
@@ -6156,7 +6229,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":223
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":101
  *             else:
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)             # <<<<<<<<<<<<<<
@@ -6167,7 +6240,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L8:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":224
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":102
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
@@ -6176,7 +6249,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->suboffsets = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":225
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":103
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
@@ -6185,7 +6258,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":226
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":104
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)
  *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
@@ -6194,7 +6267,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":229
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":107
  * 
  *             cdef int t
  *             cdef char* f = NULL             # <<<<<<<<<<<<<<
@@ -6203,7 +6276,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_f = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":230
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":108
  *             cdef int t
  *             cdef char* f = NULL
  *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
@@ -6213,7 +6286,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
   __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":234
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":112
  *             cdef int offset
  * 
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
@@ -6222,23 +6295,21 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":236
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":114
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
  * 
  *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
  *                 # do not call releasebuffer
  *                 info.obj = None
  */
-  __pyx_t_2 = (!__pyx_v_hasfields);
-  if (__pyx_t_2) {
-    __pyx_t_3 = (!__pyx_v_copy_shape);
-    __pyx_t_1 = __pyx_t_3;
+  if ((!__pyx_v_hasfields)) {
+    __pyx_t_1 = (!__pyx_v_copy_shape);
   } else {
-    __pyx_t_1 = __pyx_t_2;
+    __pyx_t_1 = (!__pyx_v_hasfields);
   }
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":238
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":116
  *             if not hasfields and not copy_shape:
  *                 # do not call releasebuffer
  *                 info.obj = None             # <<<<<<<<<<<<<<
@@ -6254,7 +6325,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":241
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":119
  *             else:
  *                 # need to call releasebuffer
  *                 info.obj = self             # <<<<<<<<<<<<<<
@@ -6269,7 +6340,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L11:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":243
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":121
  *                 info.obj = self
  * 
  *             if not hasfields:             # <<<<<<<<<<<<<<
@@ -6279,7 +6350,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = (!__pyx_v_hasfields);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":244
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":122
  * 
  *             if not hasfields:
  *                 t = descr.type_num             # <<<<<<<<<<<<<<
@@ -6288,322 +6359,286 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_t = __pyx_v_descr->type_num;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":245
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":123
  *             if not hasfields:
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
+ *                     raise ValueError("Non-native byte order not supported")
  */
-    __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
-    if (__pyx_t_1) {
-      __pyx_t_2 = __pyx_v_little_endian;
+    if ((__pyx_v_descr->byteorder == '>')) {
+      __pyx_t_1 = __pyx_v_little_endian;
     } else {
-      __pyx_t_2 = __pyx_t_1;
+      __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
     }
-    if (!__pyx_t_2) {
+    if (!__pyx_t_1) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":246
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":124
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
- *                     raise ValueError(u"Non-native byte order not supported")
+ *                     raise ValueError("Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  */
-      __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
-      if (__pyx_t_1) {
-        __pyx_t_3 = (!__pyx_v_little_endian);
-        __pyx_t_8 = __pyx_t_3;
+      if ((__pyx_v_descr->byteorder == '<')) {
+        __pyx_t_5 = (!__pyx_v_little_endian);
       } else {
-        __pyx_t_8 = __pyx_t_1;
+        __pyx_t_5 = (__pyx_v_descr->byteorder == '<');
       }
-      __pyx_t_1 = __pyx_t_8;
+      __pyx_t_6 = __pyx_t_5;
     } else {
-      __pyx_t_1 = __pyx_t_2;
+      __pyx_t_6 = __pyx_t_1;
     }
-    if (__pyx_t_1) {
+    if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":247
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":125
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *                     raise ValueError("Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  */
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
-      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_Raise(__pyx_t_5, 0, 0);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+      __Pyx_INCREF(__pyx_kp_5);
+      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_5);
+      __Pyx_GIVEREF(__pyx_kp_5);
+      __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+      __Pyx_Raise(__pyx_t_3, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":248
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":126
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError(u"Non-native byte order not supported")
+ *                     raise ValueError("Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__b;
-      goto __pyx_L14;
-    }
+    switch (__pyx_v_t) {
+      case NPY_BYTE:
+      __pyx_v_f = __pyx_k_6;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":249
- *                     raise ValueError(u"Non-native byte order not supported")
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":127
+ *                     raise ValueError("Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__B;
-      goto __pyx_L14;
-    }
+      case NPY_UBYTE:
+      __pyx_v_f = __pyx_k_7;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":250
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":128
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__h;
-      goto __pyx_L14;
-    }
+      case NPY_SHORT:
+      __pyx_v_f = __pyx_k_8;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":251
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":129
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__H;
-      goto __pyx_L14;
-    }
+      case NPY_USHORT:
+      __pyx_v_f = __pyx_k_9;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":252
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":130
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_INT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__i;
-      goto __pyx_L14;
-    }
+      case NPY_INT:
+      __pyx_v_f = __pyx_k_10;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":253
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":131
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_UINT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__I;
-      goto __pyx_L14;
-    }
+      case NPY_UINT:
+      __pyx_v_f = __pyx_k_11;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":254
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":132
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_LONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__l;
-      goto __pyx_L14;
-    }
+      case NPY_LONG:
+      __pyx_v_f = __pyx_k_12;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":255
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":133
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__L;
-      goto __pyx_L14;
-    }
+      case NPY_ULONG:
+      __pyx_v_f = __pyx_k_13;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":256
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":134
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__q;
-      goto __pyx_L14;
-    }
+      case NPY_LONGLONG:
+      __pyx_v_f = __pyx_k_14;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":257
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":135
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Q;
-      goto __pyx_L14;
-    }
+      case NPY_ULONGLONG:
+      __pyx_v_f = __pyx_k_15;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":258
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":136
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__f;
-      goto __pyx_L14;
-    }
+      case NPY_FLOAT:
+      __pyx_v_f = __pyx_k_16;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":259
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":137
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__d;
-      goto __pyx_L14;
-    }
+      case NPY_DOUBLE:
+      __pyx_v_f = __pyx_k_17;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":260
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":138
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__g;
-      goto __pyx_L14;
-    }
+      case NPY_LONGDOUBLE:
+      __pyx_v_f = __pyx_k_18;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":261
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":139
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zf;
-      goto __pyx_L14;
-    }
+      case NPY_CFLOAT:
+      __pyx_v_f = __pyx_k_19;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":262
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":140
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zd;
-      goto __pyx_L14;
-    }
+      case NPY_CDOUBLE:
+      __pyx_v_f = __pyx_k_20;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":263
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":141
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zg;
-      goto __pyx_L14;
-    }
+      case NPY_CLONGDOUBLE:
+      __pyx_v_f = __pyx_k_21;
+      break;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":264
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":142
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
  *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
  */
-    __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__O;
-      goto __pyx_L14;
-    }
-    /*else*/ {
+      case NPY_OBJECT:
+      __pyx_v_f = __pyx_k_22;
+      break;
+      default:
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":266
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":144
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *                 info.format = f
  *                 return
  */
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_Raise(__pyx_t_4, 0, 0);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_2 = PyNumber_Remainder(__pyx_kp_23, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
+      __Pyx_GIVEREF(__pyx_t_2);
+      __pyx_t_2 = 0;
+      __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __Pyx_Raise(__pyx_t_2, 0, 0);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      break;
     }
-    __pyx_L14:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":267
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":145
  *                 else:
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f             # <<<<<<<<<<<<<<
  *                 return
  *             else:
  */
     __pyx_v_info->format = __pyx_v_f;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":268
- *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":146
+ *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f
  *                 return             # <<<<<<<<<<<<<<
  *             else:
@@ -6615,7 +6650,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":270
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":148
  *                 return
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
@@ -6624,7 +6659,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = ((char *)malloc(255));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":271
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":149
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
@@ -6633,7 +6668,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     (__pyx_v_info->format[0]) = '^';
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":272
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":150
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment
  *                 offset = 0             # <<<<<<<<<<<<<<
@@ -6642,17 +6677,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_offset = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":275
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":153
  *                 f = _util_dtypestring(descr, info.format + 1,
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)             # <<<<<<<<<<<<<<
  *                 f[0] = 0 # Terminate format string
  * 
  */
-    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_9;
+    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_7;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":276
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":154
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)
  *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<
@@ -6666,8 +6701,8 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
   __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
   __pyx_r = -1;
   __Pyx_GOTREF(__pyx_v_info->obj);
@@ -6680,12 +6715,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L2:;
   __Pyx_XDECREF((PyObject *)__pyx_v_descr);
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":278
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":156
  *                 f[0] = 0 # Terminate format string
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
@@ -6696,10 +6730,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
 static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
 static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
   int __pyx_t_1;
-  __Pyx_RefNannySetupContext("__releasebuffer__");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
+  int __pyx_t_2;
+  __Pyx_SetupRefcountContext("__releasebuffer__");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":279
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":157
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
@@ -6709,7 +6743,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":280
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":158
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
@@ -6721,244 +6755,48 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":281
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":159
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
  *                 stdlib.free(info.strides)
  *                 # info.shape was stored after info.strides in the same block
  */
-  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_1) {
+  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_2) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":282
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":160
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
  *                 # info.shape was stored after info.strides in the same block
  * 
  */
-    free(__pyx_v_info->strides);
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
-
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":755
- * ctypedef npy_cdouble     complex_t
- * 
- * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(1, a)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
-  PyObject *__pyx_r = NULL;
-  PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1");
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":756
- * 
- * cdef inline object PyArray_MultiIterNew1(a):
- *     return PyArray_MultiIterNew(1, a)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":758
- *     return PyArray_MultiIterNew(1, a)
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(2, a, b)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
-  PyObject *__pyx_r = NULL;
-  PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2");
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":759
- * 
- * cdef inline object PyArray_MultiIterNew2(a, b):
- *     return PyArray_MultiIterNew(2, a, b)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":761
- *     return PyArray_MultiIterNew(2, a, b)
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(3, a, b,  c)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
-  PyObject *__pyx_r = NULL;
-  PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3");
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":762
- * 
- * cdef inline object PyArray_MultiIterNew3(a, b, c):
- *     return PyArray_MultiIterNew(3, a, b,  c)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":764
- *     return PyArray_MultiIterNew(3, a, b,  c)
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(4, a, b, c,  d)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
-  PyObject *__pyx_r = NULL;
-  PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4");
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":765
- * 
- * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
- *     return PyArray_MultiIterNew(4, a, b, c,  d)             # <<<<<<<<<<<<<<
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":767
- *     return PyArray_MultiIterNew(4, a, b, c,  d)
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
- *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
- * 
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
-  PyObject *__pyx_r = NULL;
-  PyObject *__pyx_t_1 = NULL;
-  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5");
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":768
- * 
- * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
- *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)             # <<<<<<<<<<<<<<
- * 
- * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
- */
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
+    free(__pyx_v_info->strides);
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
+  __Pyx_FinishRefcountContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":770
- *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":277
+ * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
  *     # Recursive utility function used in __getbuffer__ to get format
  *     # string. The new location in the format string is returned.
  */
 
-static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
+static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
   PyArray_Descr *__pyx_v_child;
+  PyObject *__pyx_v_i;
   int __pyx_v_endian_detector;
   int __pyx_v_little_endian;
-  PyObject *__pyx_v_fields;
-  PyObject *__pyx_v_childname;
   PyObject *__pyx_v_new_offset;
   PyObject *__pyx_v_t;
   char *__pyx_r;
+  PyObject *__pyx_1 = 0;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
@@ -6967,195 +6805,199 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   int __pyx_t_6;
   int __pyx_t_7;
   int __pyx_t_8;
-  int __pyx_t_9;
-  char *__pyx_t_10;
-  __Pyx_RefNannySetupContext("_util_dtypestring");
-  __Pyx_INCREF((PyObject *)__pyx_v_descr);
+  char *__pyx_t_9;
+  __Pyx_SetupRefcountContext("_util_dtypestring");
   __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);
-  __pyx_v_fields = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
-  __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_v_i = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
   __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":777
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":284
  *     cdef int delta_offset
  *     cdef tuple i
  *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)
- *     cdef tuple fields
+ * 
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":778
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":285
  *     cdef tuple i
  *     cdef int endian_detector = 1
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
- *     cdef tuple fields
  * 
+ *     for i in descr.fields.itervalues():
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":781
- *     cdef tuple fields
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":287
+ *     cdef bint little_endian = ((&endian_detector)[0] != 0)
  * 
- *     for childname in descr.names:             # <<<<<<<<<<<<<<
- *         fields = descr.fields[childname]
- *         child, new_offset = fields
+ *     for i in descr.fields.itervalues():             # <<<<<<<<<<<<<<
+ *         child = i[0]
+ *         new_offset = i[1]
  */
-  if (likely(((PyObject *)__pyx_v_descr->names) != Py_None)) {
-    __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);
+  __pyx_t_2 = PyObject_GetAttr(__pyx_v_descr->fields, __pyx_kp_itervalues); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+    __pyx_t_1 = 0; __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2);
   } else {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
   }
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   for (;;) {
-    if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    __Pyx_DECREF(__pyx_v_childname);
-    __pyx_v_childname = __pyx_t_3;
+    if (likely(PyList_CheckExact(__pyx_t_2))) {
+      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
+      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    } else {
+      __pyx_t_3 = PyIter_Next(__pyx_t_2);
+      if (!__pyx_t_3) {
+        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        break;
+      }
+      __Pyx_GOTREF(__pyx_t_3);
+    }
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3)) || (__pyx_t_3) == Py_None || (PyErr_Format(PyExc_TypeError, "Expected tuple, got %s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(((PyObject *)__pyx_v_i));
+    __pyx_v_i = ((PyObject *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":782
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":288
  * 
- *     for childname in descr.names:
- *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
- *         child, new_offset = fields
+ *     for i in descr.fields.itervalues():
+ *         child = i[0]             # <<<<<<<<<<<<<<
+ *         new_offset = i[1]
  * 
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(((PyObject *)__pyx_v_fields));
-    __pyx_v_fields = ((PyObject *)__pyx_t_3);
-    __pyx_t_3 = 0;
+    __pyx_1 = __Pyx_GetItemInt_Tuple(((PyObject *)__pyx_v_i), 0, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_dtype))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(((PyObject *)__pyx_v_child));
+    __pyx_v_child = ((PyArray_Descr *)__pyx_1);
+    __pyx_1 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":783
- *     for childname in descr.names:
- *         fields = descr.fields[childname]
- *         child, new_offset = fields             # <<<<<<<<<<<<<<
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":289
+ *     for i in descr.fields.itervalues():
+ *         child = i[0]
+ *         new_offset = i[1]             # <<<<<<<<<<<<<<
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
  */
-    if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {
-      PyObject* tuple = ((PyObject *)__pyx_v_fields);
-      __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);
-      __Pyx_DECREF(((PyObject *)__pyx_v_child));
-      __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);
-      __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_v_new_offset);
-      __pyx_v_new_offset = __pyx_t_4;
-      __pyx_t_4 = 0;
-    } else {
-      __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
+    __pyx_1 = __Pyx_GetItemInt_Tuple(((PyObject *)__pyx_v_i), 1, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_1);
+    __Pyx_DECREF(__pyx_v_new_offset);
+    __pyx_v_new_offset = __pyx_1;
+    __pyx_1 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":785
- *         child, new_offset = fields
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":291
+ *         new_offset = i[1]
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+ *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")
  * 
  */
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":786
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":292
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+ *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  */
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));
-      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_9));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));
-      __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_Raise(__pyx_t_3, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+      __Pyx_INCREF(__pyx_kp_25);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_25);
+      __Pyx_GIVEREF(__pyx_kp_25);
+      __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_4, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":788
- *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":294
+ *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")
  * 
  *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
  *             (child.byteorder == '<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")
+ *             raise ValueError("Non-native byte order not supported")
  */
-    __pyx_t_6 = (__pyx_v_child->byteorder == '>');
-    if (__pyx_t_6) {
-      __pyx_t_7 = __pyx_v_little_endian;
+    if ((__pyx_v_child->byteorder == '>')) {
+      __pyx_t_6 = __pyx_v_little_endian;
     } else {
-      __pyx_t_7 = __pyx_t_6;
+      __pyx_t_6 = (__pyx_v_child->byteorder == '>');
     }
-    if (!__pyx_t_7) {
+    if (!__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":789
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":295
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError(u"Non-native byte order not supported")
+ *             raise ValueError("Non-native byte order not supported")
  *             # One could encode it in the format string and have Cython
  */
-      __pyx_t_6 = (__pyx_v_child->byteorder == '<');
-      if (__pyx_t_6) {
-        __pyx_t_8 = (!__pyx_v_little_endian);
-        __pyx_t_9 = __pyx_t_8;
+      if ((__pyx_v_child->byteorder == '<')) {
+        __pyx_t_7 = (!__pyx_v_little_endian);
       } else {
-        __pyx_t_9 = __pyx_t_6;
+        __pyx_t_7 = (__pyx_v_child->byteorder == '<');
       }
-      __pyx_t_6 = __pyx_t_9;
+      __pyx_t_8 = __pyx_t_7;
     } else {
-      __pyx_t_6 = __pyx_t_7;
+      __pyx_t_8 = __pyx_t_6;
     }
-    if (__pyx_t_6) {
+    if (__pyx_t_8) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":790
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":296
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):
- *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *             raise ValueError("Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *             # One could encode it in the format string and have Cython
  *             # complain instead, BUT: < and > in format strings also imply
  */
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_7));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+      __Pyx_INCREF(__pyx_kp_28);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_28);
+      __Pyx_GIVEREF(__pyx_kp_28);
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":800
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":306
  * 
  *         # Output padding bytes
  *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
@@ -7163,16 +7005,16 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  *             f += 1
  */
     while (1) {
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (!__pyx_t_6) break;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (!__pyx_t_8) break;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":801
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":307
  *         # Output padding bytes
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
@@ -7181,7 +7023,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       (__pyx_v_f[0]) = 120;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":802
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":308
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7190,7 +7032,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       __pyx_v_f += 1;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":803
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":309
  *             f[0] = 120 # "x"; pad byte
  *             f += 1
  *             offset[0] += 1             # <<<<<<<<<<<<<<
@@ -7200,7 +7042,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       (__pyx_v_offset[0]) += 1;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":805
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":311
  *             offset[0] += 1
  * 
  *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
@@ -7209,417 +7051,417 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
     (__pyx_v_offset[0]) += __pyx_v_child->elsize;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":807
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":313
  *         offset[0] += child.itemsize
  * 
  *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
  *             t = child.type_num
  *             if end - f < 5:
  */
-    __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));
-    if (__pyx_t_6) {
+    __pyx_t_8 = (!PyDataType_HASFIELDS(__pyx_v_child));
+    if (__pyx_t_8) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":808
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":314
  * 
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num             # <<<<<<<<<<<<<<
  *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")
+ *                 raise RuntimeError("Format string allocated too short.")
  */
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_v_t);
-      __pyx_v_t = __pyx_t_3;
-      __pyx_t_3 = 0;
+      __pyx_v_t = __pyx_t_4;
+      __pyx_t_4 = 0;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":809
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":315
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num
  *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError(u"Format string allocated too short.")
+ *                 raise RuntimeError("Format string allocated too short.")
  * 
  */
-      __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);
-      if (__pyx_t_6) {
+      __pyx_t_8 = ((__pyx_v_end - __pyx_v_f) < 5);
+      if (__pyx_t_8) {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":810
+        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":316
  *             t = child.type_num
  *             if end - f < 5:
- *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
+ *                 raise RuntimeError("Format string allocated too short.")             # <<<<<<<<<<<<<<
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
-        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_10));
-        __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
-        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
+        __Pyx_INCREF(__pyx_kp_29);
+        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_29);
+        __Pyx_GIVEREF(__pyx_kp_29);
+        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
         __Pyx_Raise(__pyx_t_5, 0, 0);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         goto __pyx_L10;
       }
       __pyx_L10:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":813
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":319
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 98;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":814
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":320
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 66;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":815
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":321
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 104;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":816
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":322
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 72;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":817
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":323
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 105;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":818
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":324
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 73;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":819
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":325
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 108;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":820
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":326
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 76;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":821
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":327
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 113;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":822
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":328
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 81;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":823
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":329
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 102;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":824
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":330
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 100;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":825
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":331
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 103;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":826
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":332
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 102;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":827
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":333
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 100;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":828
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":334
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_6) {
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 103;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":829
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":335
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
  *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__pyx_t_6) {
+      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__pyx_t_8) {
         (__pyx_v_f[0]) = 79;
         goto __pyx_L11;
       }
       /*else*/ {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":831
+        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":337
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *             f += 1
  *         else:
  */
-        __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_5);
-        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
-        __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        __Pyx_Raise(__pyx_t_3, 0, 0);
-        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyNumber_Remainder(__pyx_kp_30, __pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_5));
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+        __Pyx_GIVEREF(__pyx_t_4);
+        __pyx_t_4 = 0;
+        __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
+        __Pyx_Raise(__pyx_t_4, 0, 0);
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_L11:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":832
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":338
  *             else:
- *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
+ *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
  *             f += 1             # <<<<<<<<<<<<<<
  *         else:
  *             # Cython ignores struct boundary information ("T{...}"),
@@ -7629,26 +7471,25 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":836
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":342
  *             # Cython ignores struct boundary information ("T{...}"),
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
  *     return f
  * 
  */
-      __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_f = __pyx_t_10;
+      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_f = __pyx_t_9;
     }
     __pyx_L9:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":837
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":343
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)
  *     return f             # <<<<<<<<<<<<<<
  * 
- * 
  */
   __pyx_r = __pyx_v_f;
   goto __pyx_L0;
@@ -7656,6 +7497,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
@@ -7664,151 +7506,10 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_DECREF((PyObject *)__pyx_v_child);
-  __Pyx_DECREF(__pyx_v_fields);
-  __Pyx_DECREF(__pyx_v_childname);
+  __Pyx_DECREF(__pyx_v_i);
   __Pyx_DECREF(__pyx_v_new_offset);
   __Pyx_DECREF(__pyx_v_t);
-  __Pyx_DECREF((PyObject *)__pyx_v_descr);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":952
- * 
- * 
- * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
- *      cdef PyObject* baseptr
- *      if base is None:
- */
-
-static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
-  PyObject *__pyx_v_baseptr;
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("set_array_base");
-  __Pyx_INCREF((PyObject *)__pyx_v_arr);
-  __Pyx_INCREF(__pyx_v_base);
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":954
- * cdef inline void set_array_base(ndarray arr, object base):
- *      cdef PyObject* baseptr
- *      if base is None:             # <<<<<<<<<<<<<<
- *          baseptr = NULL
- *      else:
- */
-  __pyx_t_1 = (__pyx_v_base == Py_None);
-  if (__pyx_t_1) {
-
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":955
- *      cdef PyObject* baseptr
- *      if base is None:
- *          baseptr = NULL             # <<<<<<<<<<<<<<
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
- */
-    __pyx_v_baseptr = NULL;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":957
- *          baseptr = NULL
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
- *          baseptr = base
- *      Py_XDECREF(arr.base)
- */
-    Py_INCREF(__pyx_v_base);
-
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":958
- *      else:
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = base             # <<<<<<<<<<<<<<
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr
- */
-    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
-  }
-  __pyx_L3:;
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":959
- *          Py_INCREF(base) # important to do this before decref below!
- *          baseptr = base
- *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
- *      arr.base = baseptr
- * 
- */
-  Py_XDECREF(__pyx_v_arr->base);
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":960
- *          baseptr = base
- *      Py_XDECREF(arr.base)
- *      arr.base = baseptr             # <<<<<<<<<<<<<<
- * 
- * cdef inline object get_array_base(ndarray arr):
- */
-  __pyx_v_arr->base = __pyx_v_baseptr;
-
-  __Pyx_DECREF((PyObject *)__pyx_v_arr);
-  __Pyx_DECREF(__pyx_v_base);
-  __Pyx_RefNannyFinishContext();
-}
-
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":962
- *      arr.base = baseptr
- * 
- * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
- *     if arr.base is NULL:
- *         return None
- */
-
-static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
-  PyObject *__pyx_r = NULL;
-  int __pyx_t_1;
-  __Pyx_RefNannySetupContext("get_array_base");
-  __Pyx_INCREF((PyObject *)__pyx_v_arr);
-
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":963
- * 
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:             # <<<<<<<<<<<<<<
- *         return None
- *     else:
- */
-  __pyx_t_1 = (__pyx_v_arr->base == NULL);
-  if (__pyx_t_1) {
-
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":964
- * cdef inline object get_array_base(ndarray arr):
- *     if arr.base is NULL:
- *         return None             # <<<<<<<<<<<<<<
- *     else:
- *         return arr.base
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(Py_None);
-    __pyx_r = Py_None;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":966
- *         return None
- *     else:
- *         return arr.base             # <<<<<<<<<<<<<<
- */
-    __Pyx_XDECREF(__pyx_r);
-    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
-    __pyx_r = ((PyObject *)__pyx_v_arr->base);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_arr);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   return __pyx_r;
 }
 static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_vtable_15sgd_fast_sparse_LossFunction;
@@ -7976,10 +7677,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_LossFunction = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_vtable_15sgd_fast_sparse_Regression;
 
@@ -8142,10 +7839,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Regression = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_vtable_15sgd_fast_sparse_Classification;
 
@@ -8308,10 +8001,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Classification = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber __pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
 
@@ -8475,10 +8164,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_ModifiedHuber = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge __pyx_vtable_15sgd_fast_sparse_Hinge;
 
@@ -8642,10 +8327,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Hinge = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Log __pyx_vtable_15sgd_fast_sparse_Log;
 
@@ -8809,10 +8490,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Log = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError __pyx_vtable_15sgd_fast_sparse_SquaredError;
 
@@ -8976,10 +8653,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_SquaredError = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber __pyx_vtable_15sgd_fast_sparse_Huber;
 
@@ -9143,10 +8816,6 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
-  0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
-  0, /*tp_version_tag*/
-  #endif
 };
 
 static struct PyMethodDef __pyx_methods[] = {
@@ -9171,92 +8840,81 @@ static struct PyModuleDef __pyx_moduledef = {
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
-  {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0},
-  {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0},
-  {&__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_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
-  {&__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_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0},
-  {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},
-  {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0},
-  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},
-  {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0},
-  {&__pyx_n_s__LossFunction, __pyx_k__LossFunction, sizeof(__pyx_k__LossFunction), 0, 0, 1, 1},
-  {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1},
-  {&__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_indices, __pyx_k__X_indices, sizeof(__pyx_k__X_indices), 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__Y, __pyx_k__Y, sizeof(__pyx_k__Y), 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__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1},
-  {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1},
-  {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1},
-  {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},
-  {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1},
-  {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1},
-  {&__pyx_n_s__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__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 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__format, __pyx_k__format, sizeof(__pyx_k__format), 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__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1},
-  {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 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__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1},
-  {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1},
-  {&__pyx_n_s__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__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 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__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__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1},
-  {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 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__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1},
-  {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1},
-  {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},
-  {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},
-  {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 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__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}
+  {&__pyx_kp___main__, __pyx_k___main__, sizeof(__pyx_k___main__), 1, 1, 1},
+  {&__pyx_kp_loss, __pyx_k_loss, sizeof(__pyx_k_loss), 1, 1, 1},
+  {&__pyx_kp_dloss, __pyx_k_dloss, sizeof(__pyx_k_dloss), 1, 1, 1},
+  {&__pyx_kp___reduce__, __pyx_k___reduce__, sizeof(__pyx_k___reduce__), 1, 1, 1},
+  {&__pyx_kp___init__, __pyx_k___init__, sizeof(__pyx_k___init__), 1, 1, 1},
+  {&__pyx_kp_p, __pyx_k_p, sizeof(__pyx_k_p), 1, 1, 1},
+  {&__pyx_kp_y, __pyx_k_y, sizeof(__pyx_k_y), 1, 1, 1},
+  {&__pyx_kp_c, __pyx_k_c, sizeof(__pyx_k_c), 1, 1, 1},
+  {&__pyx_kp_w, __pyx_k_w, sizeof(__pyx_k_w), 1, 1, 1},
+  {&__pyx_kp_intercept, __pyx_k_intercept, sizeof(__pyx_k_intercept), 1, 1, 1},
+  {&__pyx_kp_penalty_type, __pyx_k_penalty_type, sizeof(__pyx_k_penalty_type), 1, 1, 1},
+  {&__pyx_kp_alpha, __pyx_k_alpha, sizeof(__pyx_k_alpha), 1, 1, 1},
+  {&__pyx_kp_rho, __pyx_k_rho, sizeof(__pyx_k_rho), 1, 1, 1},
+  {&__pyx_kp_X_data, __pyx_k_X_data, sizeof(__pyx_k_X_data), 1, 1, 1},
+  {&__pyx_kp_X_indices, __pyx_k_X_indices, sizeof(__pyx_k_X_indices), 1, 1, 1},
+  {&__pyx_kp_X_indptr, __pyx_k_X_indptr, sizeof(__pyx_k_X_indptr), 1, 1, 1},
+  {&__pyx_kp_Y, __pyx_k_Y, sizeof(__pyx_k_Y), 1, 1, 1},
+  {&__pyx_kp_n_iter, __pyx_k_n_iter, sizeof(__pyx_k_n_iter), 1, 1, 1},
+  {&__pyx_kp_fit_intercept, __pyx_k_fit_intercept, sizeof(__pyx_k_fit_intercept), 1, 1, 1},
+  {&__pyx_kp_verbose, __pyx_k_verbose, sizeof(__pyx_k_verbose), 1, 1, 1},
+  {&__pyx_kp_shuffle, __pyx_k_shuffle, sizeof(__pyx_k_shuffle), 1, 1, 1},
+  {&__pyx_kp_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 1, 1, 1},
+  {&__pyx_kp_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 1, 1},
+  {&__pyx_kp_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 1, 1, 1},
+  {&__pyx_kp_time, __pyx_k_time, sizeof(__pyx_k_time), 1, 1, 1},
+  {&__pyx_kp_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 1, 1, 1},
+  {&__pyx_kp_arange, __pyx_k_arange, sizeof(__pyx_k_arange), 1, 1, 1},
+  {&__pyx_kp_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 1, 1, 1},
+  {&__pyx_kp_31, __pyx_k_31, sizeof(__pyx_k_31), 1, 1, 1},
+  {&__pyx_kp_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 1, 1, 1},
+  {&__pyx_kp_32, __pyx_k_32, sizeof(__pyx_k_32), 1, 1, 1},
+  {&__pyx_kp_order, __pyx_k_order, sizeof(__pyx_k_order), 1, 1, 1},
+  {&__pyx_kp_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 1, 0},
+  {&__pyx_kp_random, __pyx_k_random, sizeof(__pyx_k_random), 1, 1, 1},
+  {&__pyx_kp_dot, __pyx_k_dot, sizeof(__pyx_k_dot), 1, 1, 1},
+  {&__pyx_kp_nonzero, __pyx_k_nonzero, sizeof(__pyx_k_nonzero), 1, 1, 1},
+  {&__pyx_kp_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 1, 1, 1},
+  {&__pyx_kp_any, __pyx_k_any, sizeof(__pyx_k_any), 1, 1, 1},
+  {&__pyx_kp_isinf, __pyx_k_isinf, sizeof(__pyx_k_isinf), 1, 1, 1},
+  {&__pyx_kp_isnan, __pyx_k_isnan, sizeof(__pyx_k_isnan), 1, 1, 1},
+  {&__pyx_kp_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 1, 1, 1},
+  {&__pyx_kp_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 0, 0},
+  {&__pyx_kp_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 0, 0},
+  {&__pyx_kp_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 0, 0},
+  {&__pyx_kp_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 0, 0},
+  {&__pyx_kp___getbuffer__, __pyx_k___getbuffer__, sizeof(__pyx_k___getbuffer__), 1, 1, 1},
+  {&__pyx_kp___releasebuffer__, __pyx_k___releasebuffer__, sizeof(__pyx_k___releasebuffer__), 1, 1, 1},
+  {&__pyx_kp_info, __pyx_k_info, sizeof(__pyx_k_info), 1, 1, 1},
+  {&__pyx_kp_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 1, 1, 1},
+  {&__pyx_kp_range, __pyx_k_range, sizeof(__pyx_k_range), 1, 1, 1},
+  {&__pyx_kp_itervalues, __pyx_k_itervalues, sizeof(__pyx_k_itervalues), 1, 1, 1},
+  {&__pyx_kp_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 1, 1, 1},
+  {&__pyx_kp_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 0},
+  {&__pyx_kp_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 0},
+  {&__pyx_kp_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 0},
+  {&__pyx_kp_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 0, 0},
+  {&__pyx_kp_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 0, 0},
+  {&__pyx_kp_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 0, 0},
+  {&__pyx_kp_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 0, 0},
+  {&__pyx_kp_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 0, 0},
+  {0, 0, 0, 0, 0, 0}
 };
 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 = 41; __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 = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_kp_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_kp_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_kp_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_kp_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
 }
 
 static int __Pyx_InitGlobals(void) {
-  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -9270,34 +8928,31 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void); /*proto*/
 PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
 #endif
 {
+  PyObject *__pyx_1 = 0;
+  PyObject *__pyx_2 = 0;
   PyObject *__pyx_t_1 = NULL;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  #if CYTHON_REFNANNY
-  void* __pyx_refnanny = NULL;
-  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
-  if (!__Pyx_RefNanny) {
+  #ifdef CYTHON_REFNANNY
+  void* __pyx_refchk = NULL;
+  __Pyx_Refnanny = __Pyx_ImportRefcountAPI("refnanny");
+  if (!__Pyx_Refnanny) {
       PyErr_Clear();
-      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
-      if (!__Pyx_RefNanny)
-          Py_FatalError("failed to import 'refnanny' module");
+      __Pyx_Refnanny = __Pyx_ImportRefcountAPI("Cython.Runtime.refnanny");
+      if (!__Pyx_Refnanny)
+          Py_FatalError("failed to import refnanny module");
   }
-  __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__);
+  __pyx_refchk = __Pyx_Refnanny->NewContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__);
   #endif
-  __pyx_init_filenames();
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #if PY_MAJOR_VERSION < 3
-  __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #else
-  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #endif
   /*--- Library function declarations ---*/
+  __pyx_init_filenames();
   /*--- Threads initialization code ---*/
   #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
   #ifdef WITH_THREAD /* Python build with threading support? */
   PyEval_InitThreads();
   #endif
   #endif
+  /*--- Initialize various global constants etc. ---*/
+  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
   __pyx_m = Py_InitModule4(__Pyx_NAMESTR("sgd_fast_sparse"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
@@ -9311,13 +8966,12 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
   if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
-  /*--- Initialize various global constants etc. ---*/
-  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_module_is_main_sgd_fast_sparse) {
-    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_kp___main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   }
   /*--- Builtin init code ---*/
   if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_skip_dispatch = 0;
   /*--- Global init code ---*/
   /*--- Function export code ---*/
   /*--- Type init code ---*/
@@ -9329,9 +8983,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_loss;
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_dloss;
   #endif
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_LossFunction.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_LossFunction.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_LossFunction = &__pyx_type_15sgd_fast_sparse_LossFunction;
   __pyx_vtabptr_15sgd_fast_sparse_Regression = &__pyx_vtable_15sgd_fast_sparse_Regression;
   __pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9343,9 +8997,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Regression.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Regression = &__pyx_type_15sgd_fast_sparse_Regression;
   __pyx_vtabptr_15sgd_fast_sparse_Classification = &__pyx_vtable_15sgd_fast_sparse_Classification;
   __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9357,9 +9011,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Classification.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Classification = &__pyx_type_15sgd_fast_sparse_Classification;
   __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber = &__pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9371,9 +9025,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_ModifiedHuber = &__pyx_type_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtabptr_15sgd_fast_sparse_Hinge = &__pyx_vtable_15sgd_fast_sparse_Hinge;
   __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9385,9 +9039,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Hinge.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Hinge = &__pyx_type_15sgd_fast_sparse_Hinge;
   __pyx_vtabptr_15sgd_fast_sparse_Log = &__pyx_vtable_15sgd_fast_sparse_Log;
   __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9399,9 +9053,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Log.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Log = &__pyx_type_15sgd_fast_sparse_Log;
   __pyx_vtabptr_15sgd_fast_sparse_SquaredError = &__pyx_vtable_15sgd_fast_sparse_SquaredError;
   __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9413,9 +9067,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_SquaredError.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_SquaredError = &__pyx_type_15sgd_fast_sparse_SquaredError;
   __pyx_vtabptr_15sgd_fast_sparse_Huber = &__pyx_vtable_15sgd_fast_sparse_Huber;
   __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9427,102 +9081,62 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Huber.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber;
   /*--- Type import code ---*/
-  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr)); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject)); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":6
- * from __future__ import division
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
+ * # License: BSD Style.
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
  * import sys
  * from time import time
  */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_1 = __Pyx_Import(__pyx_kp_numpy, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_kp_np, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":7
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
  * 
  * import numpy as np
  * import sys             # <<<<<<<<<<<<<<
  * from time import time
  * 
  */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_1 = __Pyx_Import(__pyx_kp_sys, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_kp_sys, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":8
+  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":13
  * import numpy as np
  * import sys
  * from time import time             # <<<<<<<<<<<<<<
  * 
  * cimport numpy as np
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_INCREF(__pyx_kp_time);
+  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_kp_time);
+  __Pyx_GIVEREF(__pyx_kp_time);
+  __pyx_1 = __Pyx_Import(__pyx_kp_time, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
- * # Author: Peter Prettenhofer              # <<<<<<<<<<<<<<
- * #
- * # License: BSD Style.
- */
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
+  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_2);
+  if (PyObject_SetAttr(__pyx_m, __pyx_kp_time, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
  * 
  * cdef extern from "stdlib.h" nogil:             # <<<<<<<<<<<<<<
  *     void free(void *ptr)
@@ -9530,17 +9144,13 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
  */
   goto __pyx_L0;
   __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_1);
+  __Pyx_XDECREF(__pyx_2);
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  if (__pyx_m) {
-    __Pyx_AddTraceback("init sgd_fast_sparse");
-    Py_DECREF(__pyx_m); __pyx_m = 0;
-  } else if (!PyErr_Occurred()) {
-    PyErr_SetString(PyExc_ImportError, "init sgd_fast_sparse");
-  }
+  __Pyx_AddTraceback("sgd_fast_sparse");
+  Py_DECREF(__pyx_m); __pyx_m = 0;
   __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
+  __Pyx_FinishRefcountContext();
   #if PY_MAJOR_VERSION < 3
   return;
   #else
@@ -9681,7 +9291,7 @@ static int __Pyx_ParseOptionalKeywords(
     return -1;
 }
 
-static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
+static INLINE int __Pyx_IsLittleEndian(void) {
   unsigned int n = 1;
   return *(unsigned char*)(&n) != 0;
 }
@@ -10078,7 +9688,7 @@ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const cha
   }
 }
 
-static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
+static INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
   buf->buf = NULL;
   buf->obj = NULL;
   buf->strides = __Pyx_zeros;
@@ -10119,21 +9729,21 @@ fail:;
   return -1;
 }
 
-static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
+static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
   if (info->buf == NULL) return;
   if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL;
   __Pyx_ReleaseBuffer(info);
 }
 
-static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (unlikely(!type)) {
+static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    if (!type) {
         PyErr_Format(PyExc_SystemError, "Missing type object");
         return 0;
     }
-    if (likely(PyObject_TypeCheck(obj, type)))
+    if (obj == Py_None || PyObject_TypeCheck(obj, type))
         return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
-                 Py_TYPE(obj)->tp_name, type->tp_name);
+    PyErr_Format(PyExc_TypeError, "Cannot convert %s to %s",
+        Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
 
@@ -10144,10 +9754,27 @@ static void __Pyx_RaiseBufferFallbackError(void) {
 
 
 
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
 
+#if PY_MAJOR_VERSION >= 3
+    /* Note: this is a temporary work-around to prevent crashes in Python 3.0 */
+    if ((tstate->exc_type != NULL) & (tstate->exc_type != Py_None)) {
+        tmp_type = tstate->exc_type;
+        tmp_value = tstate->exc_value;
+        tmp_tb = tstate->exc_traceback;
+        PyErr_NormalizeException(&type, &value, &tb);
+        PyErr_NormalizeException(&tmp_type, &tmp_value, &tmp_tb);
+        tstate->exc_type = 0;
+        tstate->exc_value = 0;
+        tstate->exc_traceback = 0;
+        PyException_SetContext(value, tmp_value);
+        Py_DECREF(tmp_type);
+        Py_XDECREF(tmp_tb);
+    }
+#endif
+
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -10159,7 +9786,7 @@ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyOb
     Py_XDECREF(tmp_tb);
 }
 
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
@@ -10171,57 +9798,6 @@ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyOb
 }
 
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
-    PyErr_Format(PyExc_ValueError,
-        #if PY_VERSION_HEX < 0x02050000
-                 "need more than %d value%s to unpack", (int)index,
-        #else
-                 "need more than %zd value%s to unpack", index,
-        #endif
-                 (index == 1) ? "" : "s");
-}
-
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void) {
-    PyErr_SetString(PyExc_ValueError, "too many values to unpack");
-}
-
-static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
-    PyObject *item;
-    if (!(item = PyIter_Next(iter))) {
-        if (!PyErr_Occurred()) {
-            __Pyx_RaiseNeedMoreValuesError(index);
-        }
-    }
-    return item;
-}
-
-static int __Pyx_EndUnpack(PyObject *iter) {
-    PyObject *item;
-    if ((item = PyIter_Next(iter))) {
-        Py_DECREF(item);
-        __Pyx_RaiseTooManyValuesError();
-        return -1;
-    }
-    else if (!PyErr_Occurred())
-        return 0;
-    else
-        return -1;
-}
-
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
-}
-
-static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
-    if (t == Py_None) {
-      __Pyx_RaiseNoneNotIterableError();
-    } else if (PyTuple_GET_SIZE(t) < index) {
-      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
-    } else {
-      __Pyx_RaiseTooManyValuesError();
-    }
-}
-
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact)
 {
@@ -10307,7 +9883,6 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
-#if PY_MAJOR_VERSION < 3
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
     Py_XINCREF(type);
     Py_XINCREF(value);
@@ -10363,7 +9938,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
             }
         #endif
     }
-
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -10373,50 +9947,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
     return;
 }
 
-#else /* Python 3+ */
-
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
-    if (tb == Py_None) {
-        tb = 0;
-    } else if (tb && !PyTraceBack_Check(tb)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: arg 3 must be a traceback or None");
-        goto bad;
-    }
-    if (value == Py_None)
-        value = 0;
-
-    if (PyExceptionInstance_Check(type)) {
-        if (value) {
-            PyErr_SetString(PyExc_TypeError,
-                "instance exception may not have a separate value");
-            goto bad;
-        }
-        value = type;
-        type = (PyObject*) Py_TYPE(value);
-    } else if (!PyExceptionClass_Check(type)) {
-        PyErr_SetString(PyExc_TypeError,
-            "raise: exception class must be a subclass of BaseException");
-        goto bad;
-    }
-
-    PyErr_SetObject(type, value);
-
-    if (tb) {
-        PyThreadState *tstate = PyThreadState_GET();
-        PyObject* tmp_tb = tstate->curexc_traceback;
-        if (tb != tmp_tb) {
-            Py_INCREF(tb);
-            tstate->curexc_traceback = tb;
-            Py_XDECREF(tmp_tb);
-        }
-    }
-
-bad:
-    return;
-}
-#endif
-
 #if PY_MAJOR_VERSION < 3
 static PyObject *__Pyx_GetStdout(void) {
     PyObject *f = PySys_GetObject((char *)"stdout");
@@ -10530,168 +10060,24 @@ static int __Pyx_PrintOne(PyObject *o) {
 
 #endif
 
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
-      return ::std::complex< float >(x, y);
-    }
-  #else
-    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
-      return x + y*(__pyx_t_float_complex)_Complex_I;
-    }
-  #endif
-#else
-    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
-      __pyx_t_float_complex z;
-      z.real = x;
-      z.imag = y;
-      return z;
-    }
-#endif
-
-#if CYTHON_CCOMPLEX
-#else
-    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-       return (a.real == b.real) && (a.imag == b.imag);
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real + b.real;
-        z.imag = a.imag + b.imag;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real - b.real;
-        z.imag = a.imag - b.imag;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real * b.real - a.imag * b.imag;
-        z.imag = a.real * b.imag + a.imag * b.real;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        float denom = b.real * b.real + b.imag * b.imag;
-        z.real = (a.real * b.real + a.imag * b.imag) / denom;
-        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {
-        __pyx_t_float_complex z;
-        z.real = -a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {
-       return (a.real == 0) && (a.imag == 0);
-    }
-    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {
-        __pyx_t_float_complex z;
-        z.real =  a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-/*
-    static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {
-#if HAVE_HYPOT
-        return hypotf(z.real, z.imag);
-#else
-        return sqrtf(z.real*z.real + z.imag*z.imag);
-#endif
-    }
-*/
-#endif
-
-#if CYTHON_CCOMPLEX
-  #ifdef __cplusplus
-    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
-      return ::std::complex< double >(x, y);
-    }
-  #else
-    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
-      return x + y*(__pyx_t_double_complex)_Complex_I;
-    }
-  #endif
-#else
-    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
-      __pyx_t_double_complex z;
-      z.real = x;
-      z.imag = y;
-      return z;
-    }
-#endif
-
-#if CYTHON_CCOMPLEX
-#else
-    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-       return (a.real == b.real) && (a.imag == b.imag);
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real + b.real;
-        z.imag = a.imag + b.imag;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real - b.real;
-        z.imag = a.imag - b.imag;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real * b.real - a.imag * b.imag;
-        z.imag = a.real * b.imag + a.imag * b.real;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        double denom = b.real * b.real + b.imag * b.imag;
-        z.real = (a.real * b.real + a.imag * b.imag) / denom;
-        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
-        return z;
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {
-        __pyx_t_double_complex z;
-        z.real = -a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {
-       return (a.real == 0) && (a.imag == 0);
-    }
-    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {
-        __pyx_t_double_complex z;
-        z.real =  a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-/*
-    static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {
-#if HAVE_HYPOT
-        return hypot(z.real, z.imag);
-#else
-        return sqrt(z.real*z.real + z.imag*z.imag);
-#endif
-    }
-*/
-#endif
+static INLINE int __Pyx_StrEq(const char *s1, const char *s2) {
+     while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
+     return *s1 == *s2;
+}
 
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
-    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
     if (sizeof(unsigned char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (unsigned char)-1;
+            if (unlikely(val < 0)) {
                 PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned char" :
-                    "value too large to convert to unsigned char");
+                                "can't convert negative value to unsigned char");
+                return (unsigned char)-1;
             }
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to unsigned char");
             return (unsigned char)-1;
         }
         return (unsigned char)val;
@@ -10699,18 +10085,19 @@ static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
     return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
-    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
     if (sizeof(unsigned short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (unsigned short)-1;
+            if (unlikely(val < 0)) {
                 PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned short" :
-                    "value too large to convert to unsigned short");
+                                "can't convert negative value to unsigned short");
+                return (unsigned short)-1;
             }
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to unsigned short");
             return (unsigned short)-1;
         }
         return (unsigned short)val;
@@ -10718,18 +10105,19 @@ static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
     return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
-    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
     if (sizeof(unsigned int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (unsigned int)-1;
+            if (unlikely(val < 0)) {
                 PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned int" :
-                    "value too large to convert to unsigned int");
+                                "can't convert negative value to unsigned int");
+                return (unsigned int)-1;
             }
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to unsigned int");
             return (unsigned int)-1;
         }
         return (unsigned int)val;
@@ -10737,18 +10125,14 @@ static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
     return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
-    const char neg_one = (char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
     if (sizeof(char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to char" :
-                    "value too large to convert to char");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (char)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to char");
             return (char)-1;
         }
         return (char)val;
@@ -10756,18 +10140,14 @@ static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
     return (char)__Pyx_PyInt_AsLong(x);
 }
 
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
-    const short neg_one = (short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
     if (sizeof(short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to short" :
-                    "value too large to convert to short");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (short)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to short");
             return (short)-1;
         }
         return (short)val;
@@ -10775,18 +10155,14 @@ static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
     return (short)__Pyx_PyInt_AsLong(x);
 }
 
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
-    const int neg_one = (int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
     if (sizeof(int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to int" :
-                    "value too large to convert to int");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (int)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to int");
             return (int)-1;
         }
         return (int)val;
@@ -10794,18 +10170,14 @@ static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
     return (int)__Pyx_PyInt_AsLong(x);
 }
 
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
-    const signed char neg_one = (signed char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
     if (sizeof(signed char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed char" :
-                    "value too large to convert to signed char");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (signed char)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to signed char");
             return (signed char)-1;
         }
         return (signed char)val;
@@ -10813,18 +10185,14 @@ static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
     return (signed char)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
-    const signed short neg_one = (signed short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
     if (sizeof(signed short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed short" :
-                    "value too large to convert to signed short");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (signed short)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to signed short");
             return (signed short)-1;
         }
         return (signed short)val;
@@ -10832,18 +10200,14 @@ static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
     return (signed short)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
-    const signed int neg_one = (signed int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
     if (sizeof(signed int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed int" :
-                    "value too large to convert to signed int");
-            }
+            if (unlikely(val == -1 && PyErr_Occurred()))
+                return (signed int)-1;
+            PyErr_SetString(PyExc_OverflowError,
+                           "value too large to convert to signed int");
             return (signed int)-1;
         }
         return (signed int)val;
@@ -10851,13 +10215,11 @@ static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
     return (signed int)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
-    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
+        if (unlikely(val < 0)) {
             PyErr_SetString(PyExc_OverflowError,
                             "can't convert negative value to unsigned long");
             return (unsigned long)-1;
@@ -10865,17 +10227,13 @@ static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
         return (unsigned long)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned long");
-                return (unsigned long)-1;
-            }
-            return PyLong_AsUnsignedLong(x);
-        } else {
-            return PyLong_AsLong(x);
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        if (unlikely(Py_SIZE(x) < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to unsigned long");
+            return (unsigned long)-1;
         }
+        return PyLong_AsUnsignedLong(x);
     } else {
         unsigned long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10886,13 +10244,11 @@ static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
     }
 }
 
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
-    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
+        if (unlikely(val < 0)) {
             PyErr_SetString(PyExc_OverflowError,
                             "can't convert negative value to unsigned PY_LONG_LONG");
             return (unsigned PY_LONG_LONG)-1;
@@ -10900,17 +10256,13 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObje
         return (unsigned PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned PY_LONG_LONG");
-                return (unsigned PY_LONG_LONG)-1;
-            }
-            return PyLong_AsUnsignedLongLong(x);
-        } else {
-            return PyLong_AsLongLong(x);
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        if (unlikely(Py_SIZE(x) < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to unsigned PY_LONG_LONG");
+            return (unsigned PY_LONG_LONG)-1;
         }
+        return PyLong_AsUnsignedLongLong(x);
     } else {
         unsigned PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10921,31 +10273,15 @@ static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObje
     }
 }
 
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
-    const long neg_one = (long)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to long");
-            return (long)-1;
-        }
         return (long)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to long");
-                return (long)-1;
-            }
-            return PyLong_AsUnsignedLong(x);
-        } else {
-            return PyLong_AsLong(x);
-        }
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        return PyLong_AsLong(x);
     } else {
         long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10956,31 +10292,15 @@ static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
     }
 }
 
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
-    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to PY_LONG_LONG");
-            return (PY_LONG_LONG)-1;
-        }
         return (PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to PY_LONG_LONG");
-                return (PY_LONG_LONG)-1;
-            }
-            return PyLong_AsUnsignedLongLong(x);
-        } else {
-            return PyLong_AsLongLong(x);
-        }
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        return PyLong_AsLongLong(x);
     } else {
         PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10991,31 +10311,15 @@ static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
     }
 }
 
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
-    const signed long neg_one = (signed long)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed long");
-            return (signed long)-1;
-        }
         return (signed long)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed long");
-                return (signed long)-1;
-            }
-            return PyLong_AsUnsignedLong(x);
-        } else {
-            return PyLong_AsLong(x);
-        }
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        return PyLong_AsLong(x);
     } else {
         signed long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -11026,31 +10330,15 @@ static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
     }
 }
 
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
-    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
+static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_Check(x))) {
+    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed PY_LONG_LONG");
-            return (signed PY_LONG_LONG)-1;
-        }
         return (signed PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed PY_LONG_LONG");
-                return (signed PY_LONG_LONG)-1;
-            }
-            return PyLong_AsUnsignedLongLong(x);
-        } else {
-            return PyLong_AsLongLong(x);
-        }
+    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
+        return PyLong_AsLongLong(x);
     } else {
         signed PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -11080,31 +10368,32 @@ static void __Pyx_WriteUnraisable(const char *name) {
 }
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
-#if PY_VERSION_HEX < 0x03010000
-    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
-#else
-    PyObject *ob = PyCapsule_New(vtable, 0, 0);
-#endif
-    if (!ob)
+    PyObject *pycobj = 0;
+    int result;
+    
+    pycobj = PyCObject_FromVoidPtr(vtable, 0);
+    if (!pycobj)
         goto bad;
-    if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0)
+    if (PyDict_SetItemString(dict, "__pyx_vtable__", pycobj) < 0)
         goto bad;
-    Py_DECREF(ob);
-    return 0;
+    result = 0;
+    goto done;
+
 bad:
-    Py_XDECREF(ob);
-    return -1;
+    result = -1;
+done:
+    Py_XDECREF(pycobj);
+    return result;
 }
 
 #ifndef __PYX_HAVE_RT_ImportType
 #define __PYX_HAVE_RT_ImportType
 static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,
-    long size, int strict)
+    long size)
 {
     PyObject *py_module = 0;
     PyObject *result = 0;
     PyObject *py_name = 0;
-    char warning[200];
 
     py_module = __Pyx_ImportModule(module_name);
     if (!py_module)
@@ -11129,15 +10418,9 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class
             module_name, class_name);
         goto bad;
     }
-    if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) {
-        PyOS_snprintf(warning, sizeof(warning), 
-            "%s.%s size changed, may indicate binary incompatibility",
-            module_name, class_name);
-        PyErr_WarnEx(NULL, warning, 0);
-    }
-    else if (((PyTypeObject *)result)->tp_basicsize != size) {
+    if (((PyTypeObject *)result)->tp_basicsize != size) {
         PyErr_Format(PyExc_ValueError, 
-            "%s.%s has the wrong size, try recompiling",
+            "%s.%s does not appear to be the correct type object",
             module_name, class_name);
         goto bad;
     }
@@ -11179,6 +10462,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
     PyObject *py_globals = 0;
+    PyObject *empty_string = 0;
     PyCodeObject *py_code = 0;
     PyFrameObject *py_frame = 0;
 
@@ -11205,6 +10489,12 @@ static void __Pyx_AddTraceback(const char *funcname) {
     if (!py_funcname) goto bad;
     py_globals = PyModule_GetDict(__pyx_m);
     if (!py_globals) goto bad;
+    #if PY_MAJOR_VERSION < 3
+    empty_string = PyString_FromStringAndSize("", 0);
+    #else
+    empty_string = PyBytes_FromStringAndSize("", 0);
+    #endif
+    if (!empty_string) goto bad;
     py_code = PyCode_New(
         0,            /*int argcount,*/
         #if PY_MAJOR_VERSION >= 3
@@ -11213,7 +10503,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
-        __pyx_empty_bytes, /*PyObject *code,*/
+        empty_string, /*PyObject *code,*/
         __pyx_empty_tuple,  /*PyObject *consts,*/
         __pyx_empty_tuple,  /*PyObject *names,*/
         __pyx_empty_tuple,  /*PyObject *varnames,*/
@@ -11222,7 +10512,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
         __pyx_lineno,   /*int firstlineno,*/
-        __pyx_empty_bytes  /*PyObject *lnotab*/
+        empty_string  /*PyObject *lnotab*/
     );
     if (!py_code) goto bad;
     py_frame = PyFrame_New(
@@ -11237,6 +10527,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
 bad:
     Py_XDECREF(py_srcfile);
     Py_XDECREF(py_funcname);
+    Py_XDECREF(empty_string);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -11244,7 +10535,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     while (t->p) {
         #if PY_MAJOR_VERSION < 3
-        if (t->is_unicode) {
+        if (t->is_unicode && (!t->is_identifier)) {
             *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
         } else if (t->intern) {
             *t->p = PyString_InternFromString(t->s);
@@ -11252,14 +10543,10 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
             *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
         }
         #else  /* Python 3+ has unicode identifiers */
-        if (t->is_unicode | t->is_str) {
-            if (t->intern) {
-                *t->p = PyUnicode_InternFromString(t->s);
-            } else if (t->encoding) {
-                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
-            } else {
-                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
-            }
+        if (t->is_identifier || (t->is_unicode && t->intern)) {
+            *t->p = PyUnicode_InternFromString(t->s);
+        } else if (t->is_unicode) {
+            *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
         } else {
             *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
         }
@@ -11273,13 +10560,13 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
 
 /* Type Conversion Functions */
 
-static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
+static INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
    if (x == Py_True) return 1;
    else if ((x == Py_False) | (x == Py_None)) return 0;
    else return PyObject_IsTrue(x);
 }
 
-static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
+static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
   PyNumberMethods *m;
   const char *name = NULL;
   PyObject *res = NULL;
@@ -11325,7 +10612,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
   return res;
 }
 
-static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
+static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_ssize_t ival;
   PyObject* x = PyNumber_Index(b);
   if (!x) return -1;
@@ -11334,7 +10621,7 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   return ival;
 }
 
-static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
+static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
 #if PY_VERSION_HEX < 0x02050000
    if (ival <= LONG_MAX)
        return PyInt_FromLong((long)ival);
@@ -11348,7 +10635,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
 #endif
 }
 
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
+static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
    unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
    if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
        return (size_t)-1;
@@ -11361,4 +10648,3 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
 }
 
 
-#endif /* Py_PYTHON_H */
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index e6ab3eb04c50b..ef68654b7d194 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -1,7 +1,12 @@
+# encoding: utf-8
+# cython: cdivision=True
+# cython: boundscheck=False
+# cython: wraparound=False
+# filename: sgd.pyx
+#
 # Author: Peter Prettenhofer 
 #
 # License: BSD Style.
-from __future__ import division
 
 import numpy as np
 import sys
@@ -16,14 +21,12 @@ cdef extern from "math.h":
     cdef extern double sqrt(double x)
 
 ctypedef np.float64_t DOUBLE
-ctypedef np.float32_t FLOAT
 ctypedef np.int32_t INTEGER
 
 DEF L1 = 1
 DEF L2 = 2
 DEF ELASTICNET = 3
 
-
 # ----------------------------------------
 # Extension Types for Loss Functions
 # ----------------------------------------
@@ -178,15 +181,15 @@ cdef class Huber(Regression):
 @cython.boundscheck(False)
 @cython.wraparound(False)
 @cython.cdivision(True)
-def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
-              DOUBLE intercept,
+def plain_sgd(np.ndarray[double, ndim=1] w,
+              double intercept,
               LossFunction loss,
               int penalty_type,
               double alpha, double rho,
-              np.ndarray[FLOAT, ndim=1] X_data,
-              np.ndarray[INTEGER, ndim=1] X_indices,
-              np.ndarray[INTEGER, ndim=1] X_indptr,
-              np.ndarray[DOUBLE, ndim=1] Y,
+              np.ndarray[double, ndim=1] X_data,
+              np.ndarray[int, ndim=1] X_indices,
+              np.ndarray[int, ndim=1] X_indptr,
+              np.ndarray[double, ndim=1] Y,
               int n_iter, int fit_intercept,
               int verbose, int shuffle):
     """Cython implementation of SGD with different loss functions and
@@ -197,39 +200,39 @@ def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
     cdef unsigned int n_samples = Y.shape[0]
     cdef unsigned int n_features = w.shape[0]
 
-    # FIXME double to DOUBLE
-    cdef DOUBLE *w_data_ptr = w.data
-    cdef FLOAT *X_data_ptr = X_data.data
-    cdef INTEGER *X_indptr_ptr = X_indptr.data
-    cdef INTEGER *X_indices_ptr = X_indices.data
+    # FIXME double to double
+    cdef double *w_data_ptr = w.data
+    cdef double *X_data_ptr = X_data.data
+    cdef int *X_indptr_ptr = X_indptr.data
+    cdef int *X_indices_ptr = X_indices.data
 
     # FIXME unsined int?
-    cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples,
+    cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
                                                                  dtype = np.int32)
-    cdef INTEGER *index_ptr = index.data
-    cdef INTEGER offset = 0
-    cdef INTEGER xnnz = 0
-    cdef DOUBLE wscale = 1.0
-    cdef DOUBLE eta = 0.0
-    cdef DOUBLE p = 0.0
-    cdef DOUBLE update = 0.0
-    cdef DOUBLE sumloss = 0.0
-    cdef DOUBLE wnorm = 0.0
-    cdef DOUBLE t = 0.0
-    cdef DOUBLE y = 0.0
+    cdef int *index_ptr = index.data
+    cdef int offset = 0
+    cdef int xnnz = 0
+    cdef double wscale = 1.0
+    cdef double eta = 0.0
+    cdef double p = 0.0
+    cdef double update = 0.0
+    cdef double sumloss = 0.0
+    cdef double wnorm = 0.0
+    cdef double t = 0.0
+    cdef double y = 0.0
     cdef unsigned int count = 0
     cdef unsigned int epoch = 0
     cdef unsigned int i = 0
     cdef unsigned int sample_idx = 0
-    cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = None
-    cdef DOUBLE *q_ptr
+    cdef np.ndarray[double, ndim=1, mode="c"] q = None
+    cdef double *q_data_ptr
     if penalty_type != L2:
         q = np.zeros((n_features,), dtype = np.float64, order = "c")
-        q_ptr =  q.data
+        q_data_ptr =  q.data
     cdef double u = 0.0
     # computing eta0
-    cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
-    cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
+    cdef double typw = sqrt(1.0 / sqrt(alpha))
+    cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
     t = 1.0 / (eta0 * alpha)
     t_start = time()
     for epoch from 0 <= epoch < n_iter:
@@ -257,15 +260,16 @@ def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
                 if wscale < 1e-9:
                     w *= wscale
                     wscale = 1.0
-            if penalty_type == L2 or penalty_type == ELASTICNET:
-                u += ((1.0 - rho) * eta * alpha)
-                #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
+            if penalty_type == L1 or penalty_type == ELASTICNET:
+                u += ((1 - rho) * eta * alpha)
+                l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
             t += 1
             count += 1
         # 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, w.nonzero()[0].shape[0], intercept, count, sumloss / count))
+            print("Norm: %.2f, NNZs: %d, 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))
 
         # floating-point under-/overflow check.
@@ -274,55 +278,31 @@ def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
 
     w *= wscale
     return w, intercept
-    
 
-## # ----------------------------------------
-## # Python function for external prediction
-## # ----------------------------------------
-## def predict(np.ndarray x, np.ndarray w,
-##             double bias):
-##     """Computes x*w + b efficiently.
-
-##     :arg x: the instance represented as a sparse vector. 
-##     :type x: np.ndarray(dtype=bolt.sparsedtype)
-##     :arg w: the weight vector represented as a dense vector.
-##     :type w: np.ndarray(dtype=bolt.densedtype)
-##     :arg b: the bias term (aka offset or intercept).
-##     :type b: float
-##     :returns: A double representing `x*w + b`.
-##     """
-##     cdef int xnnz = x.shape[0]
-##     cdef int wdim = w.shape[0]
-##     cdef double y = 0.0
-##     if xnnz == 0:
-##         y = bias
-##     else:
-##         y = dot_checked(w.data,x.data,xnnz,wdim) + bias
-##     return y
-
-cdef inline double max(DOUBLE a, DOUBLE b):
+
+cdef inline double max(double a, double b):
     return a if a >= b else b
 
-cdef inline DOUBLE min(DOUBLE a, DOUBLE b):
+cdef inline double min(double a, double b):
     return a if a <= b else b
 
-cdef DOUBLE dot(DOUBLE *w_data_ptr, FLOAT *X_data_ptr, INTEGER *X_indices_ptr,
-                INTEGER offset, INTEGER xnnz):
-    cdef DOUBLE sum = 0.0
+cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
+                int offset, int xnnz):
+    cdef double sum = 0.0
     cdef int j
     for j from 0 <= j < xnnz:
         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
     return sum
 
-cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr,
-                INTEGER *X_indices_ptr, INTEGER offset, INTEGER xnnz, DOUBLE c):
+cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
+                int *X_indices_ptr, int offset, int xnnz, double c):
     """Scales example x by constant c and adds it to the weight vector w. 
     """
-    cdef INTEGER j
-    cdef INTEGER idx
-    cdef DOUBLE val
-    cdef DOUBLE innerprod = 0.0
-    cdef DOUBLE xsqnorm = 0.0
+    cdef int j
+    cdef int idx
+    cdef double val
+    cdef double innerprod = 0.0
+    cdef double xsqnorm = 0.0
     for j from 0 <= j < xnnz:
         idx = X_indices_ptr[offset + j]
         val = X_data_ptr[offset + j]
@@ -331,191 +311,19 @@ cdef DOUBLE add(DOUBLE *w_data_ptr, DOUBLE wscale, FLOAT *X_data_ptr,
         w_data_ptr[idx] += val * (c / wscale)    
     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
 
-## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
-##     """ Checked version of dot product. Ignores features in x
-##     with a higher index than dimension of w. 
-##     """
-##     cdef double sum = 0.0
-##     cdef Pair pair
-##     cdef int i
-##     for i from 0 <= i < nnz:
-##         pair = x[i]
-##         if pair.idx < wdim:
-##             sum +=w[pair.idx]*pair.val
-##     return sum
-
-## cdef double add(double *w, double wscale, Pair *x, int nnz, double c):
-##     """Scales example x by constant c and adds it to the weight vector w. 
-##     """
-##     cdef Pair pair
-##     cdef int i
-##     cdef double innerprod = 0.0
-##     cdef double xsqnorm = 0.0
-##     for i from 0 <= i < nnz:
-##         pair = x[i]
-##         innerprod += (w[pair.idx] * pair.val)
-##         xsqnorm += (pair.val*pair.val)
-##         w[pair.idx] += pair.val * (c / wscale)
-        
-##     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
-
-## # ----------------------------------------
-## # Extension type for Stochastic Gradient Descent
-## # ----------------------------------------
-
-## cdef class SGD:
-
-##     cdef int epochs
-##     cdef double reg
-##     cdef LossFunction loss
-##     cdef int norm
-##     cdef double alpha
-    
-##     def __init__(self, loss, reg, epochs = 5, norm = 2, alpha = 0.85):
-##         """
-
-##         :arg loss: The :class:`LossFunction` (default ModifiedHuber) .
-##         :arg reg: The regularization parameter lambda (>0).
-##         :type reg: float.
-##         :arg epochs: The number of iterations through the dataset.
-##         :type epochs: int
-##         :arg norm: Whether to minimize the L1, L2 norm or the Elastic Net.
-##         :type norm: 1 or 2 or 3
-##         :arg alpha: The elastic net penality parameter. A value of 1 amounts to L2 regularization whereas a value of 0 gives L1 penalty. 
-##         :type alpha: float (0 <= alpha <= 1)
-##         """
-##         if loss == None:
-##             raise ValueError("Loss function must not be None.")
-##         if reg < 0.0:
-##             raise ValueError("reg must be larger than 0. ")
-##         if norm not in [1,2,3]:
-##             raise ValueError("norm must be in {1,2,3}. ")
-##         if alpha > 1.0 or alpha < 0.0:
-##             raise ValueError("alpha must be in [0,1]. ")
-##         self.loss = loss
-##         self.reg = reg
-##         self.epochs = epochs
-##         self.norm = norm
-##         self.alpha = alpha
-
-##     def __reduce__(self):
-##         return SGD,(self.loss,self.reg, self.epochs, self.norm, self.alpha)
-
-##     def train(self, model, dataset, verbose = 0, shuffle = False):
-##         """Train `model` on the `dataset` using SGD.
-
-##         :arg model: The :class:`bolt.model.LinearModel` that is going to be trained. 
-##         :arg dataset: The :class:`bolt.io.Dataset`. 
-##         :arg verbose: The verbosity level. If 0 no output to stdout.
-##         :arg shuffle: Whether or not the training data should be shuffled after each epoch. 
-##         """
-##         self._train(model, dataset, verbose, shuffle)
-
-##     cdef void _train(self,model, dataset, verbose, shuffle):
-        
-##         cdef LossFunction loss = self.loss
-##         cdef int m = model.m
-##         cdef int n = dataset.n
-##         cdef double reg = self.reg
-
-##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] w = model.w
-##         # weight vector w as c array
-##         cdef double *wdata = w.data
-##         # the scale of w
-##         cdef double wscale = 1.0
-
-##         # training instance
-##         cdef np.ndarray x = None
-##         cdef Pair *xdata = NULL
-
-##         cdef double y = 0.0
-        
-##         # Variables for penalty term
-##         cdef int norm = self.norm
-##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] q = None
-##         cdef double *qdata = NULL
-##         cdef double u = 0.0
-##         if norm == 1 or norm == 3:
-##             q = np.zeros((m,), dtype = np.float64, order = "c" )
-##             qdata = q.data
-            
-##         cdef double alpha = 1.0
-##         if norm == 1:
-##             alpha = 0.0
-##         elif norm == 3:
-##             alpha = self.alpha
-
-##         # bias term (aka offset or intercept)
-##         cdef int usebias = 1
-##         if model.biasterm == False:
-##             usebias = 0
-
-##         cdef double b = 0.0,p = 0.0, wnorm = 0.0, t = 0.0, update = 0.0,sumloss = 0.0, eta = 0.0
-##         cdef int xnnz = 0, count = 0, i = 0, e = 0
-        
-##         # computing eta0
-##         cdef double typw = sqrt(1.0 / sqrt(reg))
-##         cdef double eta0 = typw /max(1.0,loss.dloss(-typw,1.0))
-##         t = 1.0 / (eta0 * reg)
-##         t1=time()
-##         for e from 0 <= e < self.epochs:
-##             if verbose > 0:
-##                 print("-- Epoch %d" % (e+1))
-##             if shuffle:
-##                 dataset.shuffle()
-##             for x,y in dataset:
-##                 eta = 1.0 / (reg * t)
-##                 xnnz = x.shape[0]
-##                 xdata = x.data
-##                 p = (dot(wdata, xdata, xnnz) * wscale) + b
-##                 sumloss += loss.loss(p,y)
-##                 update = eta * loss.dloss(p,y)
-##                 if update != 0:
-##                     add(wdata, wscale, xdata,
-##                         xnnz,update)
-##                     if usebias == 1:
-##                         b += update * 0.01
-
-##                 if norm != 1:
-##                     wscale *= (1 - alpha * eta * reg)
-##                     if wscale < 1e-9:
-##                         w*=wscale
-##                         wscale = 1
-##                 if norm == 1 or norm == 3:
-##                     u += ((1-alpha) * eta * reg)
-##                     l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
-                
-##                 t += 1
-##                 count += 1
-
-##             # 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,w.nonzero()[0].shape[0],b,count,sumloss/count))
-##                 print("Total training time: %.2f seconds." % (time()-t1))
-
-##         # floating-point under-/overflow check.
-##         if np.any(np.isinf(w)) or np.any(np.isnan(w))or np.isnan(b) or np.isinf(b):
-##             raise ValueError("floating-point under-/overflow occured.")
-##         if norm == 3:
-##             # FIXME rescale naive elastic net coefficient?
-##             model.w = w * wscale #* (1.0 + alpha)
-##         else:
-##             model.w = w * wscale
-##         model.bias = b
-
-## cdef void l1penalty(double wscale, double *w, double *q,
-##                     Pair *x, int nnz, double u):
-##     cdef double z = 0.0
-##     cdef Pair pair
-##     cdef int i,j
-##     for i from 0 <= i < nnz:
-##         pair = x[i]
-##         j = pair.idx
-##         z = w[j]
-##         if (wscale * w[j]) > 0:
-##             w[j] = max(0,w[j] - ((u + q[j])/wscale) )
-##         elif (wscale * w[j]) < 0:
-##             w[j] = min(0,w[j] + ((u - q[j])/wscale) )
-##         q[j] += (wscale * (w[j] - z))
+cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
+                    int *X_indices_ptr, int offset, int xnnz, double u):
+    """Applys the L1 penalty. This implements the truncated gradient approach by [
+    """
+    cdef double z = 0.0
+    cdef int j = 0
+    cdef int idx = 0
+    for j from 0 <= j < xnnz:
+        idx = X_indices_ptr[offset + j]
+        z = w_data_ptr[idx]
+        if (wscale * w_data_ptr[idx]) > 0:
+            w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+        elif (wscale * w_data_ptr[idx]) < 0:
+            w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+        q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
 
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index b4cbf931468d2..197ea9c2b0fea 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -30,7 +30,7 @@ def test_sgd():
     assert_array_equal(clf.coef_, np.zeros((len(clf.coef_),)))
 
 def test_rcv1():
-    ds = bolt.io.MemoryDataset.load("/home/pprett/corpora/rcv1-ccat/test.npy")
+    ds = bolt.io.MemoryDataset.load("/home/peter/corpora/rcv1-ccat/test.npy")
     m, n = ds.n, ds.dim
     X = sparse.lil_matrix((m, n), dtype = np.float32)
     print "Build sparse matrix... ", 
@@ -43,7 +43,9 @@ def test_rcv1():
     print "Fitting model... "
     clf = sgd.sparse.SGD(penalty='l2', alpha = 0.0001, fit_intercept = True)
     clf.fit(X, Y)
-    #clf.score(X,Y)
+    score = clf.score(X,Y)
+    print "training score: ", score
+    print "training error: ", ((1.0 - score) * 100.0)
 
 if __name__ == "__main__":
     test_rcv1()

From 2847e3d3e897758aa6193fe9b3d5b54a2d1af50b Mon Sep 17 00:00:00 2001
From: Peter Prettenhofer 
Date: Sat, 23 Oct 2010 20:40:46 +0200
Subject: [PATCH 04/17] added class encoding. added tests added l1 final
 penalty.

---
 scikits/learn/sgd/base.py                     |   59 +-
 scikits/learn/sgd/sparse/sgd.py               |   60 +-
 .../learn/sgd/sparse/src/sgd_fast_sparse.c    | 6660 ++++++++++-------
 .../learn/sgd/sparse/src/sgd_fast_sparse.pyx  |   33 +-
 scikits/learn/sgd/tests/test_sparse.py        |  120 +-
 5 files changed, 4002 insertions(+), 2930 deletions(-)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index 75c37e0d16ed3..737fe9c4d221f 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -19,12 +19,10 @@ class LinearModel(BaseEstimator):
         The loss function to be used. 
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
-    reg : float
-        The regularization parameter, i.e. tradeoff between loss and penalty.
     alpha : float
-        Constant that multiplies the L1 term. Defaults to 1.0
+        Constant that multiplies the regularization term. Defaults to 0.0001
     rho : float
-        The ElasticNet mixing parameter, with 0 < rho <= 1.
+        The Elastic Net mixing parameter, with 0 < rho <= 1.
     coef_ : ndarray of shape n_features
         The initial coeffients to warm-start the optimization
     intercept_ : float
@@ -32,20 +30,25 @@ class LinearModel(BaseEstimator):
     fit_intercept: bool
         Whether the intercept should be estimated or not. If False, the
         data is assumed to be already centered.
+    n_iter: int
+        The number of passes over the training data (aka epochs).
+    shuffle: bool
+        Whether or not the training data should be shuffled after each epoch.
+	Defaults to False. 
 
     Attributes
     ----------
     `coef_` : array, shape = [n_features]
         Weights asigned to the features.
 
-    `intercept_` : float, shape = [n_class-1]
+    `intercept_` : float
         Constants in decision function.
 
     """
 
     def __init__(self, loss = "hinge", penalty = 'l2', alpha = 0.0001,
 		 rho = 0.85, coef_ = None, intercept_ = 0.0,
-		 fit_intercept = True):
+		 fit_intercept = True, n_iter = 5, shuffle = False):
         self.loss = loss
 	self.penalty = penalty
 	self.alpha = alpha
@@ -53,6 +56,12 @@ def __init__(self, loss = "hinge", penalty = 'l2', alpha = 0.0001,
 	self.coef_ = coef_
 	self.intercept_ = intercept_
         self.fit_intercept = fit_intercept
+	self.n_iter = int(n_iter)
+	if self.n_iter <= 0:
+	    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 = shuffle
 	self._get_loss_function()
 	self._get_penalty_type()
 
@@ -66,41 +75,3 @@ def _get_penalty_type(self):
 		self.rho = 0.0
 	except KeyError:
 	    raise ValueError("The penalty %s is not supported. " % self.penalty)
-
-    def predict(self, X):
-	"""Predict using the linear model
-
-        Parameters
-        ----------
-        X : numpy array of shape [n_samples, n_features]
-
-        Returns
-        -------
-        C : array, shape = [n_samples]
-            Returns predicted class labeles (either 1 or -1 or 0).
-        """
-	X = np.asanyarray(X)
-	# FIXME what if prediction is 0 - break randomly?
-        return np.sign(np.dot(X, self.coef_) + self.intercept_)
-
-    def predict_margin(self, T):
-	"""Predict signed 'distance' to the hyperplane (aka confidence score). 
-
-	If 
-
-        Parameters
-        ----------
-        X : numpy array of shape [n_samples, n_features]
-
-        Returns
-        -------
-        C : array, shape = [n_samples]
-            Returns signed 'distance' to the hyperplane
-        """
-	X = np.asanyarray(X)
-        return np.dot(X, self.coef_) + self.intercept_
-
-    def predict_proba(self, T):
-        # how can this be, logisitic *does* implement this
-        raise NotImplementedError(
-                'sgd does not provide this functionality')
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index 6b5125dc6336a..933ca72d66cb1 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -23,12 +23,10 @@ class SGD(LinearModel, ClassifierMixin):
         The loss function to be used. 
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
-    reg : float
-        The regularization parameter, i.e. tradeoff between loss and penalty.
     alpha : float
-        Constant that multiplies the L1 term. Defaults to 1.0
+        Constant that multiplies the regularization term. Defaults to 0.0001
     rho : float
-        The ElasticNet mixing parameter, with 0 < rho <= 1.
+        The Elastic Net mixing parameter, with 0 < rho <= 1.
     coef_ : ndarray of shape n_features
         The initial coeffients to warm-start the optimization
     intercept_ : float
@@ -36,13 +34,18 @@ class SGD(LinearModel, ClassifierMixin):
     fit_intercept: bool
         Whether the intercept should be estimated or not. If False, the
         data is assumed to be already centered.
+    n_iter: int
+        The number of passes over the training data (aka epochs).
+    shuffle: bool
+        Whether or not the training data should be shuffled after each epoch.
+	Defaults to False. 
 
     Attributes
     ----------
     `coef_` : array, shape = [n_features]
         Weights asigned to the features.
 
-    `intercept_` : float, shape = [n_class-1]
+    `intercept_` : float
         Constants in decision function.
 
     """
@@ -66,16 +69,25 @@ def _set_coef(self, coef_):
             # sparse representation of the fitted coef for the predict method
             self.sparse_coef_ = sparse.csr_matrix(coef_)
 
-    def fit(self, X, Y, n_iter = 5, **params):
+    def fit(self, X, Y, **params):
         """Fit current model with SGD
 
         X is expected to be a sparse matrix. For maximum efficiency, use a
         sparse matrix in CSR format (scipy.sparse.csr_matrix)
         """
         self._set_params(**params)
-	self.n_iter = int(n_iter)
         X = sparse.csr_matrix(X)
         Y = np.asanyarray(Y, dtype = np.float64)
+	classes = np.unique(Y)
+	if len(classes) != 2:
+	    raise ValueError("SGD supports binary classification only.")
+	self.classes = classes
+
+	# encode original class labels as 1 (classes[0]) or -1 (classes[1]). 
+	Y_new = np.ones(Y.shape, dtype = np.float64)
+	Y_new *= -1.0
+	Y_new[Y == classes[0]] = 1.0
+	Y = Y_new
 
         n_samples, n_features = X.shape[0], X.shape[1]
         if self.coef_ is None:
@@ -84,17 +96,20 @@ def fit(self, X, Y, n_iter = 5, **params):
         X_data = np.array(X.data, np.float64, order = "c")
 	X_indices = X.indices
 	X_indptr = X.indptr
-	verbose = 2
-	shuffle = 0
-	print "norm: ", self.penalty_type
-	print "rho: ", self.rho
-	print "alpha:", self.alpha
-	coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_, self.intercept_,
-						      self.loss_function, self.penalty_type,
-						      self.alpha, self.rho, X_data,
+	verbose = 0#2
+	print self.fit_intercept
+	print self.alpha
+	print self.rho
+	coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_,
+						      self.intercept_,
+						      self.loss_function,
+						      self.penalty_type,
+						      self.alpha, self.rho,
+						      X_data,
 						      X_indices, X_indptr, Y,
-						      self.n_iter, int(self.fit_intercept),
-						      verbose, int(shuffle))
+						      self.n_iter,
+						      int(self.fit_intercept),
+						      verbose, int(self.shuffle))
 
         # update self.coef_ and self.sparse_coef_ consistently
         self._set_coef(coef_)
@@ -114,7 +129,11 @@ def predict(self, X):
         -------
         array, shape = [n_samples] with the predicted class labels (either -1, 1, or 0).
         """        
-        return np.sign(self.predict_margin(X))
+        sign = np.sign(self.predict_margin(X))
+	sign[sign == 1] = 0
+	sign[sign == -1] = 1
+	# FIXME what if sign == 0? break randomly?
+	return np.array([self.classes[p] for p in sign])
 
     def predict_margin(self, X):
         """Predict signed 'distance' to the hyperplane (aka confidence score). 
@@ -132,3 +151,8 @@ def predict_margin(self, X):
             X = sparse.csr_matrix(X)
         return np.ravel(np.dot(self.sparse_coef_, X.T).todense()
                         + self.intercept_)
+
+    def predict_proba(self, X):
+        # how can this be, logisitic *does* implement this
+        raise NotImplementedError(
+                'sgd does not provide this functionality')
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
index 7218d06e9b551..173a399b7526d 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
@@ -1,11 +1,12 @@
-/* Generated by Cython 0.11.2 on Tue Oct 19 16:25:58 2010 */
+/* Generated by Cython 0.12.1 on Sat Oct 23 20:35:43 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
 #include "structmember.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#endif
+#else
+
 #ifndef PY_LONG_LONG
   #define PY_LONG_LONG LONG_LONG
 #endif
@@ -15,7 +16,9 @@
 #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
@@ -25,7 +28,9 @@
   #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)
   #define PyNumber_Index(o)    PyNumber_Int(o)
   #define PyIndex_Check(o)     PyNumber_Check(o)
+  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
 #endif
+
 #if PY_VERSION_HEX < 0x02060000
   #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
   #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
@@ -35,17 +40,17 @@
   #define PyType_Modified(t)
 
   typedef struct {
-       void *buf;
-       PyObject *obj;
-       Py_ssize_t len;
-       Py_ssize_t itemsize;
-       int readonly;
-       int ndim;
-       char *format;
-       Py_ssize_t *shape;
-       Py_ssize_t *strides;
-       Py_ssize_t *suboffsets;
-       void *internal;
+     void *buf;
+     PyObject *obj;
+     Py_ssize_t len;
+     Py_ssize_t itemsize;
+     int readonly;
+     int ndim;
+     char *format;
+     Py_ssize_t *shape;
+     Py_ssize_t *strides;
+     Py_ssize_t *suboffsets;
+     void *internal;
   } Py_buffer;
 
   #define PyBUF_SIMPLE 0
@@ -59,22 +64,32 @@
   #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
 
 #endif
+
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define Py_TPFLAGS_CHECKTYPES 0
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
+
 #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
-  #define PyString_Type                PyBytes_Type
-  #define PyString_CheckExact          PyBytes_CheckExact
+  #define PyString_Type                PyUnicode_Type
+  #define PyString_CheckExact          PyUnicode_CheckExact
+#else
+  #define PyBytes_Type                 PyString_Type
+  #define PyBytes_CheckExact           PyString_CheckExact
+#endif
+
+#if PY_MAJOR_VERSION >= 3
   #define PyInt_Type                   PyLong_Type
   #define PyInt_Check(op)              PyLong_Check(op)
   #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
@@ -89,13 +104,17 @@
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
   #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
 #else
   #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
-  #define PyBytes_Type                 PyString_Type
+  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
+
 #endif
+
 #if PY_MAJOR_VERSION >= 3
   #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
 #endif
+
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -109,6 +128,7 @@
 #else
   #define _USE_MATH_DEFINES
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
@@ -118,6 +138,7 @@
   #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
   #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
 #endif
+
 #if PY_VERSION_HEX < 0x02050000
   #define __Pyx_NAMESTR(n) ((char *)(n))
   #define __Pyx_DOCSTR(n)  ((char *)(n))
@@ -133,24 +154,22 @@
 #include 
 #define __PYX_HAVE_API__sgd_fast_sparse
 #include "stdlib.h"
+#include "stdio.h"
 #include "numpy/arrayobject.h"
+#include "numpy/ufuncobject.h"
 #include "math.h"
-#define __PYX_USE_C99_COMPLEX defined(_Complex_I)
 
-
-#ifdef __GNUC__
-#define INLINE __inline__
-#elif _WIN32
-#define INLINE __inline
-#else
-#define INLINE 
+#ifndef CYTHON_INLINE
+  #if defined(__GNUC__)
+    #define CYTHON_INLINE __inline__
+  #elif defined(_MSC_VER)
+    #define CYTHON_INLINE __inline
+  #else
+    #define CYTHON_INLINE 
+  #endif
 #endif
 
-typedef struct {PyObject **p; char *s; long n; char is_unicode; char intern; char is_identifier;} __Pyx_StringTabEntry; /*proto*/
-
-
-
-static int __pyx_skip_dispatch = 0;
+typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
 
 
 /* Type Conversion Predeclarations */
@@ -165,9 +184,12 @@ static int __pyx_skip_dispatch = 0;
 #define __Pyx_PyBytes_AsString            PyBytes_AsString
 #endif
 
+#define __Pyx_PyBytes_FromUString(s)      __Pyx_PyBytes_FromString((char*)s)
+#define __Pyx_PyBytes_AsUString(s)        ((unsigned char*) __Pyx_PyBytes_AsString(s))
+
 #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
-static INLINE int __Pyx_PyObject_IsTrue(PyObject*);
-static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 
 #if !defined(T_PYSSIZET)
 #if PY_VERSION_HEX < 0x02050000
@@ -184,6 +206,40 @@ static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 #endif
 #endif
 
+
+#if !defined(T_ULONGLONG)
+#define __Pyx_T_UNSIGNED_INT(x) \
+        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
+        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
+        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
+        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : -1))))
+#else
+#define __Pyx_T_UNSIGNED_INT(x) \
+        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
+        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
+        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
+        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : \
+        ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
+#endif
+#if !defined(T_LONGLONG)
+#define __Pyx_T_SIGNED_INT(x) \
+        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
+        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
+        ((sizeof(x) == sizeof(int))   ? T_INT : \
+        ((sizeof(x) == sizeof(long))  ? T_LONG : -1))))
+#else
+#define __Pyx_T_SIGNED_INT(x) \
+        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
+        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
+        ((sizeof(x) == sizeof(int))   ? T_INT : \
+        ((sizeof(x) == sizeof(long))  ? T_LONG : \
+        ((sizeof(x) == sizeof(PY_LONG_LONG))   ? T_LONGLONG : -1)))))
+#endif
+
+#define __Pyx_T_FLOATING(x) \
+        ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
+        ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
+
 #if !defined(T_SIZET)
 #if !defined(T_ULONGLONG)
 #define T_SIZET \
@@ -197,9 +253,9 @@ static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 #endif
 #endif
 
-static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
-static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
+static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 
@@ -221,6 +277,7 @@ static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 static PyObject *__pyx_m;
 static PyObject *__pyx_b;
 static PyObject *__pyx_empty_tuple;
+static PyObject *__pyx_empty_bytes;
 static int __pyx_lineno;
 static int __pyx_clineno = 0;
 static const char * __pyx_cfilenm= __FILE__;
@@ -228,710 +285,659 @@ static const char *__pyx_filename;
 static const char **__pyx_f;
 
 
-#ifdef CYTHON_REFNANNY
-typedef struct {
-  void (*INCREF)(void*, PyObject*, int);
-  void (*DECREF)(void*, PyObject*, int);
-  void (*GOTREF)(void*, PyObject*, int);
-  void (*GIVEREF)(void*, PyObject*, int);
-  void* (*NewContext)(const char*, int, const char*);
-  void (*FinishContext)(void**);
-} __Pyx_RefnannyAPIStruct;
-static __Pyx_RefnannyAPIStruct *__Pyx_Refnanny = NULL;
-#define __Pyx_ImportRefcountAPI(name)   (__Pyx_RefnannyAPIStruct *) PyCObject_Import((char *)name, (char *)"RefnannyAPI")
-#define __Pyx_INCREF(r) __Pyx_Refnanny->INCREF(__pyx_refchk, (PyObject *)(r), __LINE__)
-#define __Pyx_DECREF(r) __Pyx_Refnanny->DECREF(__pyx_refchk, (PyObject *)(r), __LINE__)
-#define __Pyx_GOTREF(r) __Pyx_Refnanny->GOTREF(__pyx_refchk, (PyObject *)(r), __LINE__)
-#define __Pyx_GIVEREF(r) __Pyx_Refnanny->GIVEREF(__pyx_refchk, (PyObject *)(r), __LINE__)
-#define __Pyx_XDECREF(r) if((r) == NULL) ; else __Pyx_DECREF(r)
-#define __Pyx_SetupRefcountContext(name)   void* __pyx_refchk = __Pyx_Refnanny->NewContext((name), __LINE__, __FILE__)
-#define __Pyx_FinishRefcountContext()   __Pyx_Refnanny->FinishContext(&__pyx_refchk)
-#else
-#define __Pyx_INCREF(r) Py_INCREF(r)
-#define __Pyx_DECREF(r) Py_DECREF(r)
-#define __Pyx_GOTREF(r)
-#define __Pyx_GIVEREF(r)
-#define __Pyx_XDECREF(r) Py_XDECREF(r)
-#define __Pyx_SetupRefcountContext(name)
-#define __Pyx_FinishRefcountContext()
-#endif /* CYTHON_REFNANNY */
-#define __Pyx_XGIVEREF(r) if((r) == NULL) ; else __Pyx_GIVEREF(r)
-#define __Pyx_XGOTREF(r) if((r) == NULL) ; else __Pyx_GOTREF(r)
+#if !defined(CYTHON_CCOMPLEX)
+  #if defined(__cplusplus)
+    #define CYTHON_CCOMPLEX 1
+  #elif defined(_Complex_I)
+    #define CYTHON_CCOMPLEX 1
+  #else
+    #define CYTHON_CCOMPLEX 0
+  #endif
+#endif
 
-static void __Pyx_RaiseDoubleKeywordsError(
-    const char* func_name, PyObject* kw_name); /*proto*/
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    #include 
+  #else
+    #include 
+  #endif
+#endif
 
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
+#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)
+  #undef _Complex_I
+  #define _Complex_I 1.0fj
+#endif
 
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
+typedef npy_int8 __pyx_t_5numpy_int8_t;
 
-/* Run-time type information about structs used with buffers */
-struct __Pyx_StructField_;
+typedef npy_int16 __pyx_t_5numpy_int16_t;
 
-typedef struct {
-  const char* name; /* for error messages only */
-  struct __Pyx_StructField_* fields;
-  size_t size;     /* sizeof(type) */
-  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
-} __Pyx_TypeInfo;
+typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-typedef struct __Pyx_StructField_ {
-  __Pyx_TypeInfo* type;
-  const char* name;
-  size_t offset;
-} __Pyx_StructField;
+typedef npy_int64 __pyx_t_5numpy_int64_t;
 
-typedef struct {
-  __Pyx_StructField* field;
-  size_t parent_offset;
-} __Pyx_BufFmt_StackElem;
+typedef npy_uint8 __pyx_t_5numpy_uint8_t;
 
+typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
-static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
+typedef npy_uint32 __pyx_t_5numpy_uint32_t;
 
-static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
+typedef npy_uint64 __pyx_t_5numpy_uint64_t;
 
-static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
-#define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0)
-#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
+typedef npy_float32 __pyx_t_5numpy_float32_t;
 
+typedef npy_float64 __pyx_t_5numpy_float64_t;
 
-static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
-    PyObject *r;
-    if (!j) return NULL;
-    r = PyObject_GetItem(o, j);
-    Py_DECREF(j);
-    return r;
-}
+typedef npy_long __pyx_t_5numpy_int_t;
 
+typedef npy_longlong __pyx_t_5numpy_long_t;
 
-#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+typedef npy_intp __pyx_t_5numpy_intp_t;
 
-static INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
-            PyObject *r = PyList_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
-    }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
+typedef npy_uintp __pyx_t_5numpy_uintp_t;
 
-#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+typedef npy_ulong __pyx_t_5numpy_uint_t;
 
-static INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    if (likely(o != Py_None)) {
-        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-            PyObject *r = PyTuple_GET_ITEM(o, i);
-            Py_INCREF(r);
-            return r;
-        }
-        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
-            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
-            Py_INCREF(r);
-            return r;
-        }
-    }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-}
+typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+
+typedef npy_double __pyx_t_5numpy_float_t;
 
+typedef npy_double __pyx_t_5numpy_double_t;
 
-#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
-                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
+typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
 
-static INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
-    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) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
-        r = PyTuple_GET_ITEM(o, i);
-        Py_INCREF(r);
-    }
-    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
-        r = PySequence_GetItem(o, i);
-    }
-    else {
-        r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
-    }
-    return r;
-}
+typedef __pyx_t_5numpy_float64_t __pyx_t_15sgd_fast_sparse_DOUBLE;
 
-static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+typedef __pyx_t_5numpy_int32_t __pyx_t_15sgd_fast_sparse_INTEGER;
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact); /*proto*/
-#if PY_MAJOR_VERSION < 3
-static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
-static void __Pyx_ReleaseBuffer(Py_buffer *view);
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    typedef ::std::complex< float > __pyx_t_float_complex;
+  #else
+    typedef float _Complex __pyx_t_float_complex;
+  #endif
 #else
-#define __Pyx_GetBuffer PyObject_GetBuffer
-#define __Pyx_ReleaseBuffer PyBuffer_Release
+    typedef struct { float real, imag; } __pyx_t_float_complex;
 #endif
 
-Py_ssize_t __Pyx_zeros[] = {0};
-Py_ssize_t __Pyx_minusones[] = {-1};
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    typedef ::std::complex< double > __pyx_t_double_complex;
+  #else
+    typedef double _Complex __pyx_t_double_complex;
+  #endif
+#else
+    typedef struct { double real, imag; } __pyx_t_double_complex;
+#endif
 
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
+/* Type declarations */
 
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
 
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
 
-static int __Pyx_Print(PyObject *, int); /*proto*/
-#if PY_MAJOR_VERSION >= 3
-static PyObject* __pyx_print = 0;
-static PyObject* __pyx_print_kwargs = 0;
-#endif
+typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-static int __Pyx_PrintOne(PyObject *o); /*proto*/
+typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-#if __PYX_USE_C99_COMPLEX
-    #define __Pyx_REAL_PART(z) __real__(z)
-    #define __Pyx_IMAG_PART(z) __imag__(z)
-#else
-    #define __Pyx_REAL_PART(z) ((z).real)
-    #define __Pyx_IMAG_PART(z) ((z).imag)
-#endif
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+ * # ----------------------------------------
+ * 
+ * cdef class LossFunction:             # <<<<<<<<<<<<<<
+ *     """Base class for convex loss functions"""
+ *     cpdef double loss(self, double p, double y):
+ */
 
-#define __pyx_PyObject_from_complex(z) PyComplex_FromDoubles((double)__Pyx_REAL_PART(z), (double)__Pyx_IMAG_PART(z))
+struct __pyx_obj_15sgd_fast_sparse_LossFunction {
+  PyObject_HEAD
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
+};
 
-#if __PYX_USE_C99_COMPLEX
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+ *         raise NotImplementedError()
+ * 
+ * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for regression."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-    typedef float _Complex __pyx_t_float_complex;
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
-      return x + y*(__pyx_t_float_complex)_Complex_I;
-    }
-    
-    #define __pyx_t_float_complex_is_zero(a) ((a) == 0)
-    #define __pyx_t_float_complex_eq(a, b) ((a) == (b))
-    #define __pyx_t_float_complex_add(a, b) ((a)+(b))
-    #define __pyx_t_float_complex_sub(a, b) ((a)-(b))
-    #define __pyx_t_float_complex_mul(a, b) ((a)*(b))
-    #define __pyx_t_float_complex_div(a, b) ((a)/(b))
-    #define __pyx_t_float_complex_neg(a) (-(a))
+struct __pyx_obj_15sgd_fast_sparse_Regression {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
 
-#else
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return SquaredError,()
+ * 
+ * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-    typedef struct { float real, imag; } __pyx_t_float_complex;
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
-      __pyx_t_float_complex c; c.real = x; c.imag = y; return c;
-    }
-    
-    static INLINE int __pyx_t_float_complex_is_zero(__pyx_t_float_complex a) {
-       return (a.real == 0) & (a.imag == 0);
-    }
+struct __pyx_obj_15sgd_fast_sparse_Huber {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+  double c;
+};
 
-    static INLINE int __pyx_t_float_complex_eq(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-       return (a.real == b.real) & (a.imag == b.imag);
-    }
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+ *         return Log,()
+ * 
+ * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_add(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real + b.real;
-        z.imag = a.imag + b.imag;
-        return z;
-    }
+struct __pyx_obj_15sgd_fast_sparse_SquaredError {
+  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
+};
 
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_sub(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real - b.real;
-        z.imag = a.imag - b.imag;
-        return z;
-    }
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+ * 
+ * 
+ * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for classification."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_mul(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        z.real = a.real * b.real - a.imag * b.imag;
-        z.imag = a.real * b.imag + a.imag * b.real;
-        return z;
-    }
-
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_div(__pyx_t_float_complex a, __pyx_t_float_complex b) {
-        __pyx_t_float_complex z;
-        float denom = b.real*b.real + b.imag*b.imag;
-        z.real = (a.real * b.real + a.imag * b.imag) / denom;
-        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
-        return z;
-    }
-
-    static INLINE __pyx_t_float_complex __pyx_t_float_complex_neg(__pyx_t_float_complex a) {
-        __pyx_t_float_complex z;
-        z.real = -a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-
-#endif
-
-#if __PYX_USE_C99_COMPLEX
-
-    typedef double _Complex __pyx_t_double_complex;
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
-      return x + y*(__pyx_t_double_complex)_Complex_I;
-    }
-    
-    #define __pyx_t_double_complex_is_zero(a) ((a) == 0)
-    #define __pyx_t_double_complex_eq(a, b) ((a) == (b))
-    #define __pyx_t_double_complex_add(a, b) ((a)+(b))
-    #define __pyx_t_double_complex_sub(a, b) ((a)-(b))
-    #define __pyx_t_double_complex_mul(a, b) ((a)*(b))
-    #define __pyx_t_double_complex_div(a, b) ((a)/(b))
-    #define __pyx_t_double_complex_neg(a) (-(a))
-
-#else
-
-    typedef struct { double real, imag; } __pyx_t_double_complex;
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
-      __pyx_t_double_complex c; c.real = x; c.imag = y; return c;
-    }
-    
-    static INLINE int __pyx_t_double_complex_is_zero(__pyx_t_double_complex a) {
-       return (a.real == 0) & (a.imag == 0);
-    }
-
-    static INLINE int __pyx_t_double_complex_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-       return (a.real == b.real) & (a.imag == b.imag);
-    }
-
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_add(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real + b.real;
-        z.imag = a.imag + b.imag;
-        return z;
-    }
-
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_sub(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real - b.real;
-        z.imag = a.imag - b.imag;
-        return z;
-    }
-
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_mul(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        z.real = a.real * b.real - a.imag * b.imag;
-        z.imag = a.real * b.imag + a.imag * b.real;
-        return z;
-    }
-
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_div(__pyx_t_double_complex a, __pyx_t_double_complex b) {
-        __pyx_t_double_complex z;
-        double denom = b.real*b.real + b.imag*b.imag;
-        z.real = (a.real * b.real + a.imag * b.imag) / denom;
-        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
-        return z;
-    }
-
-    static INLINE __pyx_t_double_complex __pyx_t_double_complex_neg(__pyx_t_double_complex a) {
-        __pyx_t_double_complex z;
-        z.real = -a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-
-#endif
-
-#if __PYX_USE_C99_COMPLEX
-
-    typedef long double _Complex __pyx_t_long__double_complex;
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_from_parts(long double x, long double y) {
-      return x + y*(__pyx_t_long__double_complex)_Complex_I;
-    }
-    
-    #define __pyx_t_long__double_complex_is_zero(a) ((a) == 0)
-    #define __pyx_t_long__double_complex_eq(a, b) ((a) == (b))
-    #define __pyx_t_long__double_complex_add(a, b) ((a)+(b))
-    #define __pyx_t_long__double_complex_sub(a, b) ((a)-(b))
-    #define __pyx_t_long__double_complex_mul(a, b) ((a)*(b))
-    #define __pyx_t_long__double_complex_div(a, b) ((a)/(b))
-    #define __pyx_t_long__double_complex_neg(a) (-(a))
-
-#else
-
-    typedef struct { long double real, imag; } __pyx_t_long__double_complex;
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_from_parts(long double x, long double y) {
-      __pyx_t_long__double_complex c; c.real = x; c.imag = y; return c;
-    }
-    
-    static INLINE int __pyx_t_long__double_complex_is_zero(__pyx_t_long__double_complex a) {
-       return (a.real == 0) & (a.imag == 0);
-    }
-
-    static INLINE int __pyx_t_long__double_complex_eq(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
-       return (a.real == b.real) & (a.imag == b.imag);
-    }
-
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_add(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
-        __pyx_t_long__double_complex z;
-        z.real = a.real + b.real;
-        z.imag = a.imag + b.imag;
-        return z;
-    }
-
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_sub(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
-        __pyx_t_long__double_complex z;
-        z.real = a.real - b.real;
-        z.imag = a.imag - b.imag;
-        return z;
-    }
-
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_mul(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
-        __pyx_t_long__double_complex z;
-        z.real = a.real * b.real - a.imag * b.imag;
-        z.imag = a.real * b.imag + a.imag * b.real;
-        return z;
-    }
-
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_div(__pyx_t_long__double_complex a, __pyx_t_long__double_complex b) {
-        __pyx_t_long__double_complex z;
-        long double denom = b.real*b.real + b.imag*b.imag;
-        z.real = (a.real * b.real + a.imag * b.imag) / denom;
-        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
-        return z;
-    }
-
-    static INLINE __pyx_t_long__double_complex __pyx_t_long__double_complex_neg(__pyx_t_long__double_complex a) {
-        __pyx_t_long__double_complex z;
-        z.real = -a.real;
-        z.imag = -a.imag;
-        return z;
-    }
-
-#endif
-
-static INLINE int __Pyx_StrEq(const char *, const char *); /*proto*/
+struct __pyx_obj_15sgd_fast_sparse_Classification {
+  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
+};
 
-static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+ *         return ModifiedHuber,()
+ * 
+ * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
+ *     """SVM classification loss for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
+struct __pyx_obj_15sgd_fast_sparse_Hinge {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+ *         raise NotImplementedError()
+ * 
+ * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
+ *     """Modified Huber loss function for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-static INLINE char __Pyx_PyInt_AsChar(PyObject *);
+struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-static INLINE short __Pyx_PyInt_AsShort(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+ * 
+ * 
+ * cdef class Log(Classification):             # <<<<<<<<<<<<<<
+ *     """Logistic regression loss for binary classification
+ *     tasks with y in {-1,1}.
+ */
 
-static INLINE int __Pyx_PyInt_AsInt(PyObject *);
+struct __pyx_obj_15sgd_fast_sparse_Log {
+  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
+};
 
-static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
 
-static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+ * # ----------------------------------------
+ * 
+ * cdef class LossFunction:             # <<<<<<<<<<<<<<
+ *     """Base class for convex loss functions"""
+ *     cpdef double loss(self, double p, double y):
+ */
 
-static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
+  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
 
-static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
 
-static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+ *         raise NotImplementedError()
+ * 
+ * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for regression."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-static INLINE long __Pyx_PyInt_AsLong(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
 
-static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
 
-static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+ *         return Log,()
+ * 
+ * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
+struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
 
-static void __Pyx_WriteUnraisable(const char *name); /*proto*/
 
-static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return SquaredError,()
+ * 
+ * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
+ *     """
+ *     """
+ */
 
-static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size);  /*proto*/
+struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
 
-static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
 
-static void __Pyx_AddTraceback(const char *funcname); /*proto*/
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+ * 
+ * 
+ * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
+ *     """Base class for loss functions for classification."""
+ *     cpdef double loss(self,double p,double y):
+ */
 
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
 
-/* Type declarations */
 
-typedef npy_int8 __pyx_t_5numpy_int8_t;
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+ *         return ModifiedHuber,()
+ * 
+ * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
+ *     """SVM classification loss for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-typedef npy_int16 __pyx_t_5numpy_int16_t;
+struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
 
-typedef npy_int32 __pyx_t_5numpy_int32_t;
 
-typedef npy_int64 __pyx_t_5numpy_int64_t;
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+ *         raise NotImplementedError()
+ * 
+ * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
+ *     """Modified Huber loss function for binary
+ *     classification tasks with y in {-1,1}.
+ */
 
-typedef npy_uint8 __pyx_t_5numpy_uint8_t;
+struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
 
-typedef npy_uint16 __pyx_t_5numpy_uint16_t;
 
-typedef npy_uint32 __pyx_t_5numpy_uint32_t;
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+ * 
+ * 
+ * cdef class Log(Classification):             # <<<<<<<<<<<<<<
+ *     """Logistic regression loss for binary classification
+ *     tasks with y in {-1,1}.
+ */
 
-typedef npy_uint64 __pyx_t_5numpy_uint64_t;
+struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
+  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
+};
+static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_sparse_Log;
 
-typedef npy_float32 __pyx_t_5numpy_float32_t;
+#ifndef CYTHON_REFNANNY
+  #define CYTHON_REFNANNY 0
+#endif
 
-typedef npy_float64 __pyx_t_5numpy_float64_t;
+#if CYTHON_REFNANNY
+  typedef struct {
+    void (*INCREF)(void*, PyObject*, int);
+    void (*DECREF)(void*, PyObject*, int);
+    void (*GOTREF)(void*, PyObject*, int);
+    void (*GIVEREF)(void*, PyObject*, int);
+    void* (*SetupContext)(const char*, int, const char*);
+    void (*FinishContext)(void**);
+  } __Pyx_RefNannyAPIStruct;
+  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
+  static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {
+    PyObject *m = NULL, *p = NULL;
+    void *r = NULL;
+    m = PyImport_ImportModule((char *)modname);
+    if (!m) goto end;
+    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
+    if (!p) goto end;
+    r = PyLong_AsVoidPtr(p);
+  end:
+    Py_XDECREF(p);
+    Py_XDECREF(m);
+    return (__Pyx_RefNannyAPIStruct *)r;
+  }
+  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
+  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
+  #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
+  #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)
+#else
+  #define __Pyx_RefNannySetupContext(name)
+  #define __Pyx_RefNannyFinishContext()
+  #define __Pyx_INCREF(r) Py_INCREF(r)
+  #define __Pyx_DECREF(r) Py_DECREF(r)
+  #define __Pyx_GOTREF(r)
+  #define __Pyx_GIVEREF(r)
+  #define __Pyx_XDECREF(r) Py_XDECREF(r)
+#endif /* CYTHON_REFNANNY */
+#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
+#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)
 
-typedef npy_complex64 __pyx_t_5numpy_complex64_t;
+static void __Pyx_RaiseDoubleKeywordsError(
+    const char* func_name, PyObject* kw_name); /*proto*/
 
-typedef npy_complex128 __pyx_t_5numpy_complex128_t;
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
 
-typedef npy_long __pyx_t_5numpy_int_t;
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
 
-typedef npy_longlong __pyx_t_5numpy_long_t;
+/* Run-time type information about structs used with buffers */
+struct __Pyx_StructField_;
 
-typedef npy_ulong __pyx_t_5numpy_uint_t;
+typedef struct {
+  const char* name; /* for error messages only */
+  struct __Pyx_StructField_* fields;
+  size_t size;     /* sizeof(type) */
+  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject */
+} __Pyx_TypeInfo;
 
-typedef npy_ulonglong __pyx_t_5numpy_ulong_t;
+typedef struct __Pyx_StructField_ {
+  __Pyx_TypeInfo* type;
+  const char* name;
+  size_t offset;
+} __Pyx_StructField;
 
-typedef npy_double __pyx_t_5numpy_float_t;
+typedef struct {
+  __Pyx_StructField* field;
+  size_t parent_offset;
+} __Pyx_BufFmt_StackElem;
 
-typedef npy_double __pyx_t_5numpy_double_t;
 
-typedef npy_longdouble __pyx_t_5numpy_longdouble_t;
+static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);
+static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);
 
-typedef npy_cfloat __pyx_t_5numpy_cfloat_t;
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
-typedef npy_cdouble __pyx_t_5numpy_cdouble_t;
+static void __Pyx_RaiseBufferFallbackError(void); /*proto*/
+#define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0)
+#define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0)
 
-typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
-typedef npy_cdouble __pyx_t_5numpy_complex_t;
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
+    PyObject *r;
+    if (!j) return NULL;
+    r = PyObject_GetItem(o, j);
+    Py_DECREF(j);
+    return r;
+}
 
-typedef __pyx_t_5numpy_float64_t __pyx_t_15sgd_fast_sparse_DOUBLE;
 
-typedef __pyx_t_5numpy_int32_t __pyx_t_15sgd_fast_sparse_INTEGER;
+#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
- * # ----------------------------------------
- * 
- * cdef class LossFunction:             # <<<<<<<<<<<<<<
- *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
- */
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
+            PyObject *r = PyList_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+}
 
-struct __pyx_obj_15sgd_fast_sparse_LossFunction {
-  PyObject_HEAD
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
-};
+#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
- *         raise NotImplementedError()
- * 
- * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
- */
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    if (likely(o != Py_None)) {
+        if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+            PyObject *r = PyTuple_GET_ITEM(o, i);
+            Py_INCREF(r);
+            return r;
+        }
+        else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {
+            PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);
+            Py_INCREF(r);
+            return r;
+        }
+    }
+    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+}
 
-struct __pyx_obj_15sgd_fast_sparse_Regression {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
- *         return SquaredError,()
- * 
- * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
+                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-struct __pyx_obj_15sgd_fast_sparse_Huber {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-  double c;
-};
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+    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) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
+        r = PyTuple_GET_ITEM(o, i);
+        Py_INCREF(r);
+    }
+    else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
+        r = PySequence_GetItem(o, i);
+    }
+    else {
+        r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+    }
+    return r;
+}
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
- *         return Log,()
- * 
- * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-struct __pyx_obj_15sgd_fast_sparse_SquaredError {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-};
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
- * 
- * 
- * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
- */
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void);
 
-struct __pyx_obj_15sgd_fast_sparse_Classification {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
+static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
+static int __Pyx_EndUnpack(PyObject *); /*proto*/
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
- *         return ModifiedHuber,()
- * 
- * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
- */
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
 
-struct __pyx_obj_15sgd_fast_sparse_Hinge {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
- *         raise NotImplementedError()
- * 
- * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
- */
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact); /*proto*/
+#if PY_MAJOR_VERSION < 3
+static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
+static void __Pyx_ReleaseBuffer(Py_buffer *view);
+#else
+#define __Pyx_GetBuffer PyObject_GetBuffer
+#define __Pyx_ReleaseBuffer PyBuffer_Release
+#endif
 
-struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+Py_ssize_t __Pyx_zeros[] = {0};
+Py_ssize_t __Pyx_minusones[] = {-1};
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
- * 
- * 
- * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
- */
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
 
-struct __pyx_obj_15sgd_fast_sparse_Log {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
 
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
- * # ----------------------------------------
- * 
- * cdef class LossFunction:             # <<<<<<<<<<<<<<
- *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
- */
+static int __Pyx_Print(PyObject *, int); /*proto*/
+#if PY_MAJOR_VERSION >= 3
+static PyObject* __pyx_print = 0;
+static PyObject* __pyx_print_kwargs = 0;
+#endif
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
-  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
+static int __Pyx_PrintOne(PyObject *o); /*proto*/
 
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    #define __Pyx_CREAL(z) ((z).real())
+    #define __Pyx_CIMAG(z) ((z).imag())
+  #else
+    #define __Pyx_CREAL(z) (__real__(z))
+    #define __Pyx_CIMAG(z) (__imag__(z))
+  #endif
+#else
+    #define __Pyx_CREAL(z) ((z).real)
+    #define __Pyx_CIMAG(z) ((z).imag)
+#endif
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
- *         raise NotImplementedError()
- * 
- * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
- */
+#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX
+    #define __Pyx_SET_CREAL(z,x) ((z).real(x))
+    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))
+#else
+    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)
+    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)
+#endif
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
+static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);
+
+#if CYTHON_CCOMPLEX
+    #define __Pyx_c_eqf(a, b)   ((a)==(b))
+    #define __Pyx_c_sumf(a, b)  ((a)+(b))
+    #define __Pyx_c_difff(a, b) ((a)-(b))
+    #define __Pyx_c_prodf(a, b) ((a)*(b))
+    #define __Pyx_c_quotf(a, b) ((a)/(b))
+    #define __Pyx_c_negf(a)     (-(a))
+  #ifdef __cplusplus
+    #define __Pyx_c_is_zerof(z) ((z)==(float)0)
+    #define __Pyx_c_conjf(z)    (::std::conj(z))
+    /*#define __Pyx_c_absf(z)     (::std::abs(z))*/
+  #else
+    #define __Pyx_c_is_zerof(z) ((z)==0)
+    #define __Pyx_c_conjf(z)    (conjf(z))
+    /*#define __Pyx_c_absf(z)     (cabsf(z))*/
+ #endif
+#else
+    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);
+    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);
+    /*static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);*/
+#endif
 
+static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);
+
+#if CYTHON_CCOMPLEX
+    #define __Pyx_c_eq(a, b)   ((a)==(b))
+    #define __Pyx_c_sum(a, b)  ((a)+(b))
+    #define __Pyx_c_diff(a, b) ((a)-(b))
+    #define __Pyx_c_prod(a, b) ((a)*(b))
+    #define __Pyx_c_quot(a, b) ((a)/(b))
+    #define __Pyx_c_neg(a)     (-(a))
+  #ifdef __cplusplus
+    #define __Pyx_c_is_zero(z) ((z)==(double)0)
+    #define __Pyx_c_conj(z)    (::std::conj(z))
+    /*#define __Pyx_c_abs(z)     (::std::abs(z))*/
+  #else
+    #define __Pyx_c_is_zero(z) ((z)==0)
+    #define __Pyx_c_conj(z)    (conj(z))
+    /*#define __Pyx_c_abs(z)     (cabs(z))*/
+ #endif
+#else
+    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);
+    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);
+    /*static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);*/
+#endif
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
- *         return Log,()
- * 
- * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
+static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
 
+static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
- *         return SquaredError,()
- * 
- * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
- */
+static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
+static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
 
+static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
- * 
- * 
- * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
- *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
- */
+static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
+static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
 
+static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
- *         return ModifiedHuber,()
- * 
- * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
- */
+static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
+static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
 
+static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
- *         raise NotImplementedError()
- * 
- * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
- */
+static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
+static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
 
+static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
- * 
- * 
- * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
- */
+static void __Pyx_WriteUnraisable(const char *name); /*proto*/
 
-struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_sparse_Log;
+static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
+
+static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict);  /*proto*/
+
+static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
+
+static void __Pyx_AddTraceback(const char *funcname); /*proto*/
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
 /* Module declarations from python_buffer */
 
+/* Module declarations from python_ref */
+
 /* Module declarations from stdlib */
 
+/* Module declarations from stdio */
+
 /* Module declarations from numpy */
 
 /* Module declarations from numpy */
 
 static PyTypeObject *__pyx_ptype_5numpy_dtype = 0;
+static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;
+static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;
 static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;
-static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
+static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/
+static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/
+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 */
 
 /* Module declarations from sgd_fast_sparse */
@@ -944,166 +950,184 @@ static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Hinge = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Log = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_SquaredError = 0;
 static PyTypeObject *__pyx_ptype_15sgd_fast_sparse_Huber = 0;
-static INLINE double __pyx_f_15sgd_fast_sparse_max(double, double); /*proto*/
-static INLINE double __pyx_f_15sgd_fast_sparse_min(double, double); /*proto*/
+static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double, double); /*proto*/
+static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double, double); /*proto*/
 static double __pyx_f_15sgd_fast_sparse_dot(double *, double *, int *, int, int); /*proto*/
 static double __pyx_f_15sgd_fast_sparse_add(double *, double, double *, int *, int, int, double); /*proto*/
 static void __pyx_f_15sgd_fast_sparse_l1penalty(double *, double, double *, int *, int, int, double); /*proto*/
+static void __pyx_f_15sgd_fast_sparse_finall1penalty(double *, double, unsigned int, double *, double); /*proto*/
 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 "sgd_fast_sparse"
 int __pyx_module_is_main_sgd_fast_sparse = 0;
 
 /* Implementation of sgd_fast_sparse */
-static char __pyx_k___main__[] = "__main__";
-static PyObject *__pyx_kp___main__;
-static char __pyx_k_loss[] = "loss";
-static PyObject *__pyx_kp_loss;
-static char __pyx_k_dloss[] = "dloss";
-static PyObject *__pyx_kp_dloss;
-static char __pyx_k___reduce__[] = "__reduce__";
-static PyObject *__pyx_kp___reduce__;
-static char __pyx_k___init__[] = "__init__";
-static PyObject *__pyx_kp___init__;
-static char __pyx_k_p[] = "p";
-static PyObject *__pyx_kp_p;
-static char __pyx_k_y[] = "y";
-static PyObject *__pyx_kp_y;
-static char __pyx_k_c[] = "c";
-static PyObject *__pyx_kp_c;
-static char __pyx_k_w[] = "w";
-static PyObject *__pyx_kp_w;
-static char __pyx_k_intercept[] = "intercept";
-static PyObject *__pyx_kp_intercept;
-static char __pyx_k_penalty_type[] = "penalty_type";
-static PyObject *__pyx_kp_penalty_type;
-static char __pyx_k_alpha[] = "alpha";
-static PyObject *__pyx_kp_alpha;
-static char __pyx_k_rho[] = "rho";
-static PyObject *__pyx_kp_rho;
-static char __pyx_k_X_data[] = "X_data";
-static PyObject *__pyx_kp_X_data;
-static char __pyx_k_X_indices[] = "X_indices";
-static PyObject *__pyx_kp_X_indices;
-static char __pyx_k_X_indptr[] = "X_indptr";
-static PyObject *__pyx_kp_X_indptr;
-static char __pyx_k_Y[] = "Y";
-static PyObject *__pyx_kp_Y;
-static char __pyx_k_n_iter[] = "n_iter";
-static PyObject *__pyx_kp_n_iter;
-static char __pyx_k_fit_intercept[] = "fit_intercept";
-static PyObject *__pyx_kp_fit_intercept;
-static char __pyx_k_verbose[] = "verbose";
-static PyObject *__pyx_kp_verbose;
-static char __pyx_k_shuffle[] = "shuffle";
-static PyObject *__pyx_kp_shuffle;
-static char __pyx_k_numpy[] = "numpy";
-static PyObject *__pyx_kp_numpy;
-static char __pyx_k_np[] = "np";
-static PyObject *__pyx_kp_np;
-static char __pyx_k_sys[] = "sys";
-static PyObject *__pyx_kp_sys;
-static char __pyx_k_time[] = "time";
-static PyObject *__pyx_kp_time;
-static char __pyx_k_NotImplementedError[] = "NotImplementedError";
-static PyObject *__pyx_kp_NotImplementedError;
-static char __pyx_k_arange[] = "arange";
-static PyObject *__pyx_kp_arange;
-static char __pyx_k_dtype[] = "dtype";
-static PyObject *__pyx_kp_dtype;
-static char __pyx_k_31[] = "int32";
-static PyObject *__pyx_kp_31;
-static char __pyx_k_zeros[] = "zeros";
-static PyObject *__pyx_kp_zeros;
-static char __pyx_k_32[] = "float64";
-static PyObject *__pyx_kp_32;
-static char __pyx_k_order[] = "order";
-static PyObject *__pyx_kp_order;
-static char __pyx_k_33[] = "c";
-static PyObject *__pyx_kp_33;
-static char __pyx_k_random[] = "random";
-static PyObject *__pyx_kp_random;
-static char __pyx_k_dot[] = "dot";
-static PyObject *__pyx_kp_dot;
-static char __pyx_k_nonzero[] = "nonzero";
-static PyObject *__pyx_kp_nonzero;
-static char __pyx_k_shape[] = "shape";
-static PyObject *__pyx_kp_shape;
-static char __pyx_k_any[] = "any";
-static PyObject *__pyx_kp_any;
-static char __pyx_k_isinf[] = "isinf";
-static PyObject *__pyx_kp_isinf;
-static char __pyx_k_isnan[] = "isnan";
-static PyObject *__pyx_kp_isnan;
-static char __pyx_k_ValueError[] = "ValueError";
-static PyObject *__pyx_kp_ValueError;
 static PyObject *__pyx_builtin_NotImplementedError;
 static PyObject *__pyx_builtin_ValueError;
-static PyObject *__pyx_kp_34;
-static PyObject *__pyx_kp_35;
-static PyObject *__pyx_kp_36;
-static PyObject *__pyx_kp_37;
-static char __pyx_k_34[] = "-- Epoch %d";
-static char __pyx_k_35[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f";
-static char __pyx_k_36[] = "Total training time: %.2f seconds.";
-static char __pyx_k_37[] = "floating-point under-/overflow occured.";
-static PyObject *__pyx_int_15;
-static char __pyx_k___getbuffer__[] = "__getbuffer__";
-static PyObject *__pyx_kp___getbuffer__;
-static char __pyx_k___releasebuffer__[] = "__releasebuffer__";
-static PyObject *__pyx_kp___releasebuffer__;
-static char __pyx_k_info[] = "info";
-static PyObject *__pyx_kp_info;
-static char __pyx_k_flags[] = "flags";
-static PyObject *__pyx_kp_flags;
-static char __pyx_k_range[] = "range";
-static PyObject *__pyx_kp_range;
-static char __pyx_k_itervalues[] = "itervalues";
-static PyObject *__pyx_kp_itervalues;
-static char __pyx_k_RuntimeError[] = "RuntimeError";
-static PyObject *__pyx_kp_RuntimeError;
-static PyObject *__pyx_kp_1;
-static PyObject *__pyx_kp_2;
-static PyObject *__pyx_kp_5;
-static PyObject *__pyx_kp_23;
 static PyObject *__pyx_builtin_range;
 static PyObject *__pyx_builtin_RuntimeError;
-static char __pyx_k_1[] = "ndarray is not C contiguous";
-static char __pyx_k_2[] = "ndarray is not Fortran contiguous";
-static char __pyx_k_3[] = ">";
-static char __pyx_k_4[] = "<";
-static char __pyx_k_5[] = "Non-native byte order not supported";
-static char __pyx_k_6[] = "b";
-static char __pyx_k_7[] = "B";
-static char __pyx_k_8[] = "h";
-static char __pyx_k_9[] = "H";
-static char __pyx_k_10[] = "i";
-static char __pyx_k_11[] = "I";
-static char __pyx_k_12[] = "l";
-static char __pyx_k_13[] = "L";
-static char __pyx_k_14[] = "q";
-static char __pyx_k_15[] = "Q";
-static char __pyx_k_16[] = "f";
-static char __pyx_k_17[] = "d";
-static char __pyx_k_18[] = "g";
-static char __pyx_k_19[] = "Zf";
-static char __pyx_k_20[] = "Zd";
-static char __pyx_k_21[] = "Zg";
-static char __pyx_k_22[] = "O";
-static char __pyx_k_23[] = "unknown dtype code in numpy.pxd (%d)";
-static char __pyx_k_24[] = "^";
-static PyObject *__pyx_kp_25;
-static PyObject *__pyx_kp_28;
-static PyObject *__pyx_kp_29;
-static PyObject *__pyx_kp_30;
-static char __pyx_k_25[] = "Format string allocated too short, see comment in numpy.pxd";
-static char __pyx_k_26[] = ">";
-static char __pyx_k_27[] = "<";
-static char __pyx_k_28[] = "Non-native byte order not supported";
-static char __pyx_k_29[] = "Format string allocated too short.";
-static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
-
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
+static char __pyx_k_1[] = "-- Epoch %d";
+static char __pyx_k_2[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f";
+static char __pyx_k_3[] = "Total training time: %.2f seconds.";
+static char __pyx_k_4[] = "floating-point under-/overflow occured.";
+static char __pyx_k_5[] = "ndarray is not C contiguous";
+static char __pyx_k_6[] = "ndarray is not Fortran contiguous";
+static char __pyx_k_7[] = "Non-native byte order not supported";
+static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)";
+static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd";
+static char __pyx_k_10[] = "Format string allocated too short.";
+static char __pyx_k_11[] = "LossFunction.loss (line 36)";
+static char __pyx_k_12[] = "LossFunction.dloss (line 45)";
+static char __pyx_k_13[] = "plain_sgd (line 184)";
+static char __pyx_k__B[] = "B";
+static char __pyx_k__H[] = "H";
+static char __pyx_k__I[] = "I";
+static char __pyx_k__L[] = "L";
+static char __pyx_k__O[] = "O";
+static char __pyx_k__Q[] = "Q";
+static char __pyx_k__Y[] = "Y";
+static char __pyx_k__b[] = "b";
+static char __pyx_k__c[] = "c";
+static char __pyx_k__d[] = "d";
+static char __pyx_k__f[] = "f";
+static char __pyx_k__g[] = "g";
+static char __pyx_k__h[] = "h";
+static char __pyx_k__i[] = "i";
+static char __pyx_k__l[] = "l";
+static char __pyx_k__p[] = "p";
+static char __pyx_k__q[] = "q";
+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__buf[] = "buf";
+static char __pyx_k__dot[] = "dot";
+static char __pyx_k__obj[] = "obj";
+static char __pyx_k__rho[] = "rho";
+static char __pyx_k__sys[] = "sys";
+static char __pyx_k__base[] = "base";
+static char __pyx_k__data[] = "data";
+static char __pyx_k__loss[] = "loss";
+static char __pyx_k__ndim[] = "ndim";
+static char __pyx_k__time[] = "time";
+static char __pyx_k__alpha[] = "alpha";
+static char __pyx_k__descr[] = "descr";
+static char __pyx_k__dloss[] = "dloss";
+static char __pyx_k__dtype[] = "dtype";
+static char __pyx_k__int32[] = "int32";
+static char __pyx_k__isinf[] = "isinf";
+static char __pyx_k__isnan[] = "isnan";
+static char __pyx_k__names[] = "names";
+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__zeros[] = "zeros";
+static char __pyx_k__X_data[] = "X_data";
+static char __pyx_k__arange[] = "arange";
+static char __pyx_k__fields[] = "fields";
+static char __pyx_k__format[] = "format";
+static char __pyx_k__n_iter[] = "n_iter";
+static char __pyx_k__random[] = "random";
+static char __pyx_k__float64[] = "float64";
+static char __pyx_k__nonzero[] = "nonzero";
+static char __pyx_k__shuffle[] = "shuffle";
+static char __pyx_k__strides[] = "strides";
+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__itemsize[] = "itemsize";
+static char __pyx_k__readonly[] = "readonly";
+static char __pyx_k__type_num[] = "type_num";
+static char __pyx_k__X_indices[] = "X_indices";
+static char __pyx_k__byteorder[] = "byteorder";
+static char __pyx_k__intercept[] = "intercept";
+static char __pyx_k__plain_sgd[] = "plain_sgd";
+static char __pyx_k__ValueError[] = "ValueError";
+static char __pyx_k__suboffsets[] = "suboffsets";
+static char __pyx_k__LossFunction[] = "LossFunction";
+static char __pyx_k__RuntimeError[] = "RuntimeError";
+static char __pyx_k__penalty_type[] = "penalty_type";
+static char __pyx_k__fit_intercept[] = "fit_intercept";
+static char __pyx_k__NotImplementedError[] = "NotImplementedError";
+static PyObject *__pyx_kp_s_1;
+static PyObject *__pyx_kp_u_10;
+static PyObject *__pyx_kp_u_11;
+static PyObject *__pyx_kp_u_12;
+static PyObject *__pyx_kp_u_13;
+static PyObject *__pyx_kp_s_2;
+static PyObject *__pyx_kp_s_3;
+static PyObject *__pyx_kp_s_4;
+static PyObject *__pyx_kp_u_5;
+static PyObject *__pyx_kp_u_6;
+static PyObject *__pyx_kp_u_7;
+static PyObject *__pyx_kp_u_8;
+static PyObject *__pyx_kp_u_9;
+static PyObject *__pyx_n_s__LossFunction;
+static PyObject *__pyx_n_s__NotImplementedError;
+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_indices;
+static PyObject *__pyx_n_s__X_indptr;
+static PyObject *__pyx_n_s__Y;
+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__base;
+static PyObject *__pyx_n_s__buf;
+static PyObject *__pyx_n_s__byteorder;
+static PyObject *__pyx_n_s__c;
+static PyObject *__pyx_n_s__data;
+static PyObject *__pyx_n_s__descr;
+static PyObject *__pyx_n_s__dloss;
+static PyObject *__pyx_n_s__dot;
+static PyObject *__pyx_n_s__dtype;
+static PyObject *__pyx_n_s__fields;
+static PyObject *__pyx_n_s__fit_intercept;
+static PyObject *__pyx_n_s__float64;
+static PyObject *__pyx_n_s__format;
+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__itemsize;
+static PyObject *__pyx_n_s__loss;
+static PyObject *__pyx_n_s__n_iter;
+static PyObject *__pyx_n_s__names;
+static PyObject *__pyx_n_s__ndim;
+static PyObject *__pyx_n_s__nonzero;
+static PyObject *__pyx_n_s__np;
+static PyObject *__pyx_n_s__numpy;
+static PyObject *__pyx_n_s__obj;
+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__random;
+static PyObject *__pyx_n_s__range;
+static PyObject *__pyx_n_s__readonly;
+static PyObject *__pyx_n_s__rho;
+static PyObject *__pyx_n_s__shape;
+static PyObject *__pyx_n_s__shuffle;
+static PyObject *__pyx_n_s__strides;
+static PyObject *__pyx_n_s__suboffsets;
+static PyObject *__pyx_n_s__sys;
+static PyObject *__pyx_n_s__time;
+static PyObject *__pyx_n_s__type_num;
+static PyObject *__pyx_n_s__verbose;
+static PyObject *__pyx_n_s__w;
+static PyObject *__pyx_n_s__y;
+static PyObject *__pyx_n_s__zeros;
+static PyObject *__pyx_int_15;
+
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1114,71 +1138,71 @@ static char __pyx_k_30[] = "unknown dtype code in numpy.pxd (%d)";
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self, double p, double y):
  *         """Evaluate the derivative of the loss function.
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1193,8 +1217,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -1206,11 +1230,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1219,13 +1243,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
     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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 36; __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 = 36; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 36; __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1249,11 +1273,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1264,71 +1288,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":53
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":53
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class Regression(LossFunction):
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1343,8 +1367,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -1356,11 +1380,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1369,13 +1393,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
     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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 45; __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 = 45; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 45; __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1399,11 +1423,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1414,71 +1438,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __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 = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1492,8 +1516,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -1505,11 +1529,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1518,13 +1542,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
     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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __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 = 57; __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 = 57; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 57; __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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1548,11 +1572,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1563,71 +1587,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15sgd_fast_sparse_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1641,8 +1665,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -1654,11 +1678,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1667,13 +1691,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
     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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 59; __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 = 59; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 59; __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1697,11 +1721,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1712,71 +1736,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1790,8 +1814,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -1803,11 +1827,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1816,13 +1840,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
     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 = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __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 = 65; __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 = 65; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 65; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1846,11 +1870,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1861,71 +1885,71 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj_15sgd_fast_sparse_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class ModifiedHuber(Classification):
  */
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_Raise(__pyx_t_2, 0, 0);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_Raise(__pyx_t_1, 0, 0);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *     cpdef double loss(self,double p,double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -1939,8 +1963,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -1952,11 +1976,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -1965,13 +1989,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
     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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 67; __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 = 67; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 67; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -1995,11 +2019,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2011,45 +2035,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
 static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("loss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __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 = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
  *     """
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2058,17 +2083,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_5 = (__pyx_v_z >= 1);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z >= 1);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2080,17 +2105,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     goto __pyx_L3;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
  *             return (1-z) * (1-z)
  *         else:
  */
-  __pyx_t_5 = (__pyx_v_z >= -1);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z >= -1);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
  *             return 0
  *         elif z >= -1:
  *             return (1-z) * (1-z)             # <<<<<<<<<<<<<<
@@ -2103,7 +2128,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   }
   /*else*/ {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
  *             return (1-z) * (1-z)
  *         else:
  *             return -4*z             # <<<<<<<<<<<<<<
@@ -2118,18 +2143,19 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2143,8 +2169,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -2156,11 +2182,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -2169,13 +2195,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
     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 = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __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 = 80; __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 = 80; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 80; __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 = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2199,11 +2225,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
  *             return -4*z
  * 
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2215,45 +2241,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
 static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("dloss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __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 = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
  * 
  *     cpdef double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2262,17 +2289,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
  *     cpdef double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_5 = (__pyx_v_z >= 1);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z >= 1);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2284,17 +2311,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     goto __pyx_L3;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
  *             return 2*(1-z)*y
  *         else:
  */
-  __pyx_t_5 = (__pyx_v_z >= -1);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z >= -1);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
  *             return 0
  *         elif z >= -1:
  *             return 2*(1-z)*y             # <<<<<<<<<<<<<<
@@ -2307,7 +2334,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   }
   /*else*/ {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
  *             return 2*(1-z)*y
  *         else:
  *             return 4*y             # <<<<<<<<<<<<<<
@@ -2322,18 +2349,19 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
  *             return -4*z
  * 
  *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2347,8 +2375,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -2360,11 +2388,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -2373,13 +2401,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
     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 = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __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 = 89; __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 = 89; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 89; __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 = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2403,11 +2431,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
  *             return 4*y
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2419,9 +2447,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_SetupRefcountContext("__reduce__");
+  __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":99
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":99
  * 
  *     def __reduce__(self):
  *         return ModifiedHuber,()             # <<<<<<<<<<<<<<
@@ -2430,14 +2458,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -2449,11 +2477,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
  *     classification tasks with y in {-1,1}.
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2465,45 +2493,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
 static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("loss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __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 = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
  *     """
  *     cpdef  double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2512,17 +2541,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
  *     cpdef  double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return (1 - z)
  *         return 0
  */
-  __pyx_t_5 = (__pyx_v_z < 1.0);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z < 1.0);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return (1 - z)             # <<<<<<<<<<<<<<
@@ -2535,7 +2564,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   }
   __pyx_L3:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
  *         if z < 1.0:
  *             return (1 - z)
  *         return 0             # <<<<<<<<<<<<<<
@@ -2548,18 +2577,19 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
  *     classification tasks with y in {-1,1}.
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2573,8 +2603,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -2586,11 +2616,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -2599,13 +2629,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
     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 = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __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 = 105; __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 = 105; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 105; __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 = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2629,11 +2659,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2645,45 +2675,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
 static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fast_sparse_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("dloss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __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 = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
  *         return 0
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2692,17 +2723,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return y
  *         return 0
  */
-  __pyx_t_5 = (__pyx_v_z < 1.0);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z < 1.0);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return y             # <<<<<<<<<<<<<<
@@ -2715,7 +2746,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   }
   __pyx_L3:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
  *         if z < 1.0:
  *             return y
  *         return 0             # <<<<<<<<<<<<<<
@@ -2728,18 +2759,19 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2753,8 +2785,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -2766,11 +2798,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -2779,13 +2811,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
     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 = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __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 = 110; __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 = 110; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 110; __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 = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -2809,11 +2841,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
  *         return 0
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2825,9 +2857,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
 static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_SetupRefcountContext("__reduce__");
+  __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
  * 
  *     def __reduce__(self):
  *         return Hinge,()             # <<<<<<<<<<<<<<
@@ -2836,14 +2868,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -2855,11 +2887,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -2871,45 +2903,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
 static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("loss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
  *     """
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -2918,17 +2951,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
  *     cpdef double loss(self,double p,double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z)
  *         if z < -18:
  */
-  __pyx_t_5 = (__pyx_v_z > 18);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z > 18);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z)             # <<<<<<<<<<<<<<
@@ -2941,17 +2974,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L3:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
  *         if z > 18:
  *             return exp(-z)
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return -z * y
  *         return log(1.0+exp(-z))
  */
-  __pyx_t_5 = (__pyx_v_z < -18);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z < -18);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
  *             return exp(-z)
  *         if z < -18:
  *             return -z * y             # <<<<<<<<<<<<<<
@@ -2964,7 +2997,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L4:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
  *         if z < -18:
  *             return -z * y
  *         return log(1.0+exp(-z))             # <<<<<<<<<<<<<<
@@ -2977,18 +3010,19 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3002,8 +3036,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -3015,11 +3049,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -3028,13 +3062,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
     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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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 = 124; __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 = 124; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 124; __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3058,11 +3092,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  *         return log(1.0+exp(-z))
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3074,45 +3108,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
 static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_sparse_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_v_z;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("dloss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __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 = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
  * 
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -3121,17 +3156,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z) * y
  *         if z < -18:
  */
-  __pyx_t_5 = (__pyx_v_z > 18);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z > 18);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z) * y             # <<<<<<<<<<<<<<
@@ -3144,17 +3179,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L3:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *         if z > 18:
  *             return exp(-z) * y
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return y
  *         return y / (exp(z) + 1.0)
  */
-  __pyx_t_5 = (__pyx_v_z < -18);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_z < -18);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
  *             return exp(-z) * y
  *         if z < -18:
  *             return y             # <<<<<<<<<<<<<<
@@ -3167,7 +3202,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L4:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
  *         if z < -18:
  *             return y
  *         return y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<
@@ -3180,18 +3215,19 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  *         return log(1.0+exp(-z))
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3205,8 +3241,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -3218,11 +3254,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -3231,13 +3267,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
     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 = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __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 = 132; __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 = 132; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 132; __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 = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3261,11 +3297,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
  *         return y / (exp(z) + 1.0)
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3277,9 +3313,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_SetupRefcountContext("__reduce__");
+  __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
  * 
  *     def __reduce__(self):
  *         return Log,()             # <<<<<<<<<<<<<<
@@ -3288,14 +3324,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -3307,11 +3343,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
  *     """
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3322,44 +3358,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("loss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __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 = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
  *     """
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)             # <<<<<<<<<<<<<<
@@ -3372,18 +3408,18 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
  *     """
  *     """
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3397,8 +3433,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -3410,11 +3446,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -3423,13 +3459,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
     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 = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __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 = 146; __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 = 146; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 146; __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 = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3453,11 +3489,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3468,44 +3504,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_15sgd_fast_sparse_SquaredError *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  __Pyx_RefNannySetupContext("dloss");
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):
  *         return y - p             # <<<<<<<<<<<<<<
@@ -3518,18 +3554,18 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
  *     cpdef  double loss(self,double p,double y):
  *         return 0.5 * (p-y) * (p-y)
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3543,8 +3579,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -3556,11 +3592,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -3569,13 +3605,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
     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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 148; __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 = 148; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 148; __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3599,11 +3635,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
  *         return y - p
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3615,9 +3651,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  __Pyx_SetupRefcountContext("__reduce__");
+  __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
  * 
  *     def __reduce__(self):
  *         return SquaredError,()             # <<<<<<<<<<<<<<
@@ -3626,14 +3662,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
  */
   __Pyx_XDECREF(__pyx_r);
   __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -3645,11 +3681,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
  *     """
  *     cdef double c
  *     def __init__(self,c):             # <<<<<<<<<<<<<<
@@ -3662,8 +3698,8 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   PyObject *__pyx_v_c = 0;
   int __pyx_r;
   double __pyx_t_1;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_c,0};
-  __Pyx_SetupRefcountContext("__init__");
+  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};
@@ -3674,7 +3710,7 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_c);
+      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c);
       if (likely(values[0])) kw_args--;
       else goto __pyx_L5_argtuple_error;
     }
@@ -3695,14 +3731,14 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   return -1;
   __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
  *     cdef double c
  *     def __init__(self,c):
  *         self.c = c             # <<<<<<<<<<<<<<
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y
  */
-  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
 
   __pyx_r = 0;
@@ -3711,11 +3747,11 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
   __pyx_r = -1;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
  *     def __init__(self,c):
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3728,45 +3764,46 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   double __pyx_v_r;
   double __pyx_v_abs_r;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("loss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("loss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_loss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __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 = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y             # <<<<<<<<<<<<<<
@@ -3775,33 +3812,33 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
  */
   __pyx_v_r = (__pyx_v_p - __pyx_v_y);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
  *     cpdef  double loss(self,double p,double y):
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyNumber_Absolute(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __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 = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_4;
+  __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return 0.5 * r * r
  *         else:
  */
-  __pyx_t_5 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":164
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":164
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return 0.5 * r * r             # <<<<<<<<<<<<<<
@@ -3814,7 +3851,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   }
   /*else*/ {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
  *             return 0.5 * r * r
  *         else:
  *             return self.c * abs_r - (0.5*self.c*self.c)             # <<<<<<<<<<<<<<
@@ -3829,18 +3866,19 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
  *     def __init__(self,c):
  *         self.c = c
  *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3854,8 +3892,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("loss");
+  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};
@@ -3867,11 +3905,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -3880,13 +3918,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
     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 = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __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 = 160; __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 = 160; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 160; __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 = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -3910,11 +3948,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -3927,45 +3965,46 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   double __pyx_v_r;
   double __pyx_v_abs_r;
   double __pyx_r;
-  PyObject *__pyx_1 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
-  int __pyx_t_5;
-  __Pyx_SetupRefcountContext("dloss");
+  PyObject *__pyx_t_4 = NULL;
+  double __pyx_t_5;
+  int __pyx_t_6;
+  __Pyx_RefNannySetupContext("dloss");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_kp_dloss); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!PyCFunction_Check(__pyx_1) || (PyCFunction_GET_FUNCTION(__pyx_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); 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 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_1 = 0;
+      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_r = __pyx_t_4;
+      __pyx_t_3 = 0;
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_r = __pyx_t_5;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L0;
     }
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
  * 
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double r = y - p             # <<<<<<<<<<<<<<
@@ -3974,33 +4013,33 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
  */
   __pyx_v_r = (__pyx_v_y - __pyx_v_p);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
  *     cpdef  double dloss(self,double p,double y):
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyNumber_Absolute(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __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 = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_4;
+  __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return r
  *         elif r > 0:
  */
-  __pyx_t_5 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return r             # <<<<<<<<<<<<<<
@@ -4012,17 +4051,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     goto __pyx_L3;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
  *         if abs_r <= self.c:
  *             return r
  *         elif r > 0:             # <<<<<<<<<<<<<<
  *             return self.c
  *         else:
  */
-  __pyx_t_5 = (__pyx_v_r > 0);
-  if (__pyx_t_5) {
+  __pyx_t_6 = (__pyx_v_r > 0);
+  if (__pyx_t_6) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":174
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":174
  *             return r
  *         elif r > 0:
  *             return self.c             # <<<<<<<<<<<<<<
@@ -4035,7 +4074,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   }
   /*else*/ {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
  *             return self.c
  *         else:
  *             return -self.c             # <<<<<<<<<<<<<<
@@ -4050,18 +4089,19 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
@@ -4075,8 +4115,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   double __pyx_v_y;
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_p,&__pyx_kp_y,0};
-  __Pyx_SetupRefcountContext("dloss");
+  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};
@@ -4088,11 +4128,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_p);
+      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_kp_y);
+      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 = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -4101,13 +4141,13 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
     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 = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
-    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __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 = 168; __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 = 168; __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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_y = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 1)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 168; __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 = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
@@ -4131,11 +4171,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
  *             return -self.c
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -4148,9 +4188,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  __Pyx_SetupRefcountContext("__reduce__");
+  __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
  * 
  *     def __reduce__(self):
  *         return Huber,(self.c,)             # <<<<<<<<<<<<<<
@@ -4161,19 +4201,19 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __Pyx_GOTREF(__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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
+  __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_r = ((PyObject *)__pyx_t_1);
+  __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
   goto __pyx_L0;
 
@@ -4186,11 +4226,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":184
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":184
  * @cython.wraparound(False)
  * @cython.cdivision(True)
  * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
@@ -4265,32 +4305,31 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   Py_ssize_t __pyx_bstride_0_w = 0;
   Py_ssize_t __pyx_bshape_0_w = 0;
   PyObject *__pyx_r = NULL;
-  PyObject *__pyx_1 = 0;
-  PyObject *__pyx_2 = 0;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
-  PyArrayObject *__pyx_t_4 = NULL;
-  PyArrayObject *__pyx_t_5 = NULL;
-  int __pyx_t_6;
-  int __pyx_t_7;
-  PyObject *__pyx_t_8 = NULL;
-  PyObject *__pyx_t_9 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
+  PyArrayObject *__pyx_t_6 = NULL;
+  PyArrayObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
+  int __pyx_t_9;
   PyObject *__pyx_t_10 = NULL;
-  int __pyx_t_11;
-  unsigned int __pyx_t_12;
-  unsigned int __pyx_t_13;
+  PyObject *__pyx_t_11 = NULL;
+  PyObject *__pyx_t_12 = NULL;
+  int __pyx_t_13;
   unsigned int __pyx_t_14;
-  PyArrayObject *__pyx_t_15 = NULL;
-  double __pyx_t_16;
-  PyObject *__pyx_t_17 = NULL;
-  PyObject *__pyx_t_18 = NULL;
-  int __pyx_t_19;
+  unsigned int __pyx_t_15;
+  unsigned int __pyx_t_16;
+  PyArrayObject *__pyx_t_17 = NULL;
+  double __pyx_t_18;
+  PyObject *__pyx_t_19 = NULL;
   int __pyx_t_20;
   int __pyx_t_21;
   int __pyx_t_22;
-  static PyObject **__pyx_pyargnames[] = {&__pyx_kp_w,&__pyx_kp_intercept,&__pyx_kp_loss,&__pyx_kp_penalty_type,&__pyx_kp_alpha,&__pyx_kp_rho,&__pyx_kp_X_data,&__pyx_kp_X_indices,&__pyx_kp_X_indptr,&__pyx_kp_Y,&__pyx_kp_n_iter,&__pyx_kp_fit_intercept,&__pyx_kp_verbose,&__pyx_kp_shuffle,0};
-  __Pyx_SetupRefcountContext("plain_sgd");
+  int __pyx_t_23;
+  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,0};
+  __Pyx_RefNannySetupContext("plain_sgd");
   __pyx_self = __pyx_self;
   if (unlikely(__pyx_kwds)) {
     Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
@@ -4315,83 +4354,83 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     switch (PyTuple_GET_SIZE(__pyx_args)) {
       case  0:
-      values[0] = PyDict_GetItem(__pyx_kwds, __pyx_kp_w);
+      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_kp_intercept);
+      values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
       if (likely(values[1])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  2:
-      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_kp_loss);
+      values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss);
       if (likely(values[2])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  3:
-      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_kp_penalty_type);
+      values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type);
       if (likely(values[3])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  4:
-      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_kp_alpha);
+      values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha);
       if (likely(values[4])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  5:
-      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_kp_rho);
+      values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho);
       if (likely(values[5])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  6:
-      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_data);
+      values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_data);
       if (likely(values[6])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  7:
-      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_indices);
+      values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indices);
       if (likely(values[7])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  8:
-      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_kp_X_indptr);
+      values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__X_indptr);
       if (likely(values[8])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case  9:
-      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_kp_Y);
+      values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__Y);
       if (likely(values[9])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 10:
-      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_kp_n_iter);
+      values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter);
       if (likely(values[10])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 11:
-      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_kp_fit_intercept);
+      values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept);
       if (likely(values[11])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 12:
-      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_kp_verbose);
+      values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose);
       if (likely(values[12])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
       case 13:
-      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_kp_shuffle);
+      values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle);
       if (likely(values[13])) kw_args--;
       else {
         __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
@@ -4401,11 +4440,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_w = ((PyArrayObject *)values[0]);
-    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_rho = __pyx_PyFloat_AsDouble(values[5]); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __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 = 188; __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 = 188; __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]);
@@ -4418,11 +4457,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     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(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_alpha = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 4)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_rho = __pyx_PyFloat_AsDouble(PyTuple_GET_ITEM(__pyx_args, 5)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __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 = 188; __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 = 188; __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));
@@ -4440,6 +4479,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_INCREF((PyObject *)__pyx_v_w);
+  __Pyx_INCREF((PyObject *)__pyx_v_loss);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
+  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
+  __Pyx_INCREF((PyObject *)__pyx_v_Y);
   __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
   __pyx_bstruct_index.buf = NULL;
   __pyx_bstruct_q.buf = NULL;
@@ -4485,7 +4529,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
   __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
  *     """
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]             # <<<<<<<<<<<<<<
@@ -4494,7 +4538,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]
  *     cdef unsigned int n_features = w.shape[0]             # <<<<<<<<<<<<<<
@@ -4503,7 +4547,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
  * 
  *     # FIXME double to double
  *     cdef double *w_data_ptr = w.data             # <<<<<<<<<<<<<<
@@ -4512,7 +4556,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_w_data_ptr = ((double *)__pyx_v_w->data);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
  *     # FIXME double to double
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
@@ -4521,7 +4565,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_data_ptr = ((double *)__pyx_v_X_data->data);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":206
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":206
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
@@ -4530,7 +4574,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indptr_ptr = ((int *)__pyx_v_X_indptr->data);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data
  *     cdef int *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
@@ -4539,63 +4583,63 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indices_ptr = ((int *)__pyx_v_X_indices->data);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
  * 
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
  *                                                                  dtype = np.int32)
  *     cdef int *index_ptr = index.data
  */
-  __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_1);
-  __pyx_t_1 = PyObject_GetAttr(__pyx_1, __pyx_kp_arange); 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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-  __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_1));
+  __Pyx_GOTREF(__pyx_t_3);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                                  dtype = np.int32)             # <<<<<<<<<<<<<<
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  */
-  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_2);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_31); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-  if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __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 = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_4);
+  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); 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);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __pyx_t_2 = PyEval_CallObjectWithKeywords(__pyx_t_1, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
-  if (!(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = ((PyArrayObject *)__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+    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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
       __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
   }
-  __pyx_t_4 = 0;
-  __pyx_v_index = ((PyArrayObject *)__pyx_t_2);
-  __pyx_t_2 = 0;
+  __pyx_t_6 = 0;
+  __pyx_v_index = ((PyArrayObject *)__pyx_t_5);
+  __pyx_t_5 = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                                  dtype = np.int32)
  *     cdef int *index_ptr = index.data             # <<<<<<<<<<<<<<
@@ -4604,7 +4648,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_index_ptr = ((int *)__pyx_v_index->data);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
  *                                                                  dtype = np.int32)
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0             # <<<<<<<<<<<<<<
@@ -4613,7 +4657,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_offset = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  *     cdef int xnnz = 0             # <<<<<<<<<<<<<<
@@ -4622,7 +4666,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_xnnz = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
  *     cdef int offset = 0
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0             # <<<<<<<<<<<<<<
@@ -4631,7 +4675,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wscale = 1.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0             # <<<<<<<<<<<<<<
@@ -4640,7 +4684,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0
  *     cdef double p = 0.0             # <<<<<<<<<<<<<<
@@ -4649,7 +4693,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_p = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
  *     cdef double eta = 0.0
  *     cdef double p = 0.0
  *     cdef double update = 0.0             # <<<<<<<<<<<<<<
@@ -4658,7 +4702,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_update = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
  *     cdef double p = 0.0
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<
@@ -4667,7 +4711,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sumloss = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0             # <<<<<<<<<<<<<<
@@ -4676,7 +4720,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wnorm = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0             # <<<<<<<<<<<<<<
@@ -4685,7 +4729,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0
  *     cdef double y = 0.0             # <<<<<<<<<<<<<<
@@ -4694,7 +4738,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_y = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
  *     cdef double t = 0.0
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<
@@ -4703,7 +4747,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_count = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<
@@ -4712,7 +4756,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_epoch = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
@@ -4721,7 +4765,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_i = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0             # <<<<<<<<<<<<<<
@@ -4730,101 +4774,101 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sample_idx = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  */
-  __pyx_t_5 = ((PyArrayObject *)Py_None);
+  __pyx_t_7 = ((PyArrayObject *)Py_None);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
+    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 = 227; __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_5 = 0;
+  __pyx_t_7 = 0;
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data
  */
-  __pyx_t_6 = (__pyx_v_penalty_type != 2);
-  if (__pyx_t_6) {
+  __pyx_t_8 = (__pyx_v_penalty_type != 2);
+  if (__pyx_t_8) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")             # <<<<<<<<<<<<<<
  *         q_data_ptr =  q.data
  *     cdef double u = 0.0
  */
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_2);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_t_3 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __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 = 230; __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 = 230; __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 = 230; __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-    PyTuple_SET_ITEM(__pyx_t_1, 0, __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_1));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
-    __pyx_t_1 = 0;
-    __pyx_1 = PyDict_New(); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_1));
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_2);
-    __pyx_t_1 = PyObject_GetAttr(__pyx_2, __pyx_kp_32); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-    if (PyDict_SetItem(__pyx_1, __pyx_kp_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (PyDict_SetItem(__pyx_1, __pyx_kp_order, __pyx_kp_33) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_1 = PyEval_CallObjectWithKeywords(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __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 = 230; __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 = 230; __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_1)); __pyx_1 = 0;
-    if (!(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_5 = ((PyArrayObject *)__pyx_t_1);
+    if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
       __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-      __pyx_t_7 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);
-      if (unlikely(__pyx_t_7 < 0)) {
-        PyErr_Fetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
+      __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_bstruct_q, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {
-          Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);
+          Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
           __Pyx_RaiseBufferFallbackError();
         } else {
-          PyErr_Restore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
+          PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
         }
       }
       __pyx_bstride_0_q = __pyx_bstruct_q.strides[0];
       __pyx_bshape_0_q = __pyx_bstruct_q.shape[0];
-      if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
-    __pyx_t_5 = 0;
+    __pyx_t_7 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_v_q));
-    __pyx_v_q = ((PyArrayObject *)__pyx_t_1);
-    __pyx_t_1 = 0;
+    __pyx_v_q = ((PyArrayObject *)__pyx_t_4);
+    __pyx_t_4 = 0;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data             # <<<<<<<<<<<<<<
@@ -4836,7 +4880,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   }
   __pyx_L6:;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
@@ -4845,7 +4889,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_u = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
  *     cdef double u = 0.0
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
@@ -4854,7 +4898,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -4863,7 +4907,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta0 = (__pyx_v_typw / __pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)));
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -4872,120 +4916,120 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = (1.0 / (__pyx_v_eta0 * __pyx_v_alpha));
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  */
-  __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_2);
-  __pyx_t_1 = PyObject_Call(__pyx_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
+  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 237; __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 = 237; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_v_t_start);
-  __pyx_v_t_start = __pyx_t_1;
-  __pyx_t_1 = 0;
+  __pyx_v_t_start = __pyx_t_3;
+  __pyx_t_3 = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:             # <<<<<<<<<<<<<<
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  */
-  __pyx_t_7 = __pyx_v_n_iter;
-  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_7; __pyx_v_epoch++) {
+  __pyx_t_9 = __pyx_v_n_iter;
+  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:             # <<<<<<<<<<<<<<
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  */
-    __pyx_t_6 = (__pyx_v_verbose > 0);
-    if (__pyx_t_6) {
+    __pyx_t_8 = (__pyx_v_verbose > 0);
+    if (__pyx_t_8) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.shuffle(index)
  */
-      __pyx_t_1 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyNumber_Remainder(__pyx_kp_34, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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 = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L9;
     }
     __pyx_L9:;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  */
-    __pyx_t_11 = __pyx_v_shuffle;
-    if (__pyx_t_11) {
+    __pyx_t_13 = __pyx_v_shuffle;
+    if (__pyx_t_13) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.shuffle(index)             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  */
-      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_1);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_1, __pyx_kp_random); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __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 = 242; __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 = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_kp_shuffle); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __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(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __Pyx_GOTREF(__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_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __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_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       goto __pyx_L10;
     }
     __pyx_L10:;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
  *         if shuffle:
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:             # <<<<<<<<<<<<<<
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  */
-    __pyx_t_12 = __pyx_v_n_samples;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
+    __pyx_t_14 = __pyx_v_n_samples;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]             # <<<<<<<<<<<<<<
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  */
-      __pyx_t_13 = __pyx_v_i;
-      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_13, __pyx_bstride_0_index));
+      __pyx_t_15 = __pyx_v_i;
+      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index));
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -4994,7 +5038,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -5003,17 +5047,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]             # <<<<<<<<<<<<<<
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  */
-      __pyx_t_14 = __pyx_v_sample_idx;
-      __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_14, __pyx_bstride_0_Y));
+      __pyx_t_16 = __pyx_v_sample_idx;
+      __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y));
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]
  *             eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5022,7 +5066,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -5031,7 +5075,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_p = ((__pyx_f_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);
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -5040,7 +5084,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0);
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<
@@ -5049,17 +5093,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)
  *             if update != 0:             # <<<<<<<<<<<<<<
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  */
-      __pyx_t_6 = (__pyx_v_update != 0);
-      if (__pyx_t_6) {
+      __pyx_t_8 = (__pyx_v_update != 0);
+      if (__pyx_t_8) {
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
  *             if update != 0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)             # <<<<<<<<<<<<<<
@@ -5068,22 +5112,22 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_f_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);
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
  */
-        __pyx_t_6 = (__pyx_v_fit_intercept == 1);
-        if (__pyx_t_6) {
+        __pyx_t_8 = (__pyx_v_fit_intercept == 1);
+        if (__pyx_t_8) {
 
-          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01             # <<<<<<<<<<<<<<
  *             if penalty_type != L1:
- *                 wscale *= (1 - rho * eta * alpha)
+ *                 wscale *= (1 - (rho * eta * alpha))
  */
           __pyx_v_intercept += (__pyx_v_update * 0.01);
           goto __pyx_L14;
@@ -5093,72 +5137,72 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L13:;
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
- *                 wscale *= (1 - rho * eta * alpha)
+ *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  */
-      __pyx_t_6 = (__pyx_v_penalty_type != 1);
-      if (__pyx_t_6) {
+      __pyx_t_8 = (__pyx_v_penalty_type != 1);
+      if (__pyx_t_8) {
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
- *                 wscale *= (1 - rho * eta * alpha)             # <<<<<<<<<<<<<<
+ *                 wscale *= (1 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
  *                 if wscale < 1e-9:
  *                     w *= wscale
  */
         __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
  *             if penalty_type != L1:
- *                 wscale *= (1 - rho * eta * alpha)
+ *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
  *                     w *= wscale
  *                     wscale = 1.0
  */
-        __pyx_t_6 = (__pyx_v_wscale < 1.0000000000000001e-09);
-        if (__pyx_t_6) {
+        __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09);
+        if (__pyx_t_8) {
 
-          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
- *                 wscale *= (1 - rho * eta * alpha)
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
+ *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_2 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_2); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_2);
-          if (!(__Pyx_TypeTest(__pyx_2, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_15 = ((PyArrayObject *)__pyx_2);
+          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_5);
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
+          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __pyx_t_17 = ((PyArrayObject *)__pyx_t_3);
           {
             __Pyx_BufFmt_StackElem __pyx_stack[1];
             __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-            __pyx_t_11 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-            if (unlikely(__pyx_t_11 < 0)) {
-              PyErr_Fetch(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);
+            __pyx_t_13 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+            if (unlikely(__pyx_t_13 < 0)) {
+              PyErr_Fetch(&__pyx_t_12, &__pyx_t_11, &__pyx_t_10);
               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_9); Py_XDECREF(__pyx_t_8);
+                Py_XDECREF(__pyx_t_12); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_10);
                 __Pyx_RaiseBufferFallbackError();
               } else {
-                PyErr_Restore(__pyx_t_10, __pyx_t_9, __pyx_t_8);
+                PyErr_Restore(__pyx_t_12, __pyx_t_11, __pyx_t_10);
               }
             }
             __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
             __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_t_15 = 0;
+          __pyx_t_17 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
-          __pyx_v_w = ((PyArrayObject *)__pyx_2);
-          __pyx_2 = 0;
+          __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
+          __pyx_t_3 = 0;
 
-          /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
@@ -5173,30 +5217,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L15:;
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
  *                 u += ((1 - rho) * eta * alpha)
- *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  */
       switch (__pyx_v_penalty_type) {
         case 1:
         case 3:
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
- *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
- *             t += 1
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
+ *                           X_indices_ptr, offset, xnnz, u)
  */
         __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-        /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
- *             if penalty_type == L1 or penalty_type == ELASTICNET:
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
  *                 u += ((1 - rho) * eta * alpha)
- *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
+ *                           X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
  *             t += 1
  *             count += 1
  */
@@ -5204,339 +5248,370 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         break;
       }
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
- *                 u += ((1 - rho) * eta * alpha)
- *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+ *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
+ *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
  *             count += 1
- *         # report epoche information
+ *         if penalty_type == L1 or penalty_type == ELASTICNET:
  */
       __pyx_v_t += 1;
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
- *                 l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
+ *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
- *         # report epoche information
- *         if verbose > 0:
+ *         if penalty_type == L1 or penalty_type == ELASTICNET:
+ *             u += ((1 - rho) * eta * alpha)
  */
       __pyx_v_count += 1;
     }
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
+ *             t += 1
+ *             count += 1
+ *         if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
+ *             u += ((1 - rho) * eta * alpha)
+ *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
+ */
+    switch (__pyx_v_penalty_type) {
+      case 1:
+      case 3:
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
  *             count += 1
+ *         if penalty_type == L1 or penalty_type == ELASTICNET:
+ *             u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
+ *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
+ * 
+ */
+      __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
+ *         if penalty_type == L1 or penalty_type == ELASTICNET:
+ *             u += ((1 - rho) * eta * alpha)
+ *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)             # <<<<<<<<<<<<<<
+ * 
+ *         # report epoche information
+ */
+      __pyx_f_15sgd_fast_sparse_finall1penalty(__pyx_v_w_data_ptr, __pyx_v_wscale, __pyx_v_n_features, __pyx_v_q_data_ptr, __pyx_v_u);
+      break;
+    }
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":274
+ * 
  *         # 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, w.nonzero()[0].shape[0],
  */
-    __pyx_t_6 = (__pyx_v_verbose > 0);
-    if (__pyx_t_6) {
+    __pyx_t_8 = (__pyx_v_verbose > 0);
+    if (__pyx_t_8) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
  *         # 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, w.nonzero()[0].shape[0],
- * 										intercept, count, sumloss / count))
+ *                                                                                 intercept, count, sumloss / count))
  */
-      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_1);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_dot); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__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_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __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_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 = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __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_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_4 = PyNumber_Multiply(__pyx_t_5, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __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_16 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_v_wnorm = sqrt(__pyx_t_16);
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
  *         if verbose > 0:
  *             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, sumloss / count))
+ *                                                                                 intercept, count, sumloss / count))
  *             print("Total training time: %.2f seconds." % (time()-t_start))
  */
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_kp_nonzero); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __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 = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_2 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_2);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_GetAttr(__pyx_2, __pyx_kp_shape); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-      __pyx_1 = __Pyx_GetItemInt(__pyx_t_2, 0, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_1);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
  *             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, sumloss / count))             # <<<<<<<<<<<<<<
+ *                                                                                 intercept, count, sumloss / count))             # <<<<<<<<<<<<<<
  *             print("Total training time: %.2f seconds." % (time()-t_start))
  * 
  */
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_17 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_17);
-      __pyx_t_18 = PyTuple_New(5); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_18));
-      PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_1);
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_3);
+      __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_5);
+      __Pyx_GIVEREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_18, 1, __pyx_1);
-      __Pyx_GIVEREF(__pyx_1);
-      PyTuple_SET_ITEM(__pyx_t_18, 2, __pyx_t_2);
+      PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_18, 3, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_18, 4, __pyx_t_17);
-      __Pyx_GIVEREF(__pyx_t_17);
+      __pyx_t_4 = 0;
+      __pyx_t_3 = 0;
+      __pyx_t_5 = 0;
       __pyx_t_1 = 0;
-      __pyx_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_3 = 0;
-      __pyx_t_17 = 0;
-      __pyx_t_17 = PyNumber_Remainder(__pyx_kp_35, ((PyObject *)__pyx_t_18)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_17);
-      __Pyx_DECREF(((PyObject *)__pyx_t_18)); __pyx_t_18 = 0;
-      if (__Pyx_PrintOne(__pyx_t_17) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
  *             print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm, w.nonzero()[0].shape[0],
- * 										intercept, count, sumloss / count))
+ *                                                                                 intercept, count, sumloss / count))
  *             print("Total training time: %.2f seconds." % (time()-t_start))             # <<<<<<<<<<<<<<
  * 
  *         # floating-point under-/overflow check.
  */
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_2);
-      __pyx_t_17 = PyObject_Call(__pyx_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_17);
-      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-      __pyx_t_18 = PyNumber_Subtract(__pyx_t_17, __pyx_v_t_start); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_18);
-      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-      __pyx_t_17 = PyNumber_Remainder(__pyx_kp_36, __pyx_t_18); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_17);
-      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-      if (__Pyx_PrintOne(__pyx_t_17) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __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 = 278; __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 = 278; __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 = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       goto __pyx_L17;
     }
     __pyx_L17:;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":281
  * 
  *         # 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_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    __pyx_t_17 = PyObject_GetAttr(__pyx_1, __pyx_kp_any); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_17);
-    __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-    __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_2);
-    __pyx_t_18 = PyObject_GetAttr(__pyx_2, __pyx_kp_isinf); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_18);
-    __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+    __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __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 = 281; __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 = 281; __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 = 281; __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_19);
     __Pyx_INCREF(((PyObject *)__pyx_v_w));
-    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
+    PyTuple_SET_ITEM(__pyx_t_19, 0, ((PyObject *)__pyx_v_w));
     __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-    __pyx_t_2 = PyObject_Call(__pyx_t_18, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-    __Pyx_DECREF(((PyObject *)__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 = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-    __Pyx_GIVEREF(__pyx_t_2);
-    __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_19);
+    PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_5);
+    __pyx_t_5 = 0;
+    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (!__pyx_t_6) {
-      __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_1);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_any); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    if (!__pyx_t_8) {
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_19);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-      __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_2);
-      __pyx_t_3 = PyObject_GetAttr(__pyx_2, __pyx_kp_isnan); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_17));
+      __Pyx_DECREF(__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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_17, 0, ((PyObject *)__pyx_v_w));
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_18 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_18);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
-      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_17));
-      PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_18);
-      __Pyx_GIVEREF(__pyx_t_18);
-      __pyx_t_18 = 0;
-      __pyx_t_18 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_18);
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __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_17)); __pyx_t_17 = 0;
-      __pyx_t_19 = __Pyx_PyObject_IsTrue(__pyx_t_18); if (unlikely(__pyx_t_19 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-      if (!__pyx_t_19) {
-        __pyx_1 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_1);
-        __pyx_t_18 = PyObject_GetAttr(__pyx_1, __pyx_kp_isnan); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_18);
-        __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
-        __pyx_t_17 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_17);
-        __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_17);
-        __Pyx_GIVEREF(__pyx_t_17);
-        __pyx_t_17 = 0;
-        __pyx_t_17 = PyObject_Call(__pyx_t_18, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_17);
-        __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-        if (!__pyx_t_20) {
-          __pyx_2 = __Pyx_GetName(__pyx_m, __pyx_kp_np); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_2);
-          __pyx_t_17 = PyObject_GetAttr(__pyx_2, __pyx_kp_isinf); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_17);
-          __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_18 = PyTuple_New(1); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_18));
-          PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_18), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_t_18)); __pyx_t_18 = 0;
-          __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_22 = __pyx_t_21;
+      __Pyx_DECREF(__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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
+      __Pyx_GIVEREF(__pyx_t_1);
+      __pyx_t_1 = 0;
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      if (!__pyx_t_20) {
+        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __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 = 281; __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_DECREF(__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 = 281; __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 = 281; __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 = 281; __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_5);
+          PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
+          __Pyx_GIVEREF(__pyx_t_1);
+          __pyx_t_1 = 0;
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+          __pyx_t_23 = __pyx_t_22;
         } else {
-          __pyx_t_22 = __pyx_t_20;
+          __pyx_t_23 = __pyx_t_21;
         }
-        __pyx_t_20 = __pyx_t_22;
+        __pyx_t_21 = __pyx_t_23;
       } else {
-        __pyx_t_20 = __pyx_t_19;
+        __pyx_t_21 = __pyx_t_20;
       }
-      __pyx_t_19 = __pyx_t_20;
+      __pyx_t_20 = __pyx_t_21;
     } else {
-      __pyx_t_19 = __pyx_t_6;
+      __pyx_t_20 = __pyx_t_8;
     }
-    if (__pyx_t_19) {
+    if (__pyx_t_20) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
  *         # 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.")             # <<<<<<<<<<<<<<
  * 
  *     w *= wscale
  */
-      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-      __Pyx_INCREF(__pyx_kp_37);
-      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_37);
-      __Pyx_GIVEREF(__pyx_kp_37);
-      __pyx_t_18 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_18);
-      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-      __Pyx_Raise(__pyx_t_18, 0, 0);
-      __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
+      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __Pyx_Raise(__pyx_t_5, 0, 0);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L18;
     }
     __pyx_L18:;
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_18 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_18);
-  __pyx_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_18); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_1);
-  if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_ndarray))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-  __pyx_t_15 = ((PyArrayObject *)__pyx_1);
+  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __pyx_t_7 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-    if (unlikely(__pyx_t_7 < 0)) {
-      PyErr_Fetch(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
+    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__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_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
-        Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);
+        Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);
         __Pyx_RaiseBufferFallbackError();
       } else {
-        PyErr_Restore(__pyx_t_8, __pyx_t_9, __pyx_t_10);
+        PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);
       }
     }
     __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
     __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-    if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_15 = 0;
+  __pyx_t_17 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
-  __pyx_v_w = ((PyArrayObject *)__pyx_1);
-  __pyx_1 = 0;
+  __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
+  __pyx_t_1 = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":280
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":285
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -5544,30 +5619,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_18 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_18);
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_w));
+  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_18);
-  __Pyx_GIVEREF(__pyx_t_18);
-  __pyx_t_18 = 0;
-  __pyx_r = ((PyObject *)__pyx_t_2);
-  __pyx_t_2 = 0;
+  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_1);
+  __pyx_t_1 = 0;
+  __pyx_r = __pyx_t_5;
+  __pyx_t_5 = 0;
   goto __pyx_L0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
-  __Pyx_XDECREF(__pyx_2);
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_17);
-  __Pyx_XDECREF(__pyx_t_18);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_19);
   { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
     __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
@@ -5594,12 +5668,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_XDECREF((PyObject *)__pyx_v_q);
   __Pyx_DECREF(__pyx_v_t_start);
   __Pyx_DECREF((PyObject *)__pyx_v_w);
+  __Pyx_DECREF((PyObject *)__pyx_v_loss);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
+  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
+  __Pyx_DECREF((PyObject *)__pyx_v_Y);
   __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":288
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -5607,12 +5686,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
 
-static INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, double __pyx_v_b) {
+static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, double __pyx_v_b) {
   double __pyx_r;
-  double __pyx_1;
-  __Pyx_SetupRefcountContext("max");
+  double __pyx_t_1;
+  __Pyx_RefNannySetupContext("max");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":289
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
@@ -5620,20 +5699,20 @@ static INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, double __py
  * cdef inline double min(double a, double b):
  */
   if ((__pyx_v_a >= __pyx_v_b)) {
-    __pyx_1 = __pyx_v_a;
+    __pyx_t_1 = __pyx_v_a;
   } else {
-    __pyx_1 = __pyx_v_b;
+    __pyx_t_1 = __pyx_v_b;
   }
-  __pyx_r = __pyx_1;
+  __pyx_r = __pyx_t_1;
   goto __pyx_L0;
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
  *     return a if a >= b else b
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
@@ -5641,12 +5720,12 @@ static INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, double __py
  * 
  */
 
-static INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, double __pyx_v_b) {
+static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, double __pyx_v_b) {
   double __pyx_r;
-  double __pyx_1;
-  __Pyx_SetupRefcountContext("min");
+  double __pyx_t_1;
+  __Pyx_RefNannySetupContext("min");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":292
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
@@ -5654,20 +5733,20 @@ static INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, double __py
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  */
   if ((__pyx_v_a <= __pyx_v_b)) {
-    __pyx_1 = __pyx_v_a;
+    __pyx_t_1 = __pyx_v_a;
   } else {
-    __pyx_1 = __pyx_v_b;
+    __pyx_t_1 = __pyx_v_b;
   }
-  __pyx_r = __pyx_1;
+  __pyx_r = __pyx_t_1;
   goto __pyx_L0;
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":289
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  *     return a if a <= b else b
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
@@ -5680,9 +5759,9 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   int __pyx_v_j;
   double __pyx_r;
   int __pyx_t_1;
-  __Pyx_SetupRefcountContext("dot");
+  __Pyx_RefNannySetupContext("dot");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":296
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  *                 int offset, int xnnz):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -5691,7 +5770,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_sum = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5701,7 +5780,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":299
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5711,7 +5790,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
     __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)]));
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":295
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":300
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
@@ -5723,11 +5802,11 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":297
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
  *     return sum
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
@@ -5743,9 +5822,9 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   double __pyx_v_xsqnorm;
   double __pyx_r;
   int __pyx_t_1;
-  __Pyx_SetupRefcountContext("add");
+  __Pyx_RefNannySetupContext("add");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
  *     cdef int idx
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -5754,7 +5833,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":305
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":310
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -5763,7 +5842,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5773,7 +5852,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":307
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5782,7 +5861,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":308
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5791,7 +5870,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
@@ -5800,7 +5879,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":310
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -5809,7 +5888,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":316
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -5819,7 +5898,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
     (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
   }
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
@@ -5831,11 +5910,11 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
 
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
@@ -5849,9 +5928,9 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   int __pyx_v_idx;
   int __pyx_t_1;
   int __pyx_t_2;
-  __Pyx_SetupRefcountContext("l1penalty");
+  __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":323
  *     """Applys the L1 penalty. This implements the truncated gradient approach by [
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -5860,7 +5939,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -5869,7 +5948,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_j = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":320
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     cdef int idx = 0             # <<<<<<<<<<<<<<
@@ -5878,90 +5957,198 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_idx = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":321
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
  *     cdef int j = 0
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]
  */
-  __pyx_t_1 = __pyx_v_xnnz;
-  for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
+  __pyx_t_1 = __pyx_v_xnnz;
+  for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+ *     cdef int idx = 0
+ *     for j from 0 <= j < xnnz:
+ *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ */
+    __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+ *     for j from 0 <= j < xnnz:
+ *         idx = X_indices_ptr[offset + j]
+ *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+ */
+    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
+ *         idx = X_indices_ptr[offset + j]
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+ *                                                         / wscale) )
+ */
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
+    if (__pyx_t_2) {
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
+ *         z = w_data_ptr[idx]
+ *         if (wscale * w_data_ptr[idx]) > 0:
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])             # <<<<<<<<<<<<<<
+ *                                                         / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ */
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      goto __pyx_L5;
+    }
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
+ *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+ *                                                         / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+ *                                                         / wscale) )
+ */
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
+    if (__pyx_t_2) {
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
+ *                                                         / wscale) )
+ *         elif (wscale * w_data_ptr[idx]) < 0:
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])             # <<<<<<<<<<<<<<
+ *                                                         / wscale) )
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
+ */
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      goto __pyx_L5;
+    }
+    __pyx_L5:;
+
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":335
+ *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+ *                                                         / wscale) )
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
+ * 
+ * cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,
+ */
+    (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
+  }
+
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
+ *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
+ * 
+ * cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,             # <<<<<<<<<<<<<<
+ *                          double *q_data_ptr, double u):
+ *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+ */
+
+static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, unsigned int __pyx_v_n_features, double *__pyx_v_q_data_ptr, double __pyx_v_u) {
+  double __pyx_v_z;
+  int __pyx_v_j;
+  unsigned int __pyx_t_1;
+  int __pyx_t_2;
+  __Pyx_RefNannySetupContext("finall1penalty");
+
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":341
+ *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+ *     """
+ *     cdef double z = 0.0             # <<<<<<<<<<<<<<
+ *     cdef int j = 0
+ *     for j from 0 <= j < n_features:
+ */
+  __pyx_v_z = 0.0;
+
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":342
+ *     """
+ *     cdef double z = 0.0
+ *     cdef int j = 0             # <<<<<<<<<<<<<<
+ *     for j from 0 <= j < n_features:
+ *         z = w_data_ptr[j]
+ */
+  __pyx_v_j = 0;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":322
- *     cdef int idx = 0
- *     for j from 0 <= j < xnnz:
- *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
- *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":343
+ *     cdef double z = 0.0
+ *     cdef int j = 0
+ *     for j from 0 <= j < n_features:             # <<<<<<<<<<<<<<
+ *         z = w_data_ptr[j]
+ *         if (wscale * w_data_ptr[j]) > 0:
  */
-    __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
+  __pyx_t_1 = __pyx_v_n_features;
+  for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":323
- *     for j from 0 <= j < xnnz:
- *         idx = X_indices_ptr[offset + j]
- *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
- *         if (wscale * w_data_ptr[idx]) > 0:
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":344
+ *     cdef int j = 0
+ *     for j from 0 <= j < n_features:
+ *         z = w_data_ptr[j]             # <<<<<<<<<<<<<<
+ *         if (wscale * w_data_ptr[j]) > 0:
+ *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
  */
-    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
+    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_j]);
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324
- *         idx = X_indices_ptr[offset + j]
- *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":345
+ *     for j from 0 <= j < n_features:
+ *         z = w_data_ptr[j]
+ *         if (wscale * w_data_ptr[j]) > 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
+ *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0);
     if (__pyx_t_2) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
- *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )             # <<<<<<<<<<<<<<
- *         elif (wscale * w_data_ptr[idx]) < 0:
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":346
+ *         z = w_data_ptr[j]
+ *         if (wscale * w_data_ptr[j]) > 0:
+ *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])             # <<<<<<<<<<<<<<
+ *                                                     / wscale) )
+ *         elif (wscale * w_data_ptr[j]) < 0:
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
- *         if (wscale * w_data_ptr[idx]) > 0:
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
- *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":348
+ *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
+ *                                                     / wscale) )
+ *         elif (wscale * w_data_ptr[j]) < 0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+ *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0);
     if (__pyx_t_2) {
 
-      /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )             # <<<<<<<<<<<<<<
- *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
- * 
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":349
+ *                                                     / wscale) )
+ *         elif (wscale * w_data_ptr[j]) < 0:
+ *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])             # <<<<<<<<<<<<<<
+ *                                                     / wscale) )
+ *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
- *         elif (wscale * w_data_ptr[idx]) < 0:
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
- *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
+ *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+ *                                                     / wscale) )
+ *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))             # <<<<<<<<<<<<<<
  * 
  */
-    (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
+    (__pyx_v_q_data_ptr[__pyx_v_j]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_j]) - __pyx_v_z));
   }
 
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":65
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":187
  *         # experimental exception made for __getbuffer__ and __releasebuffer__
  *         # -- the details of this may change.
  *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
@@ -5983,18 +6170,21 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   int __pyx_v_hasfields;
   int __pyx_r;
   int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  int __pyx_t_4;
-  int __pyx_t_5;
+  int __pyx_t_2;
+  int __pyx_t_3;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
   int __pyx_t_6;
-  char *__pyx_t_7;
-  __Pyx_SetupRefcountContext("__getbuffer__");
+  int __pyx_t_7;
+  int __pyx_t_8;
+  char *__pyx_t_9;
+  __Pyx_RefNannySetupContext("__getbuffer__");
   if (__pyx_v_info == NULL) return 0;
   __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(__pyx_v_info->obj);
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":71
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":193
  *             # of flags
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -6003,7 +6193,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":72
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":194
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -6012,7 +6202,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":74
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":196
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)
  * 
  *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
@@ -6021,7 +6211,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":76
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":198
  *             ndim = PyArray_NDIM(self)
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -6031,7 +6221,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":77
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":199
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 copy_shape = 1             # <<<<<<<<<<<<<<
@@ -6043,7 +6233,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":79
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":201
  *                 copy_shape = 1
  *             else:
  *                 copy_shape = 0             # <<<<<<<<<<<<<<
@@ -6054,96 +6244,100 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":81
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":203
  *                 copy_shape = 0
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError("ndarray is not C contiguous")
+ *                 raise ValueError(u"ndarray is not C contiguous")
  */
-  if (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS)) {
+  __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
+  if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":82
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":204
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError("ndarray is not C contiguous")
+ *                 raise ValueError(u"ndarray is not C contiguous")
  * 
  */
-    __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
+    __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
+    __pyx_t_3 = __pyx_t_2;
   } else {
-    __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
+    __pyx_t_3 = __pyx_t_1;
   }
-  if (__pyx_t_1) {
+  if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":83
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":205
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
- *                 raise ValueError("ndarray is not C contiguous")             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __Pyx_INCREF(__pyx_kp_1);
-    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_1);
-    __Pyx_GIVEREF(__pyx_kp_1);
-    __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __Pyx_Raise(__pyx_t_3, 0, 0);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 83; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
+    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
+    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    __Pyx_Raise(__pyx_t_5, 0, 0);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":85
- *                 raise ValueError("ndarray is not C contiguous")
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":207
+ *                 raise ValueError(u"ndarray is not C contiguous")
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError("ndarray is not Fortran contiguous")
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
  */
-  if (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS)) {
+  __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
+  if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":86
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":208
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
- *                 raise ValueError("ndarray is not Fortran contiguous")
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
  * 
  */
     __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
+    __pyx_t_2 = __pyx_t_1;
   } else {
-    __pyx_t_1 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
+    __pyx_t_2 = __pyx_t_3;
   }
-  if (__pyx_t_1) {
+  if (__pyx_t_2) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":87
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":209
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
- *                 raise ValueError("ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
  * 
  *             info.buf = PyArray_DATA(self)
  */
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-    __Pyx_INCREF(__pyx_kp_2);
-    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_2);
-    __Pyx_GIVEREF(__pyx_kp_2);
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __Pyx_Raise(__pyx_t_2, 0, 0);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
+    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
+    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
+    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_Raise(__pyx_t_4, 0, 0);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L7;
   }
   __pyx_L7:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":89
- *                 raise ValueError("ndarray is not Fortran contiguous")
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":211
+ *                 raise ValueError(u"ndarray is not Fortran contiguous")
  * 
  *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
  *             info.ndim = ndim
@@ -6151,7 +6345,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":90
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":212
  * 
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim             # <<<<<<<<<<<<<<
@@ -6160,17 +6354,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":91
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":213
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim
  *             if copy_shape:             # <<<<<<<<<<<<<<
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  */
-  __pyx_t_4 = __pyx_v_copy_shape;
-  if (__pyx_t_4) {
+  __pyx_t_6 = __pyx_v_copy_shape;
+  if (__pyx_t_6) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":94
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":216
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<
@@ -6179,7 +6373,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":95
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":217
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
@@ -6188,17 +6382,18 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":96
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":218
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):             # <<<<<<<<<<<<<<
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  */
-    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_v_ndim; __pyx_t_4+=1) {
-      __pyx_v_i = __pyx_t_4;
+    __pyx_t_6 = __pyx_v_ndim;
+    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
+      __pyx_v_i = __pyx_t_7;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":97
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":219
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
@@ -6207,7 +6402,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
       (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":98
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":220
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
@@ -6220,7 +6415,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":100
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":222
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  *             else:
  *                 info.strides = PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
@@ -6229,7 +6424,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":101
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":223
  *             else:
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)             # <<<<<<<<<<<<<<
@@ -6240,7 +6435,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L8:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":102
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":224
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
@@ -6249,7 +6444,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->suboffsets = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":103
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":225
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
@@ -6258,7 +6453,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":104
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":226
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)
  *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
@@ -6267,7 +6462,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":107
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":229
  * 
  *             cdef int t
  *             cdef char* f = NULL             # <<<<<<<<<<<<<<
@@ -6276,7 +6471,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_f = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":108
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":230
  *             cdef int t
  *             cdef char* f = NULL
  *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
@@ -6286,7 +6481,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
   __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":112
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":234
  *             cdef int offset
  * 
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
@@ -6295,21 +6490,23 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":114
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":236
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
  * 
  *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
  *                 # do not call releasebuffer
  *                 info.obj = None
  */
-  if ((!__pyx_v_hasfields)) {
-    __pyx_t_1 = (!__pyx_v_copy_shape);
+  __pyx_t_2 = (!__pyx_v_hasfields);
+  if (__pyx_t_2) {
+    __pyx_t_3 = (!__pyx_v_copy_shape);
+    __pyx_t_1 = __pyx_t_3;
   } else {
-    __pyx_t_1 = (!__pyx_v_hasfields);
+    __pyx_t_1 = __pyx_t_2;
   }
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":116
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":238
  *             if not hasfields and not copy_shape:
  *                 # do not call releasebuffer
  *                 info.obj = None             # <<<<<<<<<<<<<<
@@ -6325,7 +6522,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":119
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":241
  *             else:
  *                 # need to call releasebuffer
  *                 info.obj = self             # <<<<<<<<<<<<<<
@@ -6340,7 +6537,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L11:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":121
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":243
  *                 info.obj = self
  * 
  *             if not hasfields:             # <<<<<<<<<<<<<<
@@ -6350,7 +6547,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = (!__pyx_v_hasfields);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":122
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":244
  * 
  *             if not hasfields:
  *                 t = descr.type_num             # <<<<<<<<<<<<<<
@@ -6359,286 +6556,322 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_t = __pyx_v_descr->type_num;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":123
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":245
  *             if not hasfields:
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError("Non-native byte order not supported")
+ *                     raise ValueError(u"Non-native byte order not supported")
  */
-    if ((__pyx_v_descr->byteorder == '>')) {
-      __pyx_t_1 = __pyx_v_little_endian;
+    __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
+    if (__pyx_t_1) {
+      __pyx_t_2 = __pyx_v_little_endian;
     } else {
-      __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
+      __pyx_t_2 = __pyx_t_1;
     }
-    if (!__pyx_t_1) {
+    if (!__pyx_t_2) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":124
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":246
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
- *                     raise ValueError("Non-native byte order not supported")
+ *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  */
-      if ((__pyx_v_descr->byteorder == '<')) {
-        __pyx_t_5 = (!__pyx_v_little_endian);
+      __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
+      if (__pyx_t_1) {
+        __pyx_t_3 = (!__pyx_v_little_endian);
+        __pyx_t_8 = __pyx_t_3;
       } else {
-        __pyx_t_5 = (__pyx_v_descr->byteorder == '<');
+        __pyx_t_8 = __pyx_t_1;
       }
-      __pyx_t_6 = __pyx_t_5;
+      __pyx_t_1 = __pyx_t_8;
     } else {
-      __pyx_t_6 = __pyx_t_1;
+      __pyx_t_1 = __pyx_t_2;
     }
-    if (__pyx_t_6) {
+    if (__pyx_t_1) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":125
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":247
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError("Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  */
-      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-      __Pyx_INCREF(__pyx_kp_5);
-      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_5);
-      __Pyx_GIVEREF(__pyx_kp_5);
-      __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-      __Pyx_Raise(__pyx_t_3, 0, 0);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
+      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_Raise(__pyx_t_5, 0, 0);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":126
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":248
  *                     (descr.byteorder == '<' and not little_endian)):
- *                     raise ValueError("Non-native byte order not supported")
+ *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  */
-    switch (__pyx_v_t) {
-      case NPY_BYTE:
-      __pyx_v_f = __pyx_k_6;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__b;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":127
- *                     raise ValueError("Non-native byte order not supported")
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":249
+ *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  */
-      case NPY_UBYTE:
-      __pyx_v_f = __pyx_k_7;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__B;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":128
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":250
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  */
-      case NPY_SHORT:
-      __pyx_v_f = __pyx_k_8;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__h;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":129
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":251
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  */
-      case NPY_USHORT:
-      __pyx_v_f = __pyx_k_9;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__H;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":130
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":252
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  */
-      case NPY_INT:
-      __pyx_v_f = __pyx_k_10;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_INT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__i;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":131
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":253
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  */
-      case NPY_UINT:
-      __pyx_v_f = __pyx_k_11;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_UINT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__I;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":132
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":254
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  */
-      case NPY_LONG:
-      __pyx_v_f = __pyx_k_12;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_LONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__l;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":133
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":255
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  */
-      case NPY_ULONG:
-      __pyx_v_f = __pyx_k_13;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__L;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":134
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":256
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  */
-      case NPY_LONGLONG:
-      __pyx_v_f = __pyx_k_14;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__q;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":135
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":257
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  */
-      case NPY_ULONGLONG:
-      __pyx_v_f = __pyx_k_15;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Q;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":136
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":258
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  */
-      case NPY_FLOAT:
-      __pyx_v_f = __pyx_k_16;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__f;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":137
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":259
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  */
-      case NPY_DOUBLE:
-      __pyx_v_f = __pyx_k_17;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__d;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":138
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":260
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  */
-      case NPY_LONGDOUBLE:
-      __pyx_v_f = __pyx_k_18;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__g;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":139
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":261
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  */
-      case NPY_CFLOAT:
-      __pyx_v_f = __pyx_k_19;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zf;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":140
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":262
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"
  */
-      case NPY_CDOUBLE:
-      __pyx_v_f = __pyx_k_20;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zd;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":141
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":263
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
  */
-      case NPY_CLONGDOUBLE:
-      __pyx_v_f = __pyx_k_21;
-      break;
+    __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__Zg;
+      goto __pyx_L14;
+    }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":142
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":264
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
  *                 else:
- *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  */
-      case NPY_OBJECT:
-      __pyx_v_f = __pyx_k_22;
-      break;
-      default:
+    __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
+    if (__pyx_t_1) {
+      __pyx_v_f = __pyx_k__O;
+      goto __pyx_L14;
+    }
+    /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":144
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":266
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
- *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *                 info.format = f
  *                 return
  */
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyNumber_Remainder(__pyx_kp_23, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-      __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-      __Pyx_Raise(__pyx_t_2, 0, 0);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      break;
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
+      __Pyx_GIVEREF(__pyx_t_4);
+      __pyx_t_4 = 0;
+      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_4, 0, 0);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
+    __pyx_L14:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":145
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":267
  *                 else:
- *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f             # <<<<<<<<<<<<<<
  *                 return
  *             else:
  */
     __pyx_v_info->format = __pyx_v_f;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":146
- *                     raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":268
+ *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f
  *                 return             # <<<<<<<<<<<<<<
  *             else:
@@ -6650,7 +6883,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":148
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":270
  *                 return
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
@@ -6659,7 +6892,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = ((char *)malloc(255));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":149
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":271
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
@@ -6668,7 +6901,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     (__pyx_v_info->format[0]) = '^';
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":150
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":272
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment
  *                 offset = 0             # <<<<<<<<<<<<<<
@@ -6677,17 +6910,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_offset = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":153
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":275
  *                 f = _util_dtypestring(descr, info.format + 1,
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)             # <<<<<<<<<<<<<<
  *                 f[0] = 0 # Terminate format string
  * 
  */
-    __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_7;
+    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_v_f = __pyx_t_9;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":154
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":276
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)
  *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<
@@ -6701,8 +6934,8 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
   __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
   __pyx_r = -1;
   __Pyx_GOTREF(__pyx_v_info->obj);
@@ -6715,11 +6948,12 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L2:;
   __Pyx_XDECREF((PyObject *)__pyx_v_descr);
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":156
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":278
  *                 f[0] = 0 # Terminate format string
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
@@ -6730,10 +6964,10 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
 static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
 static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
   int __pyx_t_1;
-  int __pyx_t_2;
-  __Pyx_SetupRefcountContext("__releasebuffer__");
+  __Pyx_RefNannySetupContext("__releasebuffer__");
+  __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":157
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":279
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
@@ -6743,7 +6977,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":158
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":280
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
@@ -6755,48 +6989,244 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":159
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":281
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
  *                 stdlib.free(info.strides)
  *                 # info.shape was stored after info.strides in the same block
  */
-  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_2) {
+  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
+  if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":160
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":282
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
  *                 # info.shape was stored after info.strides in the same block
  * 
  */
-    free(__pyx_v_info->strides);
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
+    free(__pyx_v_info->strides);
+    goto __pyx_L6;
+  }
+  __pyx_L6:;
+
+  __Pyx_DECREF((PyObject *)__pyx_v_self);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":755
+ * ctypedef npy_cdouble     complex_t
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(1, a)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew1");
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":756
+ * 
+ * cdef inline object PyArray_MultiIterNew1(a):
+ *     return PyArray_MultiIterNew(1, a)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":758
+ *     return PyArray_MultiIterNew(1, a)
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(2, a, b)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew2");
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":759
+ * 
+ * cdef inline object PyArray_MultiIterNew2(a, b):
+ *     return PyArray_MultiIterNew(2, a, b)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":761
+ *     return PyArray_MultiIterNew(2, a, b)
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(3, a, b,  c)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew3");
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":762
+ * 
+ * cdef inline object PyArray_MultiIterNew3(a, b, c):
+ *     return PyArray_MultiIterNew(3, a, b,  c)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":764
+ *     return PyArray_MultiIterNew(3, a, b,  c)
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(4, a, b, c,  d)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew4");
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":765
+ * 
+ * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
+ *     return PyArray_MultiIterNew(4, a, b, c,  d)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":767
+ *     return PyArray_MultiIterNew(4, a, b, c,  d)
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
+ *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
+ * 
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {
+  PyObject *__pyx_r = NULL;
+  PyObject *__pyx_t_1 = NULL;
+  __Pyx_RefNannySetupContext("PyArray_MultiIterNew5");
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":768
+ * 
+ * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
+ *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
+ */
+  __Pyx_XDECREF(__pyx_r);
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
+  goto __pyx_L0;
 
-  __Pyx_FinishRefcountContext();
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  goto __pyx_L0;
+  __pyx_L1_error:;
+  __Pyx_XDECREF(__pyx_t_1);
+  __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5");
+  __pyx_r = 0;
+  __pyx_L0:;
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":277
- * ctypedef npy_cdouble     complex_t
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":770
+ *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
  * 
  * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
  *     # Recursive utility function used in __getbuffer__ to get format
  *     # string. The new location in the format string is returned.
  */
 
-static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
+static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {
   PyArray_Descr *__pyx_v_child;
-  PyObject *__pyx_v_i;
   int __pyx_v_endian_detector;
   int __pyx_v_little_endian;
+  PyObject *__pyx_v_fields;
+  PyObject *__pyx_v_childname;
   PyObject *__pyx_v_new_offset;
   PyObject *__pyx_v_t;
   char *__pyx_r;
-  PyObject *__pyx_1 = 0;
   Py_ssize_t __pyx_t_1;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
@@ -6805,199 +7235,195 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
   int __pyx_t_6;
   int __pyx_t_7;
   int __pyx_t_8;
-  char *__pyx_t_9;
-  __Pyx_SetupRefcountContext("_util_dtypestring");
+  int __pyx_t_9;
+  char *__pyx_t_10;
+  __Pyx_RefNannySetupContext("_util_dtypestring");
+  __Pyx_INCREF((PyObject *)__pyx_v_descr);
   __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);
-  __pyx_v_i = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
+  __pyx_v_fields = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
+  __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":284
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":777
  *     cdef int delta_offset
  *     cdef tuple i
  *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)
- * 
+ *     cdef tuple fields
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":285
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":778
  *     cdef tuple i
  *     cdef int endian_detector = 1
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
+ *     cdef tuple fields
  * 
- *     for i in descr.fields.itervalues():
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":287
- *     cdef bint little_endian = ((&endian_detector)[0] != 0)
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":781
+ *     cdef tuple fields
  * 
- *     for i in descr.fields.itervalues():             # <<<<<<<<<<<<<<
- *         child = i[0]
- *         new_offset = i[1]
+ *     for childname in descr.names:             # <<<<<<<<<<<<<<
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields
  */
-  __pyx_t_2 = PyObject_GetAttr(__pyx_v_descr->fields, __pyx_kp_itervalues); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
-    __pyx_t_1 = 0; __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2);
+  if (likely(((PyObject *)__pyx_v_descr->names) != Py_None)) {
+    __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);
   } else {
-    __pyx_t_1 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   for (;;) {
-    if (likely(PyList_CheckExact(__pyx_t_2))) {
-      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else if (likely(PyTuple_CheckExact(__pyx_t_2))) {
-      if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
-    } else {
-      __pyx_t_3 = PyIter_Next(__pyx_t_2);
-      if (!__pyx_t_3) {
-        if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        break;
-      }
-      __Pyx_GOTREF(__pyx_t_3);
-    }
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3)) || (__pyx_t_3) == Py_None || (PyErr_Format(PyExc_TypeError, "Expected tuple, got %s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(((PyObject *)__pyx_v_i));
-    __pyx_v_i = ((PyObject *)__pyx_t_3);
+    if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
+    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;
+    __Pyx_DECREF(__pyx_v_childname);
+    __pyx_v_childname = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":288
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":782
  * 
- *     for i in descr.fields.itervalues():
- *         child = i[0]             # <<<<<<<<<<<<<<
- *         new_offset = i[1]
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
+ *         child, new_offset = fields
  * 
  */
-    __pyx_1 = __Pyx_GetItemInt_Tuple(((PyObject *)__pyx_v_i), 0, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    if (!(__Pyx_TypeTest(__pyx_1, __pyx_ptype_5numpy_dtype))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(((PyObject *)__pyx_v_child));
-    __pyx_v_child = ((PyArray_Descr *)__pyx_1);
-    __pyx_1 = 0;
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(((PyObject *)__pyx_v_fields));
+    __pyx_v_fields = ((PyObject *)__pyx_t_3);
+    __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":289
- *     for i in descr.fields.itervalues():
- *         child = i[0]
- *         new_offset = i[1]             # <<<<<<<<<<<<<<
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":783
+ *     for childname in descr.names:
+ *         fields = descr.fields[childname]
+ *         child, new_offset = fields             # <<<<<<<<<<<<<<
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
  */
-    __pyx_1 = __Pyx_GetItemInt_Tuple(((PyObject *)__pyx_v_i), 1, sizeof(long), PyInt_FromLong); if (!__pyx_1) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_1);
-    __Pyx_DECREF(__pyx_v_new_offset);
-    __pyx_v_new_offset = __pyx_1;
-    __pyx_1 = 0;
+    if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {
+      PyObject* tuple = ((PyObject *)__pyx_v_fields);
+      __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);
+      __Pyx_DECREF(((PyObject *)__pyx_v_child));
+      __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);
+      __pyx_t_3 = 0;
+      __Pyx_DECREF(__pyx_v_new_offset);
+      __pyx_v_new_offset = __pyx_t_4;
+      __pyx_t_4 = 0;
+    } else {
+      __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":291
- *         new_offset = i[1]
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":785
+ *         child, new_offset = fields
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
- *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
  * 
  */
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_4, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":292
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":786
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
- *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  */
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-      __Pyx_INCREF(__pyx_kp_25);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_25);
-      __Pyx_GIVEREF(__pyx_kp_25);
-      __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __Pyx_Raise(__pyx_t_4, 0, 0);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_9));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));
+      __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __Pyx_Raise(__pyx_t_3, 0, 0);
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":294
- *             raise RuntimeError("Format string allocated too short, see comment in numpy.pxd")
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":788
+ *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
  * 
  *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
  *             (child.byteorder == '<' and not little_endian)):
- *             raise ValueError("Non-native byte order not supported")
+ *             raise ValueError(u"Non-native byte order not supported")
  */
-    if ((__pyx_v_child->byteorder == '>')) {
-      __pyx_t_6 = __pyx_v_little_endian;
+    __pyx_t_6 = (__pyx_v_child->byteorder == '>');
+    if (__pyx_t_6) {
+      __pyx_t_7 = __pyx_v_little_endian;
     } else {
-      __pyx_t_6 = (__pyx_v_child->byteorder == '>');
+      __pyx_t_7 = __pyx_t_6;
     }
-    if (!__pyx_t_6) {
+    if (!__pyx_t_7) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":295
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":789
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
- *             raise ValueError("Non-native byte order not supported")
+ *             raise ValueError(u"Non-native byte order not supported")
  *             # One could encode it in the format string and have Cython
  */
-      if ((__pyx_v_child->byteorder == '<')) {
-        __pyx_t_7 = (!__pyx_v_little_endian);
+      __pyx_t_6 = (__pyx_v_child->byteorder == '<');
+      if (__pyx_t_6) {
+        __pyx_t_8 = (!__pyx_v_little_endian);
+        __pyx_t_9 = __pyx_t_8;
       } else {
-        __pyx_t_7 = (__pyx_v_child->byteorder == '<');
+        __pyx_t_9 = __pyx_t_6;
       }
-      __pyx_t_8 = __pyx_t_7;
+      __pyx_t_6 = __pyx_t_9;
     } else {
-      __pyx_t_8 = __pyx_t_6;
+      __pyx_t_6 = __pyx_t_7;
     }
-    if (__pyx_t_8) {
+    if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":296
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":790
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):
- *             raise ValueError("Non-native byte order not supported")             # <<<<<<<<<<<<<<
+ *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *             # One could encode it in the format string and have Cython
  *             # complain instead, BUT: < and > in format strings also imply
  */
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-      __Pyx_INCREF(__pyx_kp_28);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_28);
-      __Pyx_GIVEREF(__pyx_kp_28);
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
+      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_7));
+      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":306
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":800
  * 
  *         # Output padding bytes
  *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
@@ -7005,16 +7431,16 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
  *             f += 1
  */
     while (1) {
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (!__pyx_t_8) break;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (!__pyx_t_6) break;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":307
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":801
  *         # Output padding bytes
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
@@ -7023,7 +7449,7 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
  */
       (__pyx_v_f[0]) = 120;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":308
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":802
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7032,7 +7458,7 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
  */
       __pyx_v_f += 1;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":309
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":803
  *             f[0] = 120 # "x"; pad byte
  *             f += 1
  *             offset[0] += 1             # <<<<<<<<<<<<<<
@@ -7042,7 +7468,7 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
       (__pyx_v_offset[0]) += 1;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":311
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":805
  *             offset[0] += 1
  * 
  *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
@@ -7051,417 +7477,417 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
  */
     (__pyx_v_offset[0]) += __pyx_v_child->elsize;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":313
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":807
  *         offset[0] += child.itemsize
  * 
  *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
  *             t = child.type_num
  *             if end - f < 5:
  */
-    __pyx_t_8 = (!PyDataType_HASFIELDS(__pyx_v_child));
-    if (__pyx_t_8) {
+    __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));
+    if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":314
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":808
  * 
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num             # <<<<<<<<<<<<<<
  *             if end - f < 5:
- *                 raise RuntimeError("Format string allocated too short.")
+ *                 raise RuntimeError(u"Format string allocated too short.")
  */
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 314; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_v_t);
-      __pyx_v_t = __pyx_t_4;
-      __pyx_t_4 = 0;
+      __pyx_v_t = __pyx_t_3;
+      __pyx_t_3 = 0;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":315
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":809
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num
  *             if end - f < 5:             # <<<<<<<<<<<<<<
- *                 raise RuntimeError("Format string allocated too short.")
+ *                 raise RuntimeError(u"Format string allocated too short.")
  * 
  */
-      __pyx_t_8 = ((__pyx_v_end - __pyx_v_f) < 5);
-      if (__pyx_t_8) {
+      __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);
+      if (__pyx_t_6) {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":316
+        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":810
  *             t = child.type_num
  *             if end - f < 5:
- *                 raise RuntimeError("Format string allocated too short.")             # <<<<<<<<<<<<<<
+ *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
-        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-        __Pyx_INCREF(__pyx_kp_29);
-        PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_29);
-        __Pyx_GIVEREF(__pyx_kp_29);
-        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
+        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_10));
+        __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
+        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_Raise(__pyx_t_5, 0, 0);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         goto __pyx_L10;
       }
       __pyx_L10:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":319
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":813
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 98;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":320
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":814
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 66;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":321
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":815
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 321; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 104;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":322
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":816
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 72;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":323
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":817
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 105;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":324
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":818
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 73;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":325
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":819
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 108;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":326
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":820
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 76;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":327
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":821
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 113;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":328
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":822
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 81;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":329
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":823
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 102;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":330
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":824
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 100;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":331
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":825
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 103;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":332
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":826
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 102;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":333
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":827
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 100;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":334
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":828
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
  */
-      __pyx_t_4 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__pyx_t_8) {
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
         (__pyx_v_f[1]) = 103;
         __pyx_v_f += 1;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":335
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":829
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
  *             else:
- *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__pyx_t_8) {
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      if (__pyx_t_6) {
         (__pyx_v_f[0]) = 79;
         goto __pyx_L11;
       }
       /*else*/ {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":337
+        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":831
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
- *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *             f += 1
  *         else:
  */
-        __pyx_t_4 = PyNumber_Remainder(__pyx_kp_30, __pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_5));
-        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
-        __Pyx_GIVEREF(__pyx_t_4);
-        __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-        __Pyx_Raise(__pyx_t_4, 0, 0);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_t_3 = 0;
+        __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
+        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+        __Pyx_Raise(__pyx_t_3, 0, 0);
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_L11:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":338
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":832
  *             else:
- *                 raise ValueError("unknown dtype code in numpy.pxd (%d)" % t)
+ *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *             f += 1             # <<<<<<<<<<<<<<
  *         else:
  *             # Cython ignores struct boundary information ("T{...}"),
@@ -7471,25 +7897,26 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":342
+      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":836
  *             # Cython ignores struct boundary information ("T{...}"),
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
  *     return f
  * 
  */
-      __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_f = __pyx_t_9;
+      __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_v_f = __pyx_t_10;
     }
     __pyx_L9:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":343
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":837
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)
  *     return f             # <<<<<<<<<<<<<<
  * 
+ * 
  */
   __pyx_r = __pyx_v_f;
   goto __pyx_L0;
@@ -7497,7 +7924,6 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
@@ -7506,10 +7932,151 @@ static INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_desc
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_DECREF((PyObject *)__pyx_v_child);
-  __Pyx_DECREF(__pyx_v_i);
+  __Pyx_DECREF(__pyx_v_fields);
+  __Pyx_DECREF(__pyx_v_childname);
   __Pyx_DECREF(__pyx_v_new_offset);
   __Pyx_DECREF(__pyx_v_t);
-  __Pyx_FinishRefcountContext();
+  __Pyx_DECREF((PyObject *)__pyx_v_descr);
+  __Pyx_RefNannyFinishContext();
+  return __pyx_r;
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":952
+ * 
+ * 
+ * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ */
+
+static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {
+  PyObject *__pyx_v_baseptr;
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("set_array_base");
+  __Pyx_INCREF((PyObject *)__pyx_v_arr);
+  __Pyx_INCREF(__pyx_v_base);
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":954
+ * cdef inline void set_array_base(ndarray arr, object base):
+ *      cdef PyObject* baseptr
+ *      if base is None:             # <<<<<<<<<<<<<<
+ *          baseptr = NULL
+ *      else:
+ */
+  __pyx_t_1 = (__pyx_v_base == Py_None);
+  if (__pyx_t_1) {
+
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":955
+ *      cdef PyObject* baseptr
+ *      if base is None:
+ *          baseptr = NULL             # <<<<<<<<<<<<<<
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ */
+    __pyx_v_baseptr = NULL;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":957
+ *          baseptr = NULL
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
+ *          baseptr = base
+ *      Py_XDECREF(arr.base)
+ */
+    Py_INCREF(__pyx_v_base);
+
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":958
+ *      else:
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = base             # <<<<<<<<<<<<<<
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr
+ */
+    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);
+  }
+  __pyx_L3:;
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":959
+ *          Py_INCREF(base) # important to do this before decref below!
+ *          baseptr = base
+ *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
+ *      arr.base = baseptr
+ * 
+ */
+  Py_XDECREF(__pyx_v_arr->base);
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":960
+ *          baseptr = base
+ *      Py_XDECREF(arr.base)
+ *      arr.base = baseptr             # <<<<<<<<<<<<<<
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ */
+  __pyx_v_arr->base = __pyx_v_baseptr;
+
+  __Pyx_DECREF((PyObject *)__pyx_v_arr);
+  __Pyx_DECREF(__pyx_v_base);
+  __Pyx_RefNannyFinishContext();
+}
+
+/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":962
+ *      arr.base = baseptr
+ * 
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
+ */
+
+static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {
+  PyObject *__pyx_r = NULL;
+  int __pyx_t_1;
+  __Pyx_RefNannySetupContext("get_array_base");
+  __Pyx_INCREF((PyObject *)__pyx_v_arr);
+
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":963
+ * 
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:             # <<<<<<<<<<<<<<
+ *         return None
+ *     else:
+ */
+  __pyx_t_1 = (__pyx_v_arr->base == NULL);
+  if (__pyx_t_1) {
+
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":964
+ * cdef inline object get_array_base(ndarray arr):
+ *     if arr.base is NULL:
+ *         return None             # <<<<<<<<<<<<<<
+ *     else:
+ *         return arr.base
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(Py_None);
+    __pyx_r = Py_None;
+    goto __pyx_L0;
+    goto __pyx_L3;
+  }
+  /*else*/ {
+
+    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":966
+ *         return None
+ *     else:
+ *         return arr.base             # <<<<<<<<<<<<<<
+ */
+    __Pyx_XDECREF(__pyx_r);
+    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));
+    __pyx_r = ((PyObject *)__pyx_v_arr->base);
+    goto __pyx_L0;
+  }
+  __pyx_L3:;
+
+  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  __pyx_L0:;
+  __Pyx_DECREF((PyObject *)__pyx_v_arr);
+  __Pyx_XGIVEREF(__pyx_r);
+  __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_vtable_15sgd_fast_sparse_LossFunction;
@@ -7677,6 +8244,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_LossFunction = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_vtable_15sgd_fast_sparse_Regression;
 
@@ -7839,6 +8410,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Regression = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_vtable_15sgd_fast_sparse_Classification;
 
@@ -8001,6 +8576,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Classification = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber __pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
 
@@ -8164,6 +8743,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_ModifiedHuber = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge __pyx_vtable_15sgd_fast_sparse_Hinge;
 
@@ -8327,6 +8910,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Hinge = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Log __pyx_vtable_15sgd_fast_sparse_Log;
 
@@ -8490,6 +9077,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Log = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError __pyx_vtable_15sgd_fast_sparse_SquaredError;
 
@@ -8653,6 +9244,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_SquaredError = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber __pyx_vtable_15sgd_fast_sparse_Huber;
 
@@ -8816,6 +9411,10 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = {
   0, /*tp_cache*/
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
+  0, /*tp_del*/
+  #if PY_VERSION_HEX >= 0x02060000
+  0, /*tp_version_tag*/
+  #endif
 };
 
 static struct PyMethodDef __pyx_methods[] = {
@@ -8840,81 +9439,92 @@ static struct PyModuleDef __pyx_moduledef = {
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_kp___main__, __pyx_k___main__, sizeof(__pyx_k___main__), 1, 1, 1},
-  {&__pyx_kp_loss, __pyx_k_loss, sizeof(__pyx_k_loss), 1, 1, 1},
-  {&__pyx_kp_dloss, __pyx_k_dloss, sizeof(__pyx_k_dloss), 1, 1, 1},
-  {&__pyx_kp___reduce__, __pyx_k___reduce__, sizeof(__pyx_k___reduce__), 1, 1, 1},
-  {&__pyx_kp___init__, __pyx_k___init__, sizeof(__pyx_k___init__), 1, 1, 1},
-  {&__pyx_kp_p, __pyx_k_p, sizeof(__pyx_k_p), 1, 1, 1},
-  {&__pyx_kp_y, __pyx_k_y, sizeof(__pyx_k_y), 1, 1, 1},
-  {&__pyx_kp_c, __pyx_k_c, sizeof(__pyx_k_c), 1, 1, 1},
-  {&__pyx_kp_w, __pyx_k_w, sizeof(__pyx_k_w), 1, 1, 1},
-  {&__pyx_kp_intercept, __pyx_k_intercept, sizeof(__pyx_k_intercept), 1, 1, 1},
-  {&__pyx_kp_penalty_type, __pyx_k_penalty_type, sizeof(__pyx_k_penalty_type), 1, 1, 1},
-  {&__pyx_kp_alpha, __pyx_k_alpha, sizeof(__pyx_k_alpha), 1, 1, 1},
-  {&__pyx_kp_rho, __pyx_k_rho, sizeof(__pyx_k_rho), 1, 1, 1},
-  {&__pyx_kp_X_data, __pyx_k_X_data, sizeof(__pyx_k_X_data), 1, 1, 1},
-  {&__pyx_kp_X_indices, __pyx_k_X_indices, sizeof(__pyx_k_X_indices), 1, 1, 1},
-  {&__pyx_kp_X_indptr, __pyx_k_X_indptr, sizeof(__pyx_k_X_indptr), 1, 1, 1},
-  {&__pyx_kp_Y, __pyx_k_Y, sizeof(__pyx_k_Y), 1, 1, 1},
-  {&__pyx_kp_n_iter, __pyx_k_n_iter, sizeof(__pyx_k_n_iter), 1, 1, 1},
-  {&__pyx_kp_fit_intercept, __pyx_k_fit_intercept, sizeof(__pyx_k_fit_intercept), 1, 1, 1},
-  {&__pyx_kp_verbose, __pyx_k_verbose, sizeof(__pyx_k_verbose), 1, 1, 1},
-  {&__pyx_kp_shuffle, __pyx_k_shuffle, sizeof(__pyx_k_shuffle), 1, 1, 1},
-  {&__pyx_kp_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 1, 1, 1},
-  {&__pyx_kp_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 1, 1},
-  {&__pyx_kp_sys, __pyx_k_sys, sizeof(__pyx_k_sys), 1, 1, 1},
-  {&__pyx_kp_time, __pyx_k_time, sizeof(__pyx_k_time), 1, 1, 1},
-  {&__pyx_kp_NotImplementedError, __pyx_k_NotImplementedError, sizeof(__pyx_k_NotImplementedError), 1, 1, 1},
-  {&__pyx_kp_arange, __pyx_k_arange, sizeof(__pyx_k_arange), 1, 1, 1},
-  {&__pyx_kp_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 1, 1, 1},
-  {&__pyx_kp_31, __pyx_k_31, sizeof(__pyx_k_31), 1, 1, 1},
-  {&__pyx_kp_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 1, 1, 1},
-  {&__pyx_kp_32, __pyx_k_32, sizeof(__pyx_k_32), 1, 1, 1},
-  {&__pyx_kp_order, __pyx_k_order, sizeof(__pyx_k_order), 1, 1, 1},
-  {&__pyx_kp_33, __pyx_k_33, sizeof(__pyx_k_33), 0, 1, 0},
-  {&__pyx_kp_random, __pyx_k_random, sizeof(__pyx_k_random), 1, 1, 1},
-  {&__pyx_kp_dot, __pyx_k_dot, sizeof(__pyx_k_dot), 1, 1, 1},
-  {&__pyx_kp_nonzero, __pyx_k_nonzero, sizeof(__pyx_k_nonzero), 1, 1, 1},
-  {&__pyx_kp_shape, __pyx_k_shape, sizeof(__pyx_k_shape), 1, 1, 1},
-  {&__pyx_kp_any, __pyx_k_any, sizeof(__pyx_k_any), 1, 1, 1},
-  {&__pyx_kp_isinf, __pyx_k_isinf, sizeof(__pyx_k_isinf), 1, 1, 1},
-  {&__pyx_kp_isnan, __pyx_k_isnan, sizeof(__pyx_k_isnan), 1, 1, 1},
-  {&__pyx_kp_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 1, 1, 1},
-  {&__pyx_kp_34, __pyx_k_34, sizeof(__pyx_k_34), 0, 0, 0},
-  {&__pyx_kp_35, __pyx_k_35, sizeof(__pyx_k_35), 0, 0, 0},
-  {&__pyx_kp_36, __pyx_k_36, sizeof(__pyx_k_36), 0, 0, 0},
-  {&__pyx_kp_37, __pyx_k_37, sizeof(__pyx_k_37), 0, 0, 0},
-  {&__pyx_kp___getbuffer__, __pyx_k___getbuffer__, sizeof(__pyx_k___getbuffer__), 1, 1, 1},
-  {&__pyx_kp___releasebuffer__, __pyx_k___releasebuffer__, sizeof(__pyx_k___releasebuffer__), 1, 1, 1},
-  {&__pyx_kp_info, __pyx_k_info, sizeof(__pyx_k_info), 1, 1, 1},
-  {&__pyx_kp_flags, __pyx_k_flags, sizeof(__pyx_k_flags), 1, 1, 1},
-  {&__pyx_kp_range, __pyx_k_range, sizeof(__pyx_k_range), 1, 1, 1},
-  {&__pyx_kp_itervalues, __pyx_k_itervalues, sizeof(__pyx_k_itervalues), 1, 1, 1},
-  {&__pyx_kp_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 1, 1, 1},
-  {&__pyx_kp_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 0},
-  {&__pyx_kp_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 0},
-  {&__pyx_kp_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 0},
-  {&__pyx_kp_23, __pyx_k_23, sizeof(__pyx_k_23), 0, 0, 0},
-  {&__pyx_kp_25, __pyx_k_25, sizeof(__pyx_k_25), 0, 0, 0},
-  {&__pyx_kp_28, __pyx_k_28, sizeof(__pyx_k_28), 0, 0, 0},
-  {&__pyx_kp_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 0, 0},
-  {&__pyx_kp_30, __pyx_k_30, sizeof(__pyx_k_30), 0, 0, 0},
-  {0, 0, 0, 0, 0, 0}
+  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},
+  {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0},
+  {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0},
+  {&__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_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},
+  {&__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_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0},
+  {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},
+  {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0},
+  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},
+  {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0},
+  {&__pyx_n_s__LossFunction, __pyx_k__LossFunction, sizeof(__pyx_k__LossFunction), 0, 0, 1, 1},
+  {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1},
+  {&__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_indices, __pyx_k__X_indices, sizeof(__pyx_k__X_indices), 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__Y, __pyx_k__Y, sizeof(__pyx_k__Y), 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__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1},
+  {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1},
+  {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1},
+  {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},
+  {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1},
+  {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1},
+  {&__pyx_n_s__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__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 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__format, __pyx_k__format, sizeof(__pyx_k__format), 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__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1},
+  {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 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__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1},
+  {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1},
+  {&__pyx_n_s__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__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 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__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__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1},
+  {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 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__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1},
+  {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1},
+  {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},
+  {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},
+  {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 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__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) {
-  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_kp_NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_kp_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_kp_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_kp_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
 }
 
 static int __Pyx_InitGlobals(void) {
-  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -8928,31 +9538,34 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void); /*proto*/
 PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
 #endif
 {
-  PyObject *__pyx_1 = 0;
-  PyObject *__pyx_2 = 0;
   PyObject *__pyx_t_1 = NULL;
-  #ifdef CYTHON_REFNANNY
-  void* __pyx_refchk = NULL;
-  __Pyx_Refnanny = __Pyx_ImportRefcountAPI("refnanny");
-  if (!__Pyx_Refnanny) {
+  PyObject *__pyx_t_2 = NULL;
+  PyObject *__pyx_t_3 = NULL;
+  #if CYTHON_REFNANNY
+  void* __pyx_refnanny = NULL;
+  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
+  if (!__Pyx_RefNanny) {
       PyErr_Clear();
-      __Pyx_Refnanny = __Pyx_ImportRefcountAPI("Cython.Runtime.refnanny");
-      if (!__Pyx_Refnanny)
-          Py_FatalError("failed to import refnanny module");
+      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
+      if (!__Pyx_RefNanny)
+          Py_FatalError("failed to import 'refnanny' module");
   }
-  __pyx_refchk = __Pyx_Refnanny->NewContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__);
+  __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__);
   #endif
+  __pyx_init_filenames();
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #if PY_MAJOR_VERSION < 3
+  __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #else
+  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   /*--- Library function declarations ---*/
-  __pyx_init_filenames();
   /*--- Threads initialization code ---*/
   #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
   #ifdef WITH_THREAD /* Python build with threading support? */
   PyEval_InitThreads();
   #endif
   #endif
-  /*--- Initialize various global constants etc. ---*/
-  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
   __pyx_m = Py_InitModule4(__Pyx_NAMESTR("sgd_fast_sparse"), __pyx_methods, 0, 0, PYTHON_API_VERSION);
@@ -8966,12 +9579,13 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));
   if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  /*--- Initialize various global constants etc. ---*/
+  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_module_is_main_sgd_fast_sparse) {
-    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_kp___main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   }
   /*--- Builtin init code ---*/
   if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_skip_dispatch = 0;
   /*--- Global init code ---*/
   /*--- Function export code ---*/
   /*--- Type init code ---*/
@@ -9086,36 +9700,39 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber;
   /*--- Type import code ---*/
-  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr)); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject)); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
  * # License: BSD Style.
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
  * import sys
  * from time import time
  */
-  __pyx_1 = __Pyx_Import(__pyx_kp_numpy, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_kp_np, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
  * 
  * import numpy as np
  * import sys             # <<<<<<<<<<<<<<
  * from time import time
  * 
  */
-  __pyx_1 = __Pyx_Import(__pyx_kp_sys, 0); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_kp_sys, __pyx_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); 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__sys, __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;
 
-  /* "/home/peter/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":13
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":13
  * import numpy as np
  * import sys
  * from time import time             # <<<<<<<<<<<<<<
@@ -9124,19 +9741,56 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
  */
   __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  __Pyx_INCREF(__pyx_kp_time);
-  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_kp_time);
-  __Pyx_GIVEREF(__pyx_kp_time);
-  __pyx_1 = __Pyx_Import(__pyx_kp_time, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __pyx_2 = PyObject_GetAttr(__pyx_1, __pyx_kp_time); if (unlikely(!__pyx_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_2);
-  if (PyObject_SetAttr(__pyx_m, __pyx_kp_time, __pyx_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_2); __pyx_2 = 0;
-  __Pyx_DECREF(__pyx_1); __pyx_1 = 0;
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
+ * # encoding: utf-8             # <<<<<<<<<<<<<<
+ * # cython: cdivision=True
+ * # cython: boundscheck=False
+ */
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.11.2-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
+  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
  * 
  * cdef extern from "stdlib.h" nogil:             # <<<<<<<<<<<<<<
  *     void free(void *ptr)
@@ -9144,13 +9798,17 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
  */
   goto __pyx_L0;
   __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_1);
-  __Pyx_XDECREF(__pyx_2);
   __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse");
-  Py_DECREF(__pyx_m); __pyx_m = 0;
+  __Pyx_XDECREF(__pyx_t_2);
+  __Pyx_XDECREF(__pyx_t_3);
+  if (__pyx_m) {
+    __Pyx_AddTraceback("init sgd_fast_sparse");
+    Py_DECREF(__pyx_m); __pyx_m = 0;
+  } else if (!PyErr_Occurred()) {
+    PyErr_SetString(PyExc_ImportError, "init sgd_fast_sparse");
+  }
   __pyx_L0:;
-  __Pyx_FinishRefcountContext();
+  __Pyx_RefNannyFinishContext();
   #if PY_MAJOR_VERSION < 3
   return;
   #else
@@ -9291,7 +9949,7 @@ static int __Pyx_ParseOptionalKeywords(
     return -1;
 }
 
-static INLINE int __Pyx_IsLittleEndian(void) {
+static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
   unsigned int n = 1;
   return *(unsigned char*)(&n) != 0;
 }
@@ -9688,7 +10346,7 @@ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const cha
   }
 }
 
-static INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
+static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
   buf->buf = NULL;
   buf->obj = NULL;
   buf->strides = __Pyx_zeros;
@@ -9729,21 +10387,21 @@ fail:;
   return -1;
 }
 
-static INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
+static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {
   if (info->buf == NULL) return;
   if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL;
   __Pyx_ReleaseBuffer(info);
 }
 
-static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
-    if (!type) {
+static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
+    if (unlikely(!type)) {
         PyErr_Format(PyExc_SystemError, "Missing type object");
         return 0;
     }
-    if (obj == Py_None || PyObject_TypeCheck(obj, type))
+    if (likely(PyObject_TypeCheck(obj, type)))
         return 1;
-    PyErr_Format(PyExc_TypeError, "Cannot convert %s to %s",
-        Py_TYPE(obj)->tp_name, type->tp_name);
+    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
+                 Py_TYPE(obj)->tp_name, type->tp_name);
     return 0;
 }
 
@@ -9754,27 +10412,10 @@ static void __Pyx_RaiseBufferFallbackError(void) {
 
 
 
-static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
     PyObject *tmp_type, *tmp_value, *tmp_tb;
     PyThreadState *tstate = PyThreadState_GET();
 
-#if PY_MAJOR_VERSION >= 3
-    /* Note: this is a temporary work-around to prevent crashes in Python 3.0 */
-    if ((tstate->exc_type != NULL) & (tstate->exc_type != Py_None)) {
-        tmp_type = tstate->exc_type;
-        tmp_value = tstate->exc_value;
-        tmp_tb = tstate->exc_traceback;
-        PyErr_NormalizeException(&type, &value, &tb);
-        PyErr_NormalizeException(&tmp_type, &tmp_value, &tmp_tb);
-        tstate->exc_type = 0;
-        tstate->exc_value = 0;
-        tstate->exc_traceback = 0;
-        PyException_SetContext(value, tmp_value);
-        Py_DECREF(tmp_type);
-        Py_XDECREF(tmp_tb);
-    }
-#endif
-
     tmp_type = tstate->curexc_type;
     tmp_value = tstate->curexc_value;
     tmp_tb = tstate->curexc_traceback;
@@ -9786,7 +10427,7 @@ static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *t
     Py_XDECREF(tmp_tb);
 }
 
-static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
     PyThreadState *tstate = PyThreadState_GET();
     *type = tstate->curexc_type;
     *value = tstate->curexc_value;
@@ -9798,6 +10439,57 @@ static INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **
 }
 
 
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
+    PyErr_Format(PyExc_ValueError,
+        #if PY_VERSION_HEX < 0x02050000
+                 "need more than %d value%s to unpack", (int)index,
+        #else
+                 "need more than %zd value%s to unpack", index,
+        #endif
+                 (index == 1) ? "" : "s");
+}
+
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void) {
+    PyErr_SetString(PyExc_ValueError, "too many values to unpack");
+}
+
+static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
+    PyObject *item;
+    if (!(item = PyIter_Next(iter))) {
+        if (!PyErr_Occurred()) {
+            __Pyx_RaiseNeedMoreValuesError(index);
+        }
+    }
+    return item;
+}
+
+static int __Pyx_EndUnpack(PyObject *iter) {
+    PyObject *item;
+    if ((item = PyIter_Next(iter))) {
+        Py_DECREF(item);
+        __Pyx_RaiseTooManyValuesError();
+        return -1;
+    }
+    else if (!PyErr_Occurred())
+        return 0;
+    else
+        return -1;
+}
+
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
+static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
+    if (t == Py_None) {
+      __Pyx_RaiseNoneNotIterableError();
+    } else if (PyTuple_GET_SIZE(t) < index) {
+      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
+    } else {
+      __Pyx_RaiseTooManyValuesError();
+    }
+}
+
 static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact)
 {
@@ -9883,6 +10575,7 @@ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
     return result;
 }
 
+#if PY_MAJOR_VERSION < 3
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
     Py_XINCREF(type);
     Py_XINCREF(value);
@@ -9938,6 +10631,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
             }
         #endif
     }
+
     __Pyx_ErrRestore(type, value, tb);
     return;
 raise_error:
@@ -9947,6 +10641,50 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
     return;
 }
 
+#else /* Python 3+ */
+
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
+    if (tb == Py_None) {
+        tb = 0;
+    } else if (tb && !PyTraceBack_Check(tb)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: arg 3 must be a traceback or None");
+        goto bad;
+    }
+    if (value == Py_None)
+        value = 0;
+
+    if (PyExceptionInstance_Check(type)) {
+        if (value) {
+            PyErr_SetString(PyExc_TypeError,
+                "instance exception may not have a separate value");
+            goto bad;
+        }
+        value = type;
+        type = (PyObject*) Py_TYPE(value);
+    } else if (!PyExceptionClass_Check(type)) {
+        PyErr_SetString(PyExc_TypeError,
+            "raise: exception class must be a subclass of BaseException");
+        goto bad;
+    }
+
+    PyErr_SetObject(type, value);
+
+    if (tb) {
+        PyThreadState *tstate = PyThreadState_GET();
+        PyObject* tmp_tb = tstate->curexc_traceback;
+        if (tb != tmp_tb) {
+            Py_INCREF(tb);
+            tstate->curexc_traceback = tb;
+            Py_XDECREF(tmp_tb);
+        }
+    }
+
+bad:
+    return;
+}
+#endif
+
 #if PY_MAJOR_VERSION < 3
 static PyObject *__Pyx_GetStdout(void) {
     PyObject *f = PySys_GetObject((char *)"stdout");
@@ -10060,24 +10798,168 @@ static int __Pyx_PrintOne(PyObject *o) {
 
 #endif
 
-static INLINE int __Pyx_StrEq(const char *s1, const char *s2) {
-     while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
-     return *s1 == *s2;
-}
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      return ::std::complex< float >(x, y);
+    }
+  #else
+    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      return x + y*(__pyx_t_float_complex)_Complex_I;
+    }
+  #endif
+#else
+    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {
+      __pyx_t_float_complex z;
+      z.real = x;
+      z.imag = y;
+      return z;
+    }
+#endif
+
+#if CYTHON_CCOMPLEX
+#else
+    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+       return (a.real == b.real) && (a.imag == b.imag);
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {
+        __pyx_t_float_complex z;
+        float denom = b.real * b.real + b.imag * b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {
+        __pyx_t_float_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {
+       return (a.real == 0) && (a.imag == 0);
+    }
+    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {
+        __pyx_t_float_complex z;
+        z.real =  a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+/*
+    static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {
+#if HAVE_HYPOT
+        return hypotf(z.real, z.imag);
+#else
+        return sqrtf(z.real*z.real + z.imag*z.imag);
+#endif
+    }
+*/
+#endif
+
+#if CYTHON_CCOMPLEX
+  #ifdef __cplusplus
+    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      return ::std::complex< double >(x, y);
+    }
+  #else
+    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      return x + y*(__pyx_t_double_complex)_Complex_I;
+    }
+  #endif
+#else
+    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {
+      __pyx_t_double_complex z;
+      z.real = x;
+      z.imag = y;
+      return z;
+    }
+#endif
+
+#if CYTHON_CCOMPLEX
+#else
+    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+       return (a.real == b.real) && (a.imag == b.imag);
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real + b.real;
+        z.imag = a.imag + b.imag;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real - b.real;
+        z.imag = a.imag - b.imag;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        z.real = a.real * b.real - a.imag * b.imag;
+        z.imag = a.real * b.imag + a.imag * b.real;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {
+        __pyx_t_double_complex z;
+        double denom = b.real * b.real + b.imag * b.imag;
+        z.real = (a.real * b.real + a.imag * b.imag) / denom;
+        z.imag = (a.imag * b.real - a.real * b.imag) / denom;
+        return z;
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {
+        __pyx_t_double_complex z;
+        z.real = -a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {
+       return (a.real == 0) && (a.imag == 0);
+    }
+    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {
+        __pyx_t_double_complex z;
+        z.real =  a.real;
+        z.imag = -a.imag;
+        return z;
+    }
+/*
+    static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {
+#if HAVE_HYPOT
+        return hypot(z.real, z.imag);
+#else
+        return sqrt(z.real*z.real + z.imag*z.imag);
+#endif
+    }
+*/
+#endif
 
-static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
+static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
+    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(unsigned char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned char)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (unsigned char)-1;
-            if (unlikely(val < 0)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
                 PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned char");
-                return (unsigned char)-1;
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned char" :
+                    "value too large to convert to unsigned char");
             }
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to unsigned char");
             return (unsigned char)-1;
         }
         return (unsigned char)val;
@@ -10085,19 +10967,18 @@ static INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
     return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
+static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
+    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(unsigned short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned short)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (unsigned short)-1;
-            if (unlikely(val < 0)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
                 PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned short");
-                return (unsigned short)-1;
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned short" :
+                    "value too large to convert to unsigned short");
             }
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to unsigned short");
             return (unsigned short)-1;
         }
         return (unsigned short)val;
@@ -10105,19 +10986,18 @@ static INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
     return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
+static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
+    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(unsigned int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(unsigned int)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (unsigned int)-1;
-            if (unlikely(val < 0)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
                 PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned int");
-                return (unsigned int)-1;
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to unsigned int" :
+                    "value too large to convert to unsigned int");
             }
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to unsigned int");
             return (unsigned int)-1;
         }
         return (unsigned int)val;
@@ -10125,14 +11005,18 @@ static INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
     return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
 }
 
-static INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
+static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
+    const char neg_one = (char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(char)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (char)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to char");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to char" :
+                    "value too large to convert to char");
+            }
             return (char)-1;
         }
         return (char)val;
@@ -10140,14 +11024,18 @@ static INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
     return (char)__Pyx_PyInt_AsLong(x);
 }
 
-static INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
+static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
+    const short neg_one = (short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(short)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (short)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to short");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to short" :
+                    "value too large to convert to short");
+            }
             return (short)-1;
         }
         return (short)val;
@@ -10155,14 +11043,18 @@ static INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
     return (short)__Pyx_PyInt_AsLong(x);
 }
 
-static INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
+static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
+    const int neg_one = (int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(int)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (int)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to int");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to int" :
+                    "value too large to convert to int");
+            }
             return (int)-1;
         }
         return (int)val;
@@ -10170,14 +11062,18 @@ static INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
     return (int)__Pyx_PyInt_AsLong(x);
 }
 
-static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
+static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
+    const signed char neg_one = (signed char)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(signed char) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed char)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (signed char)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to signed char");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed char" :
+                    "value too large to convert to signed char");
+            }
             return (signed char)-1;
         }
         return (signed char)val;
@@ -10185,14 +11081,18 @@ static INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
     return (signed char)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
+static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
+    const signed short neg_one = (signed short)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(signed short) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed short)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (signed short)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to signed short");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed short" :
+                    "value too large to convert to signed short");
+            }
             return (signed short)-1;
         }
         return (signed short)val;
@@ -10200,14 +11100,18 @@ static INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
     return (signed short)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
+static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
+    const signed int neg_one = (signed int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
     if (sizeof(signed int) < sizeof(long)) {
         long val = __Pyx_PyInt_AsLong(x);
         if (unlikely(val != (long)(signed int)val)) {
-            if (unlikely(val == -1 && PyErr_Occurred()))
-                return (signed int)-1;
-            PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to signed int");
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to signed int" :
+                    "value too large to convert to signed int");
+            }
             return (signed int)-1;
         }
         return (signed int)val;
@@ -10215,11 +11119,13 @@ static INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
     return (signed int)__Pyx_PyInt_AsSignedLong(x);
 }
 
-static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
+static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
+    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (unlikely(val < 0)) {
+        if (is_unsigned && unlikely(val < 0)) {
             PyErr_SetString(PyExc_OverflowError,
                             "can't convert negative value to unsigned long");
             return (unsigned long)-1;
@@ -10227,13 +11133,17 @@ static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
         return (unsigned long)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        if (unlikely(Py_SIZE(x) < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned long");
-            return (unsigned long)-1;
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to unsigned long");
+                return (unsigned long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
         }
-        return PyLong_AsUnsignedLong(x);
     } else {
         unsigned long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10244,11 +11154,13 @@ static INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
     }
 }
 
-static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
+static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
+    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
-        if (unlikely(val < 0)) {
+        if (is_unsigned && unlikely(val < 0)) {
             PyErr_SetString(PyExc_OverflowError,
                             "can't convert negative value to unsigned PY_LONG_LONG");
             return (unsigned PY_LONG_LONG)-1;
@@ -10256,13 +11168,17 @@ static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x)
         return (unsigned PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        if (unlikely(Py_SIZE(x) < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned PY_LONG_LONG");
-            return (unsigned PY_LONG_LONG)-1;
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to unsigned PY_LONG_LONG");
+                return (unsigned PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
         }
-        return PyLong_AsUnsignedLongLong(x);
     } else {
         unsigned PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10273,15 +11189,31 @@ static INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x)
     }
 }
 
-static INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
+static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
+    const long neg_one = (long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to long");
+            return (long)-1;
+        }
         return (long)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        return PyLong_AsLong(x);
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to long");
+                return (long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
+        }
     } else {
         long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10292,15 +11224,31 @@ static INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
     }
 }
 
-static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
+static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
+    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to PY_LONG_LONG");
+            return (PY_LONG_LONG)-1;
+        }
         return (PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        return PyLong_AsLongLong(x);
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to PY_LONG_LONG");
+                return (PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
+        }
     } else {
         PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10311,15 +11259,31 @@ static INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
     }
 }
 
-static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
+static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
+    const signed long neg_one = (signed long)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to signed long");
+            return (signed long)-1;
+        }
         return (signed long)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        return PyLong_AsLong(x);
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to signed long");
+                return (signed long)-1;
+            }
+            return PyLong_AsUnsignedLong(x);
+        } else {
+            return PyLong_AsLong(x);
+        }
     } else {
         signed long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10330,15 +11294,31 @@ static INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
     }
 }
 
-static INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
+static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
+    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
 #if PY_VERSION_HEX < 0x03000000
-    if (likely(PyInt_CheckExact(x) || PyInt_Check(x))) {
+    if (likely(PyInt_Check(x))) {
         long val = PyInt_AS_LONG(x);
+        if (is_unsigned && unlikely(val < 0)) {
+            PyErr_SetString(PyExc_OverflowError,
+                            "can't convert negative value to signed PY_LONG_LONG");
+            return (signed PY_LONG_LONG)-1;
+        }
         return (signed PY_LONG_LONG)val;
     } else
 #endif
-    if (likely(PyLong_CheckExact(x) || PyLong_Check(x))) {
-        return PyLong_AsLongLong(x);
+    if (likely(PyLong_Check(x))) {
+        if (is_unsigned) {
+            if (unlikely(Py_SIZE(x) < 0)) {
+                PyErr_SetString(PyExc_OverflowError,
+                                "can't convert negative value to signed PY_LONG_LONG");
+                return (signed PY_LONG_LONG)-1;
+            }
+            return PyLong_AsUnsignedLongLong(x);
+        } else {
+            return PyLong_AsLongLong(x);
+        }
     } else {
         signed PY_LONG_LONG val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
@@ -10368,32 +11348,31 @@ static void __Pyx_WriteUnraisable(const char *name) {
 }
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
-    PyObject *pycobj = 0;
-    int result;
-    
-    pycobj = PyCObject_FromVoidPtr(vtable, 0);
-    if (!pycobj)
+#if PY_VERSION_HEX < 0x03010000
+    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
+#else
+    PyObject *ob = PyCapsule_New(vtable, 0, 0);
+#endif
+    if (!ob)
         goto bad;
-    if (PyDict_SetItemString(dict, "__pyx_vtable__", pycobj) < 0)
+    if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0)
         goto bad;
-    result = 0;
-    goto done;
-
+    Py_DECREF(ob);
+    return 0;
 bad:
-    result = -1;
-done:
-    Py_XDECREF(pycobj);
-    return result;
+    Py_XDECREF(ob);
+    return -1;
 }
 
 #ifndef __PYX_HAVE_RT_ImportType
 #define __PYX_HAVE_RT_ImportType
 static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,
-    long size)
+    long size, int strict)
 {
     PyObject *py_module = 0;
     PyObject *result = 0;
     PyObject *py_name = 0;
+    char warning[200];
 
     py_module = __Pyx_ImportModule(module_name);
     if (!py_module)
@@ -10418,9 +11397,15 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class
             module_name, class_name);
         goto bad;
     }
-    if (((PyTypeObject *)result)->tp_basicsize != size) {
+    if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) {
+        PyOS_snprintf(warning, sizeof(warning), 
+            "%s.%s size changed, may indicate binary incompatibility",
+            module_name, class_name);
+        PyErr_WarnEx(NULL, warning, 0);
+    }
+    else if (((PyTypeObject *)result)->tp_basicsize != size) {
         PyErr_Format(PyExc_ValueError, 
-            "%s.%s does not appear to be the correct type object",
+            "%s.%s has the wrong size, try recompiling",
             module_name, class_name);
         goto bad;
     }
@@ -10462,7 +11447,6 @@ static void __Pyx_AddTraceback(const char *funcname) {
     PyObject *py_srcfile = 0;
     PyObject *py_funcname = 0;
     PyObject *py_globals = 0;
-    PyObject *empty_string = 0;
     PyCodeObject *py_code = 0;
     PyFrameObject *py_frame = 0;
 
@@ -10489,12 +11473,6 @@ static void __Pyx_AddTraceback(const char *funcname) {
     if (!py_funcname) goto bad;
     py_globals = PyModule_GetDict(__pyx_m);
     if (!py_globals) goto bad;
-    #if PY_MAJOR_VERSION < 3
-    empty_string = PyString_FromStringAndSize("", 0);
-    #else
-    empty_string = PyBytes_FromStringAndSize("", 0);
-    #endif
-    if (!empty_string) goto bad;
     py_code = PyCode_New(
         0,            /*int argcount,*/
         #if PY_MAJOR_VERSION >= 3
@@ -10503,7 +11481,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
         0,            /*int nlocals,*/
         0,            /*int stacksize,*/
         0,            /*int flags,*/
-        empty_string, /*PyObject *code,*/
+        __pyx_empty_bytes, /*PyObject *code,*/
         __pyx_empty_tuple,  /*PyObject *consts,*/
         __pyx_empty_tuple,  /*PyObject *names,*/
         __pyx_empty_tuple,  /*PyObject *varnames,*/
@@ -10512,7 +11490,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
         py_srcfile,   /*PyObject *filename,*/
         py_funcname,  /*PyObject *name,*/
         __pyx_lineno,   /*int firstlineno,*/
-        empty_string  /*PyObject *lnotab*/
+        __pyx_empty_bytes  /*PyObject *lnotab*/
     );
     if (!py_code) goto bad;
     py_frame = PyFrame_New(
@@ -10527,7 +11505,6 @@ static void __Pyx_AddTraceback(const char *funcname) {
 bad:
     Py_XDECREF(py_srcfile);
     Py_XDECREF(py_funcname);
-    Py_XDECREF(empty_string);
     Py_XDECREF(py_code);
     Py_XDECREF(py_frame);
 }
@@ -10535,7 +11512,7 @@ static void __Pyx_AddTraceback(const char *funcname) {
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     while (t->p) {
         #if PY_MAJOR_VERSION < 3
-        if (t->is_unicode && (!t->is_identifier)) {
+        if (t->is_unicode) {
             *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
         } else if (t->intern) {
             *t->p = PyString_InternFromString(t->s);
@@ -10543,10 +11520,14 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
             *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
         }
         #else  /* Python 3+ has unicode identifiers */
-        if (t->is_identifier || (t->is_unicode && t->intern)) {
-            *t->p = PyUnicode_InternFromString(t->s);
-        } else if (t->is_unicode) {
-            *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
+        if (t->is_unicode | t->is_str) {
+            if (t->intern) {
+                *t->p = PyUnicode_InternFromString(t->s);
+            } else if (t->encoding) {
+                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
+            } else {
+                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
+            }
         } else {
             *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
         }
@@ -10560,13 +11541,13 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
 
 /* Type Conversion Functions */
 
-static INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
+static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
    if (x == Py_True) return 1;
    else if ((x == Py_False) | (x == Py_None)) return 0;
    else return PyObject_IsTrue(x);
 }
 
-static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
+static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
   PyNumberMethods *m;
   const char *name = NULL;
   PyObject *res = NULL;
@@ -10612,7 +11593,7 @@ static INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
   return res;
 }
 
-static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
+static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_ssize_t ival;
   PyObject* x = PyNumber_Index(b);
   if (!x) return -1;
@@ -10621,7 +11602,7 @@ static INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   return ival;
 }
 
-static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
+static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
 #if PY_VERSION_HEX < 0x02050000
    if (ival <= LONG_MAX)
        return PyInt_FromLong((long)ival);
@@ -10635,7 +11616,7 @@ static INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
 #endif
 }
 
-static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
+static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
    unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
    if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {
        return (size_t)-1;
@@ -10648,3 +11629,4 @@ static INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
 }
 
 
+#endif /* Py_PYTHON_H */
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index ef68654b7d194..56c4e65e193ca 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -256,20 +256,25 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
                 if fit_intercept == 1:
                     intercept += update * 0.01
             if penalty_type != L1:
-                wscale *= (1 - rho * eta * alpha)
+                wscale *= (1 - (rho * eta * alpha))
                 if wscale < 1e-9:
                     w *= wscale
                     wscale = 1.0
             if penalty_type == L1 or penalty_type == ELASTICNET:
                 u += ((1 - rho) * eta * alpha)
-                l1penalty(w_data_ptr, wscale, q_data_ptr, X_indices_ptr, offset, xnnz, u)
+                l1penalty(w_data_ptr, wscale, q_data_ptr,
+                          X_indices_ptr, offset, xnnz, u)
             t += 1
             count += 1
+        if penalty_type == L1 or penalty_type == ELASTICNET:
+            u += ((1 - rho) * eta * alpha)
+            finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
+	    
         # 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, w.nonzero()[0].shape[0],
-										intercept, count, sumloss / count))
+                                                                                intercept, count, sumloss / count))
             print("Total training time: %.2f seconds." % (time()-t_start))
 
         # floating-point under-/overflow check.
@@ -322,8 +327,26 @@ cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
         idx = X_indices_ptr[offset + j]
         z = w_data_ptr[idx]
         if (wscale * w_data_ptr[idx]) > 0:
-            w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale) )
+            w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+                                                        / wscale) )
         elif (wscale * w_data_ptr[idx]) < 0:
-            w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale) )
+            w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+                                                        / wscale) )
         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
 
+cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,
+                         double *q_data_ptr, double u):
+    """Applys the L1 penalty. This implements the truncated gradient approach by [
+    """
+    cdef double z = 0.0
+    cdef int j = 0
+    for j from 0 <= j < n_features:
+        z = w_data_ptr[j]
+        if (wscale * w_data_ptr[j]) > 0:
+            w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
+                                                    / wscale) )
+        elif (wscale * w_data_ptr[j]) < 0:
+            w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+                                                    / wscale) )
+        q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))
+    
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index 197ea9c2b0fea..094d62f7c8cbf 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -1,8 +1,8 @@
 import numpy as np
 from scipy import sparse
-from scikits.learn import datasets, sgd
+from scikits.learn import datasets, sgd, svm
 from numpy.testing import assert_array_almost_equal, \
-     assert_array_equal, assert_equal
+     assert_array_equal, assert_equal, assert_almost_equal
 
 from nose.tools import assert_raises
 
@@ -21,32 +21,104 @@
 T2 = np.array([[-1, -1, -1], [1, 1, 1], [2, 2, 2]])
 true_result2 = [1, 2, 3]
 
+# test sample 3
+X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0], [0,0,1,0,0,0], [0,0,1,0,0,0],
+	       [0,0,0,0,1,1], [0,0,0,0,1,1], [0,0,0,1,0,0], [0,0,0,1,0,0]])
+Y3 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
+
+X4 = np.array([[1,0.9,0.8,0,0,0], [1,.84,.98,0,0,0],
+	       [1,.96,.88,0,0,0], [1,.91,.99,0,0,0],
+	       [0,0,0,.89,.91,1], [0,0,0,.79,.84,1],
+	       [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
+Y4 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
+
+X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0], [1,1,1,0,0,0], [1,1,1,0,0,0],
+	       [0,0,0,1,1,1], [0,0,0,1,1,1], [0,0,0,1,1,1], [0,0,0,1,1,1]])
+Y5 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
+
 
 def test_sgd():
     """Check that sparse SGD gives any results :-)"""
     
-    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.001, fit_intercept = True)
+    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.01,
+			 fit_intercept = True,
+			 n_iter = 10, shuffle = True)
     clf.fit(X, Y)
-    assert_array_equal(clf.coef_, np.zeros((len(clf.coef_),)))
-
-def test_rcv1():
-    ds = bolt.io.MemoryDataset.load("/home/peter/corpora/rcv1-ccat/test.npy")
-    m, n = ds.n, ds.dim
-    X = sparse.lil_matrix((m, n), dtype = np.float32)
-    print "Build sparse matrix... ", 
-    for i, x in enumerate(ds.iterinstances()):
-	X[i, x['f0']] = x['f1']
-    print "[done]"
-
-    X = X.tocsr()
-    Y = ds.labels
-    print "Fitting model... "
-    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.0001, fit_intercept = True)
-    clf.fit(X, Y)
-    score = clf.score(X,Y)
-    print "training score: ", score
-    print "training error: ", ((1.0 - score) * 100.0)
+    print clf.coef_
+    #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
+    assert_array_equal(clf.predict(T), true_result)
+    
+def test_sgd_penalties():
+    """Check whether penalties and hyperparameters are set properly"""
+    clf = sgd.sparse.SGD(penalty='l2')
+    assert clf.rho == 1.0
+    clf = sgd.sparse.SGD(penalty='l1')
+    assert clf.rho == 0.0
+    clf = sgd.sparse.SGD(penalty='elasticnet', rho = 0.85)
+    assert clf.rho == 0.85
+
+def test_sgd_params():
+    """Test parameter validity check.
+    """
+    try:
+	clf = sgd.sparse.SGD(n_iter = 0)
+	clf = sgd.sparse.SGD(n_iter = -10000)
+    except ValueError:
+	pass
+    else:
+	assert False
 
-if __name__ == "__main__":
-    test_rcv1()
+    try:
+	clf = sgd.sparse.SGD(shuffle = "false")
+    except ValueError:
+	pass
+    else:
+	assert False
+
+def test_sgd_multiclass():
+    """SGD is not able to handle multi class problems. 
+    """
+    clf = sgd.sparse.SGD()
+    try:
+	clf.fit(X2, Y2)
+    except ValueError:
+	pass
+    else:
+	assert False
+
+def test_sgd_l1():
+    n = len(X4)
+    np.random.seed(13)
+    idx = np.arange(n)
+    np.random.shuffle(idx)
+    X = X4[idx, :]
+    Y = Y4[idx, :]
+    clf = sgd.sparse.SGD(penalty='l1', alpha = .2,
+			 fit_intercept = False,
+			 n_iter = 1000)
+    clf.fit(X, Y)
+    print clf.coef_
+    assert_array_equal(clf.coef_[1:-1], np.zeros((4,)))
     
+
+## def test_rcv1():
+##     ds = bolt.io.MemoryDataset.load("/home/pprett/corpora/rcv1-ccat/test.npy")
+##     m, n = ds.n, ds.dim
+##     X = sparse.lil_matrix((m, n), dtype = np.float32)
+##     print "Build sparse matrix... ", 
+##     for i, x in enumerate(ds.iterinstances()):
+##         X[i, x['f0']] = x['f1']
+##     print "[done]"
+
+##     X = X.tocsr()
+##     Y = ds.labels
+##     print "Fitting model... "
+##     clf = sgd.sparse.SGD(penalty='l1', alpha = 0.0001, fit_intercept = True)
+##     clf.fit(X, Y)
+##     score = clf.score(X,Y)
+##     print "training score: ", score
+##     print "training error: ", ((1.0 - score) * 100.0)
+##     print "nnz: ", clf.coef_.nonzero()[0].shape[0]
+
+## if __name__ == "__main__":
+##     test_rcv1()

From dd82f496572a8c5ad425c4dc3ab428d609433419 Mon Sep 17 00:00:00 2001
From: pprett 
Date: Sun, 24 Oct 2010 11:28:13 +0200
Subject: [PATCH 05/17] does not belong to the repo.

---
 .../learn/sgd/sparse/src/sgd_fast_sparse.html | 3623 -----------------
 1 file changed, 3623 deletions(-)
 delete mode 100644 scikits/learn/sgd/sparse/src/sgd_fast_sparse.html

diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html
deleted file mode 100644
index d0582316a1450..0000000000000
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html
+++ /dev/null
@@ -1,3623 +0,0 @@
-
-
-
-
-
-
-
-        
-

Generated by Cython 0.12.1 on Mon Oct 18 22:25:08 2010 -

Raw output: sgd_fast_sparse.c -

 1: # Author: Peter Prettenhofer <peter.prettenhofer@gmail.com>
-
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-
 2: #
-
 3: # License: BSD Style.
-
 4: from __future__ import division
-
 5: 
-
 6: import numpy as np
-
-    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
 7: import sys
-
-    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
 8: from time import time
-
-    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
 9: 
-
 10: cimport numpy as np
-
 11: cimport cython
-
 12: 
-
 13: cdef extern from "math.h":
-
 14:     cdef extern double exp(double x)
-
 15:     cdef extern double log(double x)
-
 16:     cdef extern double sqrt(double x)
-
 17: 
-
 18: ctypedef np.float64_t DOUBLE
-
 19: ctypedef np.int32_t INTEGER
-
 20: 
-
 21: DEF L1 = 1
-
 22: DEF L2 = 2
-
 23: DEF ELASTICNET = 3
-
 24: 
-
 25: 
-
 26: # ----------------------------------------
-
 27: # Extension Types for Loss Functions
-
 28: # ----------------------------------------
-
 29: 
-
 30: cdef class LossFunction:
-
-struct __pyx_obj_15sgd_fast_sparse_LossFunction {
-  PyObject_HEAD
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
-  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
-
-
 31:     """Base class for convex loss functions"""
-
 32:     cpdef double loss(self, double p, double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __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 = 32; __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 = 32; __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 = 32; __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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 33:         """Evaluate the loss function.
-
 34: 
-
 35:         :arg p: The prediction.
-
 36:         :type p: double
-
 37:         :arg y: The true value.
-
 38:         :type y: double
-
 39:         :returns: double"""
-
 40:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 41:     cpdef double dloss(self, double p, double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __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 = 41; __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 = 41; __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 = 41; __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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 42:         """Evaluate the derivative of the loss function.
-
 43: 
-
 44:         :arg p: The prediction.
-
 45:         :type p: double
-
 46:         :arg y: The true value.
-
 47:         :type y: double
-
 48:         :returns: double"""
-
 49:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 50: 
-
 51: cdef class Regression(LossFunction):
-
-struct __pyx_obj_15sgd_fast_sparse_Regression {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
-
-
 52:     """Base class for loss functions for regression."""
-
 53:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __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 = 53; __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 = 53; __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 = 53; __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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 54:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 55:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __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 = 55; __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 = 55; __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 = 55; __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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 56:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 57: 
-
 58: 
-
 59: cdef class Classification(LossFunction):
-
-struct __pyx_obj_15sgd_fast_sparse_Classification {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
-
-
 60:     """Base class for loss functions for classification."""
-
 61:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __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 = 61; __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 = 61; __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 = 61; __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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 62:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 63:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __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 = 63; __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 = 63; __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 = 63; __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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 64:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 65: 
-
 66: cdef class ModifiedHuber(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
-
-
 67:     """Modified Huber loss function for binary
-
 68:     classification tasks with y in {-1,1}.
-
 69:     Its equivalent to quadratically smoothed SVM
-
 70:     with gamma = 2.
-
 71: 
-
 72:     See T. Zhang 'Solving
-
 73:     Large Scale Linear Prediction Problems Using
-
 74:     Stochastic Gradient Descent', ICML'04.
-
 75:     """
-
 76:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __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 = 76; __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 = 76; __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 = 76; __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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 77:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 78:         if z >= 1:
-
-    __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
-
 79:             return 0
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 80:         elif z >= -1:
-
-    __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
-
 81:             return (1-z) * (1-z)
-
-        __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z));
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 82:         else:
-
 83:             return -4*z
-
-        __pyx_r = (-4 * __pyx_v_z);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 84: 
-
 85:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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;}
-      }
-    }
-    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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 86:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 87:         if z >= 1:
-
-    __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
-
 88:             return 0
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 89:         elif z >= -1:
-
-    __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
-
 90:             return 2*(1-z)*y
-
-        __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 91:         else:
-
 92:             return 4*y
-
-        __pyx_r = (4 * __pyx_v_y);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 93: 
-
 94:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 95:         return ModifiedHuber,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 96: 
-
 97: cdef class Hinge(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_Hinge {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
-
-
 98:     """SVM classification loss for binary
-
 99:     classification tasks with y in {-1,1}.
-
 100:     """
-
 101:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __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 = 101; __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 = 101; __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 = 101; __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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 102:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 103:         if z < 1.0:
-
-    __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
-
 104:             return (1 - z)
-
-        __pyx_r = (1 - __pyx_v_z);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 105:         return 0
-
-    __pyx_r = 0;
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 106:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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, 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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 107:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 108:         if z < 1.0:
-
-    __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
-
 109:             return y
-
-        __pyx_r = __pyx_v_y;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 110:         return 0
-
-    __pyx_r = 0;
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 111: 
-
 112:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 113:         return Hinge,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 114: 
-
 115: 
-
 116: cdef class Log(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_Log {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-
 117:     """Logistic regression loss for binary classification
-
 118:     tasks with y in {-1,1}.
-
 119:     """
-
 120:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __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 = 120; __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 = 120; __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 = 120; __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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 121:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 122:         if z > 18:
-
-    __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
-
 123:             return exp(-z)
-
-        __pyx_r = exp((-__pyx_v_z));
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 124:         if z < -18:
-
-    __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
-
 125:             return -z * y
-
-        __pyx_r = ((-__pyx_v_z) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L4;
-  }
-  __pyx_L4:;
-
 126:         return log(1.0+exp(-z))
-
-    __pyx_r = log((1.0 + exp((-__pyx_v_z))));
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 127: 
-
 128:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __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 = 128; __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 = 128; __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 = 128; __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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 129:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 130:         if z > 18:
-
-    __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
-
 131:             return exp(-z) * y
-
-        __pyx_r = (exp((-__pyx_v_z)) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 132:         if z < -18:
-
-    __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
-
 133:             return y
-
-        __pyx_r = __pyx_v_y;
-    goto __pyx_L0;
-    goto __pyx_L4;
-  }
-  __pyx_L4:;
-
 134:         return y / (exp(z) + 1.0)
-
-    __pyx_t_5 = (exp(__pyx_v_z) + 1.0);
-  if (unlikely(__pyx_t_5 == 0)) {
-    PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_r = (__pyx_v_y / __pyx_t_5);
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 135: 
-
 136:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 137:         return Log,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 138: 
-
 139: cdef class SquaredError(Regression):
-
-struct __pyx_obj_15sgd_fast_sparse_SquaredError {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
-
-
 140:     """
-
 141:     """
-
 142:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __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 = 142; __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 = 142; __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 = 142; __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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); 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_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 143:         return 0.5 * (p-y) * (p-y)
-
-    __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 144:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __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 = 144; __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 = 144; __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 = 144; __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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 145:         return y - p
-
-    __pyx_r = (__pyx_v_y - __pyx_v_p);
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 146: 
-
 147:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 148:         return SquaredError,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 149: 
-
 150: cdef class Huber(Regression):
-
-struct __pyx_obj_15sgd_fast_sparse_Huber {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-  double c;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
-
-
 151:     """
-
 152:     """
-
 153:     cdef double c
-
 154:     def __init__(self,c):
-
-static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_c = 0;
-  int __pyx_r;
-  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};
-    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 = 154; __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:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
-  return -1;
-  __pyx_L4_argument_unpacking_done:;
-
 155:         self.c = c
-
-    __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 156:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __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 = 156; __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 = 156; __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 = 156; __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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 157:         cdef double r = p-y
-
-    __pyx_v_r = (__pyx_v_p - __pyx_v_y);
-
 158:         cdef double abs_r = abs(r)
-
-    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __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 = 158; __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 = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
-
 159:         if abs_r <= self.c:
-
-    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
-
 160:             return 0.5 * r * r
-
-        __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 161:         else:
-
 162:             return self.c * abs_r - (0.5*self.c*self.c)
-
-        __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 163: 
-
 164:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 165:         cdef double r = y - p
-
-    __pyx_v_r = (__pyx_v_y - __pyx_v_p);
-
 166:         cdef double abs_r = abs(r)
-
-    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __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 = 166; __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 = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
-
 167:         if abs_r <= self.c:
-
-    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
-
 168:             return r
-
-        __pyx_r = __pyx_v_r;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 169:         elif r > 0:
-
-    __pyx_t_6 = (__pyx_v_r > 0);
-  if (__pyx_t_6) {
-
 170:             return self.c
-
-        __pyx_r = __pyx_v_self->c;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 171:         else:
-
 172:             return -self.c
-
-        __pyx_r = (-__pyx_v_self->c);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 173: 
-
 174:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 175:         return Huber,(self.c,)
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 176: 
-
 177: @cython.boundscheck(False)
-
 178: @cython.wraparound(False)
-
 179: @cython.cdivision(True)
-
 180: def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n\n    \n    ";
-static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyArrayObject *__pyx_v_w = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_intercept;
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_loss = 0;
-  int __pyx_v_penalty_type;
-  double __pyx_v_alpha;
-  double __pyx_v_rho;
-  PyArrayObject *__pyx_v_X_data = 0;
-  PyArrayObject *__pyx_v_X_indices = 0;
-  PyArrayObject *__pyx_v_X_indptr = 0;
-  PyArrayObject *__pyx_v_y = 0;
-  int __pyx_v_n_iter;
-  int __pyx_v_fit_intercept;
-  int __pyx_v_verbose;
-  int __pyx_v_shuffle;
-  unsigned int __pyx_v_n_samples;
-  unsigned int __pyx_v_n_features;
-  PyArrayObject *__pyx_v_index = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_p;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_update;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sumloss;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wnorm;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_t;
-  unsigned int __pyx_v_count;
-  unsigned int __pyx_v_epoch;
-  unsigned int __pyx_v_i;
-  unsigned int __pyx_v_sample;
-  PyArrayObject *__pyx_v_q = 0;
-  double __pyx_v_u;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_typw;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta0;
-  PyObject *__pyx_v_t_start;
-  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_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_q;
-  Py_ssize_t __pyx_bstride_0_q = 0;
-  Py_ssize_t __pyx_bshape_0_q = 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_w;
-  Py_ssize_t __pyx_bstride_0_w = 0;
-  Py_ssize_t __pyx_bshape_0_w = 0;
-  Py_buffer __pyx_bstruct_y;
-  Py_ssize_t __pyx_bstride_0_y = 0;
-  Py_ssize_t __pyx_bshape_0_y = 0;
-  PyObject *__pyx_r = NULL;
-  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,0};
-  __Pyx_RefNannySetupContext("plain_sgd");
-  __pyx_self = __pyx_self;
-  if (unlikely(__pyx_kwds)) {
-    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
-    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    switch (PyTuple_GET_SIZE(__pyx_args)) {
-      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, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
-    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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __Pyx_INCREF((PyObject *)__pyx_v_loss);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_INCREF((PyObject *)__pyx_v_y);
-  __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
-  __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;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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];
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_bstride_0_y = __pyx_bstruct_y.strides[0];
-  __pyx_bshape_0_y = __pyx_bstruct_y.shape[0];
-
 181:               DOUBLE intercept,
-
 182:               LossFunction loss,
-
 183:               int penalty_type,
-
 184:               double alpha, double rho,
-
 185:               np.ndarray[DOUBLE, ndim=1] X_data,
-
 186:               np.ndarray[INTEGER, ndim=1] X_indices,
-
 187:               np.ndarray[INTEGER, ndim=1] X_indptr,
-
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
-  int __pyx_v_copy_shape;
-  int __pyx_v_i;
-  int __pyx_v_ndim;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  int __pyx_v_t;
-  char *__pyx_v_f;
-  PyArray_Descr *__pyx_v_descr = 0;
-  int __pyx_v_offset;
-  int __pyx_v_hasfields;
-  int __pyx_r;
-  __Pyx_RefNannySetupContext("__getbuffer__");
-  if (__pyx_v_info == NULL) return 0;
-  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(__pyx_v_info->obj);
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
-
 188:               np.ndarray[DOUBLE, ndim=1] y,
-
 189:               int n_iter, int fit_intercept,
-
 190:               int verbose, int shuffle):
-
 191:     """Cython implementation of SGD with different loss functions and
-
 192:     penalties.
-
 193: 
-
-    __pyx_v_endian_detector = 1;
-
 194: 
-
-    __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
-
 195:     """
-
 196:     # get the data information into easy vars
-
-    __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
-
 197:     cdef unsigned int n_samples = y.shape[0]
-
-    __pyx_v_n_samples = (__pyx_v_y->dimensions[0]);
-
 198:     cdef unsigned int n_features = w.shape[0]
-
-    __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
-
-    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_1) {
-
 199: 
-
-        __pyx_v_copy_shape = 1;
-    goto __pyx_L5;
-  }
-  /*else*/ {
-
 200:     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples) # FIXME unsined int?
-
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = ((PyArrayObject *)__pyx_t_1);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, 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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
-      __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
-    }
-  }
-  __pyx_t_4 = 0;
-  __pyx_v_index = ((PyArrayObject *)__pyx_t_1);
-  __pyx_t_1 = 0;
-
 201:     cdef DOUBLE wscale = 1.0
-
-    __pyx_v_wscale = 1.0;
-
-        __pyx_v_copy_shape = 0;
-  }
-  __pyx_L5:;
-
 202:     cdef DOUBLE eta = 0.0
-
-    __pyx_v_eta = 0.0;
-
 203:     cdef DOUBLE p = 0.0
-
-    __pyx_v_p = 0.0;
-
-    __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
-  if (__pyx_t_1) {
-
 204:     cdef DOUBLE update = 0.0
-
-    __pyx_v_update = 0.0;
-
-        __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
-    __pyx_t_3 = __pyx_t_2;
-  } else {
-    __pyx_t_3 = __pyx_t_1;
-  }
-  if (__pyx_t_3) {
-
 205:     cdef DOUBLE sumloss = 0.0
-
-    __pyx_v_sumloss = 0.0;
-
-        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
-    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_Raise(__pyx_t_5, 0, 0);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
-
 206:     cdef DOUBLE wnorm = 0.0
-
-    __pyx_v_wnorm = 0.0;
-
 207:     cdef DOUBLE t = 0.0
-
-    __pyx_v_t = 0.0;
-
-    __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
-  if (__pyx_t_3) {
-
 208:     cdef unsigned int count = 0
-
-    __pyx_v_count = 0;
-
-        __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
-    __pyx_t_2 = __pyx_t_1;
-  } else {
-    __pyx_t_2 = __pyx_t_3;
-  }
-  if (__pyx_t_2) {
-
 209:     cdef unsigned int epoch = 0
-
-    __pyx_v_epoch = 0;
-
-        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
-    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
-    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __Pyx_Raise(__pyx_t_4, 0, 0);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L7;
-  }
-  __pyx_L7:;
-
 210:     cdef unsigned int i = 0
-
-    __pyx_v_i = 0;
-
 211:     cdef unsigned int sample = 0
-
-    __pyx_v_sample = 0;
-
-    __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
-
 212: 
-
-    __pyx_v_info->ndim = __pyx_v_ndim;
-
 213:     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = np.zeros((n_features,),
-
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __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 = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__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(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-
-    __pyx_t_6 = __pyx_v_copy_shape;
-  if (__pyx_t_6) {
-
 214:                                                            dtype = np.float64,
-
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_3, __pyx_t_1, ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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 = 213; __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_v_q = ((PyArrayObject *)__pyx_t_6);
-  __pyx_t_6 = 0;
-
 215:                                                            order = "c" )
-
 216:     cdef double u = 0.0
-
-    __pyx_v_u = 0.0;
-
-        __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
-
 217:     # computing eta0
-
-        __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
-
 218:     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
-
-    __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
-
-        __pyx_t_6 = __pyx_v_ndim;
-    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
-      __pyx_v_i = __pyx_t_7;
-
 219:     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
-
-    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_typw); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_2 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)); 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_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_2 = 0;
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_max, __pyx_t_3, 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_8 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_eta0 = __pyx_t_8;
-
-            (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
-
 220:     t = 1.0 / (eta0 * alpha)
-
-    __pyx_v_t = (1.0 / ((double)(__pyx_v_eta0 * __pyx_v_alpha)));
-
-            (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
-    }
-    goto __pyx_L8;
-  }
-  /*else*/ {
-
 221:     t_start = time()
-
-    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(__pyx_v_t_start);
-  __pyx_v_t_start = __pyx_t_1;
-  __pyx_t_1 = 0;
-
 222:     for epoch from 0 <= epoch < n_iter:
-
-    __pyx_t_9 = __pyx_v_n_iter;
-  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
-
-        __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
-
 223:         if verbose > 0:
-
-        __pyx_t_10 = (__pyx_v_verbose > 0);
-    if (__pyx_t_10) {
-
-        __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self)));
-  }
-  __pyx_L8:;
-
 224:             print("-- Epoch %d" % (epoch + 1))
-
-            __pyx_t_1 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L8;
-    }
-    __pyx_L8:;
-
-    __pyx_v_info->suboffsets = NULL;
-
 225:         if shuffle:
-
-        __pyx_t_11 = __pyx_v_shuffle;
-    if (__pyx_t_11) {
-
-    __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
-
 226:             np.random.shuffle(index)
-
-            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__random); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_INCREF(((PyObject *)__pyx_v_index));
-      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_index));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_index));
-      __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L9;
-    }
-    __pyx_L9:;
-
-    __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
-
 227:         for i from 0 <= i < n_samples:
-
-        __pyx_t_12 = __pyx_v_n_samples;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
-
 228:             sample = index[i]
-
-            __pyx_t_13 = __pyx_v_i;
-      __pyx_v_sample = (*__Pyx_BufPtrCContig1d(__pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_bstruct_index.buf, __pyx_t_13, __pyx_bstride_0_index));
-
 229:             eta = 1.0 / (alpha * t)
-
-            __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
-
-    __pyx_v_f = NULL;
-
 230:             p = 0.0#(dot(wdata, xdata, xnnz) * wscale) + intercept
-
-            __pyx_v_p = 0.0;
-
-    __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
-  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
-
 231:             sumloss += loss.loss(p,y)
-
-            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0);
-
 232:             update = eta * loss.dloss(p,y)
-
-            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0));
-
 233:             if update != 0:
-
-            __pyx_t_10 = (__pyx_v_update != 0);
-      if (__pyx_t_10) {
-
 234:                 #add(wdata, wscale, xdata,
-
-    __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
-
 235:                 #    xnnz,update)
-
 236:                 if fit_intercept == 1:
-
-                __pyx_t_10 = (__pyx_v_fit_intercept == 1);
-        if (__pyx_t_10) {
-
-    __pyx_t_2 = (!__pyx_v_hasfields);
-  if (__pyx_t_2) {
-    __pyx_t_3 = (!__pyx_v_copy_shape);
-    __pyx_t_1 = __pyx_t_3;
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-  }
-  if (__pyx_t_1) {
-
 237:                     intercept += update * 0.01
-
-                    __pyx_v_intercept += (__pyx_v_update * 0.01);
-          goto __pyx_L13;
-        }
-        __pyx_L13:;
-        goto __pyx_L12;
-      }
-      __pyx_L12:;
-
 238:             if penalty_type != L1:
-
-            __pyx_t_10 = (__pyx_v_penalty_type != 1);
-      if (__pyx_t_10) {
-
-        __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = Py_None;
-    goto __pyx_L11;
-  }
-  /*else*/ {
-
 239:                 wscale *= (1 - rho * eta * alpha)
-
-                __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
-
 240:                 if wscale < 1e-9:
-
-                __pyx_t_10 = (__pyx_v_wscale < 1.0000000000000001e-09);
-        if (__pyx_t_10) {
-
 241:                     w*=wscale
-
-                    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-          __pyx_t_15 = ((PyArrayObject *)__pyx_t_1);
-          {
-            __Pyx_BufFmt_StackElem __pyx_stack[1];
-            __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-            __pyx_t_11 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-            if (unlikely(__pyx_t_11 < 0)) {
-              PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
-              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
-                Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
-                __Pyx_RaiseBufferFallbackError();
-              } else {
-                PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
-              }
-            }
-            __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
-            __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
-          __pyx_t_15 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_v_w));
-          __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
-          __pyx_t_1 = 0;
-
-        __Pyx_INCREF(__pyx_v_self);
-    __Pyx_GIVEREF(__pyx_v_self);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = __pyx_v_self;
-  }
-  __pyx_L11:;
-
 242:                     wscale = 1.0
-
-                    __pyx_v_wscale = 1.0;
-          goto __pyx_L15;
-        }
-        __pyx_L15:;
-        goto __pyx_L14;
-      }
-      __pyx_L14:;
-
 243:             if penalty_type == L2 or penalty_type == ELASTICNET:
-
-            switch (__pyx_v_penalty_type) {
-        case 2:
-        case 3:
-
-    __pyx_t_1 = (!__pyx_v_hasfields);
-  if (__pyx_t_1) {
-
 244:                 u += ((1.0 - rho) * eta * alpha)
-
-                __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
-        break;
-      }
-
-        __pyx_v_t = __pyx_v_descr->type_num;
-
 245:                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
-
-        __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
-    if (__pyx_t_1) {
-      __pyx_t_2 = __pyx_v_little_endian;
-    } else {
-      __pyx_t_2 = __pyx_t_1;
-    }
-    if (!__pyx_t_2) {
-
 246:             t += 1
-
-            __pyx_v_t += 1;
-
-            __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
-      if (__pyx_t_1) {
-        __pyx_t_3 = (!__pyx_v_little_endian);
-        __pyx_t_8 = __pyx_t_3;
-      } else {
-        __pyx_t_8 = __pyx_t_1;
-      }
-      __pyx_t_1 = __pyx_t_8;
-    } else {
-      __pyx_t_1 = __pyx_t_2;
-    }
-    if (__pyx_t_1) {
-
 247:             count += 1
-
-            __pyx_v_count += 1;
-    }
-
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
-      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_Raise(__pyx_t_5, 0, 0);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L13;
-    }
-    __pyx_L13:;
-
 248:         # report epoche information
-
-        __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__b;
-      goto __pyx_L14;
-    }
-
 249:         if verbose > 0:
-
-        __pyx_t_10 = (__pyx_v_verbose > 0);
-    if (__pyx_t_10) {
-
-        __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__B;
-      goto __pyx_L14;
-    }
-
 250:             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
-
-            __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dot); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__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 = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__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));
-      __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_w));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_3 = PyObject_Call(__pyx_t_6, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyNumber_Multiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyNumber_Multiply(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_v_wnorm = sqrt(__pyx_t_14);
-
-        __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__h;
-      goto __pyx_L14;
-    }
-
 251:             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 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shape); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyFloat_FromDouble((((double)__pyx_v_sumloss) / ((double)__pyx_v_count))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_6);
-      __Pyx_GIVEREF(__pyx_t_6);
-      PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_2);
-      __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_5);
-      __Pyx_GIVEREF(__pyx_t_5);
-      __pyx_t_3 = 0;
-      __pyx_t_1 = 0;
-      __pyx_t_6 = 0;
-      __pyx_t_2 = 0;
-      __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__H;
-      goto __pyx_L14;
-    }
-
 252:             print("Total training time: %.2f seconds." % (time()-t_start))
-
-            __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      goto __pyx_L16;
-    }
-    __pyx_L16:;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_INT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__i;
-      goto __pyx_L14;
-    }
-
 253: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_UINT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__I;
-      goto __pyx_L14;
-    }
-
 254:         # floating-point under-/overflow check.
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__l;
-      goto __pyx_L14;
-    }
-
 255:         if np.any(np.isinf(w)) or np.any(np.isnan(w)) or np.isnan(intercept) or np.isinf(intercept):
-
-        __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_5 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__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_6 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_6);
-    __Pyx_GIVEREF(__pyx_t_6);
-    __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    if (!__pyx_t_10) {
-      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_2 = PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
-      __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (!__pyx_t_20) {
-        __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_6 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_19);
-        PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_2);
-        __Pyx_GIVEREF(__pyx_t_2);
-        __pyx_t_2 = 0;
-        __pyx_t_2 = PyObject_Call(__pyx_t_6, __pyx_t_19, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        if (!__pyx_t_21) {
-          __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_19 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_19);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_23 = __pyx_t_22;
-        } else {
-          __pyx_t_23 = __pyx_t_21;
-        }
-        __pyx_t_21 = __pyx_t_23;
-      } else {
-        __pyx_t_21 = __pyx_t_20;
-      }
-      __pyx_t_20 = __pyx_t_21;
-    } else {
-      __pyx_t_20 = __pyx_t_10;
-    }
-    if (__pyx_t_20) {
-
-        __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__L;
-      goto __pyx_L14;
-    }
-
 256:             raise ValueError("floating-point under-/overflow occured.")
-
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_4));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_6 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_Raise(__pyx_t_6, 0, 0);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L17;
-    }
-    __pyx_L17:;
-  }
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__q;
-      goto __pyx_L14;
-    }
-
 257: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Q;
-      goto __pyx_L14;
-    }
-
 258:     w *= wscale
-
-    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_2 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_15 = ((PyArrayObject *)__pyx_t_2);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-    if (unlikely(__pyx_t_9 < 0)) {
-      PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
-      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
-        Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
-        __Pyx_RaiseBufferFallbackError();
-      } else {
-        PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
-      }
-    }
-    __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 = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_15 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_v_w));
-  __pyx_v_w = ((PyArrayObject *)__pyx_t_2);
-  __pyx_t_2 = 0;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__f;
-      goto __pyx_L14;
-    }
-
 259:     return w, intercept
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_INCREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_6;
-  __pyx_t_6 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_19);
-  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
-    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
-  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
-  __pyx_r = NULL;
-  goto __pyx_L2;
-  __pyx_L0:;
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_index);
-  __Pyx_XDECREF((PyObject *)__pyx_v_q);
-  __Pyx_DECREF(__pyx_v_t_start);
-  __Pyx_DECREF((PyObject *)__pyx_v_w);
-  __Pyx_DECREF((PyObject *)__pyx_v_loss);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_DECREF((PyObject *)__pyx_v_y);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-        __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__d;
-      goto __pyx_L14;
-    }
-
 260: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__g;
-      goto __pyx_L14;
-    }
-
 261: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zf;
-      goto __pyx_L14;
-    }
-
 262: ## # ----------------------------------------
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zd;
-      goto __pyx_L14;
-    }
-
 263: ## # Python function for external prediction
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zg;
-      goto __pyx_L14;
-    }
-
 264: ## # ----------------------------------------
-
-        __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__O;
-      goto __pyx_L14;
-    }
-    /*else*/ {
-
 265: ## def predict(np.ndarray x, np.ndarray w,
-
 266: ##             double bias):
-
-            __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_Raise(__pyx_t_4, 0, 0);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    __pyx_L14:;
-
 267: ##     """Computes x*w + b efficiently.
-
-        __pyx_v_info->format = __pyx_v_f;
-
 268: 
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L12;
-  }
-  /*else*/ {
-
 269: ##     :arg x: the instance represented as a sparse vector.
-
 270: ##     :type x: np.ndarray(dtype=bolt.sparsedtype)
-
-        __pyx_v_info->format = ((char *)malloc(255));
-
 271: ##     :arg w: the weight vector represented as a dense vector.
-
-        (__pyx_v_info->format[0]) = '^';
-
 272: ##     :type w: np.ndarray(dtype=bolt.densedtype)
-
-        __pyx_v_offset = 0;
-
 273: ##     :arg b: the bias term (aka offset or intercept).
-
 274: ##     :type b: float
-
 275: ##     :returns: A double representing `x*w + b`.
-
-        __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_9;
-
 276: ##     """
-
-        (__pyx_v_f[0]) = 0;
-  }
-  __pyx_L12:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
-  __pyx_r = -1;
-  __Pyx_GOTREF(__pyx_v_info->obj);
-  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
-  goto __pyx_L2;
-  __pyx_L0:;
-  if (__pyx_v_info->obj == Py_None) {
-    __Pyx_GOTREF(Py_None);
-    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
-  }
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 277: ##     cdef int xnnz = x.shape[0]
-
 278: ##     cdef int wdim = w.shape[0]
-
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
-  __Pyx_RefNannySetupContext("__releasebuffer__");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
-
 279: ##     cdef double y = 0.0
-
-    __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
-  if (__pyx_t_1) {
-
 280: ##     if xnnz == 0:
-
-        free(__pyx_v_info->format);
-    goto __pyx_L5;
-  }
-  __pyx_L5:;
-
 281: ##         y = bias
-
-    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_1) {
-
 282: ##     else:
-
-        free(__pyx_v_info->strides);
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
-
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-}
-
 283: ##         y = dot_checked(<double *>w.data,<Pair *>x.data,xnnz,wdim) + bias
-
 284: ##     return y
-
 285: 
-
 286: ##  # ----------------------------------------
-
 287: ##  # C functions for fast sparse-dense vector operations
-
 288: ##  # ----------------------------------------
-
 289: 
-
 290: ## cdef struct Pair:
-
 291: ##     np.uint32_t idx
-
 292: ##     np.float32_t val
-
 293: 
-
 294: ## cdef inline double max(double a, double b):
-
 295: ##     return a if a >= b else b
-
 296: 
-
 297: ## cdef inline double min(double a, double b):
-
 298: ##     return a if a <= b else b
-
 299: 
-
 300: ## cdef double dot(double *w, Pair *x, int nnz):
-
 301: ##     """Dot product of weight vector w and example x.
-
 302: ##     """
-
 303: ##     cdef double sum = 0.0
-
 304: ##     cdef Pair pair
-
 305: ##     cdef int i
-
 306: ##     for i from 0 <= i < nnz:
-
 307: ##         pair = x[i]
-
 308: ##         sum += w[pair.idx] * pair.val
-
 309: ##     return sum
-
 310: 
-
 311: ## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
-
 312: ##     """ Checked version of dot product. Ignores features in x
-
 313: ##     with a higher index than dimension of w.
-
 314: ##     """
-
 315: ##     cdef double sum = 0.0
-
 316: ##     cdef Pair pair
-
 317: ##     cdef int i
-
 318: ##     for i from 0 <= i < nnz:
-
 319: ##         pair = x[i]
-
 320: ##         if pair.idx < wdim:
-
 321: ##             sum +=w[pair.idx]*pair.val
-
 322: ##     return sum
-
 323: 
-
 324: ## cdef double add(double *w, double wscale, Pair *x, int nnz, double c):
-
 325: ##     """Scales example x by constant c and adds it to the weight vector w.
-
 326: ##     """
-
 327: ##     cdef Pair pair
-
 328: ##     cdef int i
-
 329: ##     cdef double innerprod = 0.0
-
 330: ##     cdef double xsqnorm = 0.0
-
 331: ##     for i from 0 <= i < nnz:
-
 332: ##         pair = x[i]
-
 333: ##         innerprod += (w[pair.idx] * pair.val)
-
 334: ##         xsqnorm += (pair.val*pair.val)
-
 335: ##         w[pair.idx] += pair.val * (c / wscale)
-
 336: 
-
 337: ##     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
-
 338: 
-
 339: ## # ----------------------------------------
-
 340: ## # Extension type for Stochastic Gradient Descent
-
 341: ## # ----------------------------------------
-
 342: 
-
 343: ## cdef class SGD:
-
 344: 
-
 345: ##     cdef int epochs
-
 346: ##     cdef double reg
-
 347: ##     cdef LossFunction loss
-
 348: ##     cdef int norm
-
 349: ##     cdef double alpha
-
 350: 
-
 351: ##     def __init__(self, loss, reg, epochs = 5, norm = 2, alpha = 0.85):
-
 352: ##         """
-
 353: 
-
 354: ##         :arg loss: The :class:`LossFunction` (default ModifiedHuber) .
-
 355: ##         :arg reg: The regularization parameter lambda (>0).
-
 356: ##         :type reg: float.
-
 357: ##         :arg epochs: The number of iterations through the dataset.
-
 358: ##         :type epochs: int
-
 359: ##         :arg norm: Whether to minimize the L1, L2 norm or the Elastic Net.
-
 360: ##         :type norm: 1 or 2 or 3
-
 361: ##         :arg alpha: The elastic net penality parameter. A value of 1 amounts to L2 regularization whereas a value of 0 gives L1 penalty.
-
 362: ##         :type alpha: float (0 <= alpha <= 1)
-
 363: ##         """
-
 364: ##         if loss == None:
-
 365: ##             raise ValueError("Loss function must not be None.")
-
 366: ##         if reg < 0.0:
-
 367: ##             raise ValueError("reg must be larger than 0. ")
-
 368: ##         if norm not in [1,2,3]:
-
 369: ##             raise ValueError("norm must be in {1,2,3}. ")
-
 370: ##         if alpha > 1.0 or alpha < 0.0:
-
 371: ##             raise ValueError("alpha must be in [0,1]. ")
-
 372: ##         self.loss = loss
-
 373: ##         self.reg = reg
-
 374: ##         self.epochs = epochs
-
 375: ##         self.norm = norm
-
 376: ##         self.alpha = alpha
-
 377: 
-
 378: ##     def __reduce__(self):
-
 379: ##         return SGD,(self.loss,self.reg, self.epochs, self.norm, self.alpha)
-
 380: 
-
 381: ##     def train(self, model, dataset, verbose = 0, shuffle = False):
-
 382: ##         """Train `model` on the `dataset` using SGD.
-
 383: 
-
 384: ##         :arg model: The :class:`bolt.model.LinearModel` that is going to be trained.
-
 385: ##         :arg dataset: The :class:`bolt.io.Dataset`.
-
 386: ##         :arg verbose: The verbosity level. If 0 no output to stdout.
-
 387: ##         :arg shuffle: Whether or not the training data should be shuffled after each epoch.
-
 388: ##         """
-
 389: ##         self._train(model, dataset, verbose, shuffle)
-
 390: 
-
 391: ##     cdef void _train(self,model, dataset, verbose, shuffle):
-
 392: 
-
 393: ##         cdef LossFunction loss = self.loss
-
 394: ##         cdef int m = model.m
-
 395: ##         cdef int n = dataset.n
-
 396: ##         cdef double reg = self.reg
-
 397: 
-
 398: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] w = model.w
-
 399: ##         # weight vector w as c array
-
 400: ##         cdef double *wdata = <double *>w.data
-
 401: ##         # the scale of w
-
 402: ##         cdef double wscale = 1.0
-
 403: 
-
 404: ##         # training instance
-
 405: ##         cdef np.ndarray x = None
-
 406: ##         cdef Pair *xdata = NULL
-
 407: 
-
 408: ##         cdef double y = 0.0
-
 409: 
-
 410: ##         # Variables for penalty term
-
 411: ##         cdef int norm = self.norm
-
 412: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] q = None
-
 413: ##         cdef double *qdata = NULL
-
 414: ##         cdef double u = 0.0
-
 415: ##         if norm == 1 or norm == 3:
-
 416: ##             q = np.zeros((m,), dtype = np.float64, order = "c" )
-
 417: ##             qdata = <double *>q.data
-
 418: 
-
 419: ##         cdef double alpha = 1.0
-
 420: ##         if norm == 1:
-
 421: ##             alpha = 0.0
-
 422: ##         elif norm == 3:
-
 423: ##             alpha = self.alpha
-
 424: 
-
 425: ##         # bias term (aka offset or intercept)
-
 426: ##         cdef int usebias = 1
-
 427: ##         if model.biasterm == False:
-
 428: ##             usebias = 0
-
 429: 
-
 430: ##         cdef double b = 0.0,p = 0.0, wnorm = 0.0, t = 0.0, update = 0.0,sumloss = 0.0, eta = 0.0
-
 431: ##         cdef int xnnz = 0, count = 0, i = 0, e = 0
-
 432: 
-
 433: ##         # computing eta0
-
 434: ##         cdef double typw = sqrt(1.0 / sqrt(reg))
-
 435: ##         cdef double eta0 = typw /max(1.0,loss.dloss(-typw,1.0))
-
 436: ##         t = 1.0 / (eta0 * reg)
-
 437: ##         t1=time()
-
 438: ##         for e from 0 <= e < self.epochs:
-
 439: ##             if verbose > 0:
-
 440: ##                 print("-- Epoch %d" % (e+1))
-
 441: ##             if shuffle:
-
 442: ##                 dataset.shuffle()
-
 443: ##             for x,y in dataset:
-
 444: ##                 eta = 1.0 / (reg * t)
-
 445: ##                 xnnz = x.shape[0]
-
 446: ##                 xdata = <Pair *>x.data
-
 447: ##                 p = (dot(wdata, xdata, xnnz) * wscale) + b
-
 448: ##                 sumloss += loss.loss(p,y)
-
 449: ##                 update = eta * loss.dloss(p,y)
-
 450: ##                 if update != 0:
-
 451: ##                     add(wdata, wscale, xdata,
-
 452: ##                         xnnz,update)
-
 453: ##                     if usebias == 1:
-
 454: ##                         b += update * 0.01
-
 455: 
-
 456: ##                 if norm != 1:
-
 457: ##                     wscale *= (1 - alpha * eta * reg)
-
 458: ##                     if wscale < 1e-9:
-
 459: ##                         w*=wscale
-
 460: ##                         wscale = 1
-
 461: ##                 if norm == 1 or norm == 3:
-
 462: ##                     u += ((1-alpha) * eta * reg)
-
 463: ##                     l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
-
 464: 
-
 465: ##                 t += 1
-
 466: ##                 count += 1
-
 467: 
-
 468: ##             # report epoche information
-
 469: ##             if verbose > 0:
-
 470: ##                 wnorm = sqrt(np.dot(w,w) * wscale * wscale)
-
 471: ##                 print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,w.nonzero()[0].shape[0],b,count,sumloss/count))
-
 472: ##                 print("Total training time: %.2f seconds." % (time()-t1))
-
 473: 
-
 474: ##         # floating-point under-/overflow check.
-
 475: ##         if np.any(np.isinf(w)) or np.any(np.isnan(w))or np.isnan(b) or np.isinf(b):
-
 476: ##             raise ValueError("floating-point under-/overflow occured.")
-
 477: ##         if norm == 3:
-
 478: ##             # FIXME rescale naive elastic net coefficient?
-
 479: ##             model.w = w * wscale #* (1.0 + alpha)
-
 480: ##         else:
-
 481: ##             model.w = w * wscale
-
 482: ##         model.bias = b
-
 483: 
-
 484: ## cdef void l1penalty(double wscale, double *w, double *q,
-
 485: ##                     Pair *x, int nnz, double u):
-
 486: ##     cdef double z = 0.0
-
 487: ##     cdef Pair pair
-
 488: ##     cdef int i,j
-
 489: ##     for i from 0 <= i < nnz:
-
 490: ##         pair = x[i]
-
 491: ##         j = pair.idx
-
 492: ##         z = w[j]
-
 493: ##         if (wscale * w[j]) > 0:
-
 494: ##             w[j] = max(0,w[j] - ((u + q[j])/wscale) )
-
 495: ##         elif (wscale * w[j]) < 0:
-
 496: ##             w[j] = min(0,w[j] + ((u - q[j])/wscale) )
-
 497: ##         q[j] += (wscale * (w[j] - z))
-
 498: 
-


From 0009295dc094ff24628101d8fb08903b6cb1bd9c Mon Sep 17 00:00:00 2001
From: Peter Prettenhofer 
Date: Sun, 24 Oct 2010 11:35:52 +0200
Subject: [PATCH 06/17] Code review from Alexandre:  - PEP8  - removed cython
 annotation file from repo

---
 scikits/learn/sgd/base.py                     |   54 +-
 scikits/learn/sgd/setup.py                    |    7 +-
 scikits/learn/sgd/sparse/setup.py             |    7 +-
 scikits/learn/sgd/sparse/sgd.py               |  103 +-
 .../learn/sgd/sparse/src/sgd_fast_sparse.c    | 1566 +++----
 .../learn/sgd/sparse/src/sgd_fast_sparse.html | 3623 -----------------
 .../learn/sgd/sparse/src/sgd_fast_sparse.pyx  |   58 +-
 scikits/learn/sgd/tests/test_sparse.py        |   56 +-
 8 files changed, 940 insertions(+), 4534 deletions(-)
 delete mode 100644 scikits/learn/sgd/sparse/src/sgd_fast_sparse.html

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index 737fe9c4d221f..bd11bca400595 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -3,12 +3,8 @@
 # License: BSD Style.
 """Stochastic Gradient Descent (SGD) with sparse data. """
 
-import numpy as np
-from scipy import sparse
-
 from ..base import BaseEstimator
 
-
 class LinearModel(BaseEstimator):
     """Linear Model trained by minimizing a regularized training
     error using SGD.
@@ -34,7 +30,7 @@ class LinearModel(BaseEstimator):
         The number of passes over the training data (aka epochs).
     shuffle: bool
         Whether or not the training data should be shuffled after each epoch.
-	Defaults to False. 
+        Defaults to False. 
 
     Attributes
     ----------
@@ -46,32 +42,32 @@ class LinearModel(BaseEstimator):
 
     """
 
-    def __init__(self, loss = "hinge", penalty = 'l2', alpha = 0.0001,
-		 rho = 0.85, coef_ = None, intercept_ = 0.0,
-		 fit_intercept = True, n_iter = 5, shuffle = False):
+    def __init__(self, loss="hinge", penalty='l2', alpha=0.0001,
+                 rho=0.85, coef_=None, intercept_=0.0,
+                 fit_intercept=True, n_iter=5, shuffle=False):
         self.loss = loss
-	self.penalty = penalty
-	self.alpha = alpha
+        self.penalty = penalty
+        self.alpha = alpha
         self.rho = rho
-	self.coef_ = coef_
-	self.intercept_ = intercept_
+        self.coef_ = coef_
+        self.intercept_ = intercept_
         self.fit_intercept = fit_intercept
-	self.n_iter = int(n_iter)
-	if self.n_iter <= 0:
-	    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 = shuffle
-	self._get_loss_function()
-	self._get_penalty_type()
+        self.n_iter = int(n_iter)
+        if self.n_iter <= 0:
+            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 = shuffle
+        self._get_loss_function()
+        self._get_penalty_type()
 
     def _get_penalty_type(self):
-	penalty_types = {"l2":2, "l1":1, "elasticnet":3}
-	try:
-	    self.penalty_type = penalty_types[self.penalty]
-	    if self.penalty_type == 2:
-		self.rho = 1.0
-	    elif self.penalty_type == 1:
-		self.rho = 0.0
-	except KeyError:
-	    raise ValueError("The penalty %s is not supported. " % self.penalty)
+        penalty_types = {"l2":2, "l1":1, "elasticnet":3}
+        try:
+            self.penalty_type = penalty_types[self.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. " % self.penalty)
diff --git a/scikits/learn/sgd/setup.py b/scikits/learn/sgd/setup.py
index b0e6f55cce7f2..2628e6e58fcbd 100644
--- a/scikits/learn/sgd/setup.py
+++ b/scikits/learn/sgd/setup.py
@@ -1,19 +1,14 @@
-from os.path import join
-import warnings
 import numpy
-import sys
 from ConfigParser import ConfigParser
 
 def configuration(parent_package='', top_path=None):
     from numpy.distutils.misc_util import Configuration
-    from numpy.distutils.system_info import get_info, get_standard_file, BlasNotFoundError
+    from numpy.distutils.system_info import get_standard_file
     config = Configuration('sgd', parent_package, top_path)
 
     site_cfg  = ConfigParser()
     site_cfg.read(get_standard_file('site.cfg'))
     
-    
-
     # add other directories
     config.add_subpackage('tests')
     config.add_subpackage('sparse')
diff --git a/scikits/learn/sgd/sparse/setup.py b/scikits/learn/sgd/sparse/setup.py
index d536051a7c3ba..5e50dea3568c7 100644
--- a/scikits/learn/sgd/sparse/setup.py
+++ b/scikits/learn/sgd/sparse/setup.py
@@ -1,17 +1,12 @@
 from os.path import join
-import warnings
 import numpy
-import sys
 from ConfigParser import ConfigParser
 
 def configuration(parent_package='', top_path=None):
     from numpy.distutils.misc_util import Configuration
-    from numpy.distutils.system_info import get_info
     from numpy.distutils.system_info import get_standard_file
-    from numpy.distutils.system_info import BlasNotFoundError
 
     config = Configuration('sparse', parent_package, top_path)
-
     site_cfg  = ConfigParser()
     site_cfg.read(get_standard_file('site.cfg'))
 
@@ -27,3 +22,5 @@ def configuration(parent_package='', top_path=None):
 if __name__ == '__main__':
     from numpy.distutils.core import setup
     setup(**configuration(top_path='').todict())
+    
+    
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index 933ca72d66cb1..09b48050c1864 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -3,7 +3,6 @@
 # License: BSD Style.
 """Implementation of Stochastic Gradient Descent (SGD) with sparse data."""
 
-import warnings
 import numpy as np
 from scipy import sparse
 
@@ -38,7 +37,7 @@ class SGD(LinearModel, ClassifierMixin):
         The number of passes over the training data (aka epochs).
     shuffle: bool
         Whether or not the training data should be shuffled after each epoch.
-	Defaults to False. 
+        Defaults to False. 
 
     Attributes
     ----------
@@ -51,21 +50,20 @@ class SGD(LinearModel, ClassifierMixin):
     """
 
     def _get_loss_function(self):
-	loss_functions = {"hinge" : sgd_fast_sparse.Hinge(),
-			  "log" : sgd_fast_sparse.Log(),
-			  "modifiedhuber" : sgd_fast_sparse.ModifiedHuber(),
-			  }
-	try:
-	    self.loss_function = loss_functions[self.loss]
-	except KeyError:
-	    raise ValueError("The loss %s is not supported. " % self.loss)
+        loss_functions = {"hinge" : sgd_fast_sparse.Hinge(),
+                          "log" : sgd_fast_sparse.Log(),
+                          "modifiedhuber" : sgd_fast_sparse.ModifiedHuber(),
+                          }
+        try:
+            self.loss_function = loss_functions[self.loss]
+        except KeyError:
+            raise ValueError("The loss %s is not supported. " % self.loss)
     
     def _set_coef(self, coef_):
         self.coef_ = coef_
         if coef_ is None:
             self.sparse_coef_ = None
         else:
-            n_features = len(coef_)
             # sparse representation of the fitted coef for the predict method
             self.sparse_coef_ = sparse.csr_matrix(coef_)
 
@@ -77,43 +75,44 @@ def fit(self, X, Y, **params):
         """
         self._set_params(**params)
         X = sparse.csr_matrix(X)
-        Y = np.asanyarray(Y, dtype = np.float64)
-	classes = np.unique(Y)
-	if len(classes) != 2:
-	    raise ValueError("SGD supports binary classification only.")
-	self.classes = classes
-
-	# encode original class labels as 1 (classes[0]) or -1 (classes[1]). 
-	Y_new = np.ones(Y.shape, dtype = np.float64)
-	Y_new *= -1.0
-	Y_new[Y == classes[0]] = 1.0
-	Y = Y_new
+        Y = np.asanyarray(Y, dtype=np.float64)
+        classes = np.unique(Y)
+        if len(classes) != 2:
+            raise ValueError("SGD supports binary classification only.")
+        self.classes = classes
+
+        # encode original class labels as 1 (classes[0]) or -1 (classes[1]). 
+        Y_new = np.ones(Y.shape, dtype=np.float64)
+        Y_new *= -1.0
+        Y_new[Y == classes[0]] = 1.0
+        Y = Y_new
 
         n_samples, n_features = X.shape[0], X.shape[1]
         if self.coef_ is None:
-            self.coef_ = np.zeros(n_features, dtype=np.float64, order = "c")
+            self.coef_ = np.zeros(n_features, dtype=np.float64, order="c")
         
-        X_data = np.array(X.data, np.float64, order = "c")
-	X_indices = X.indices
-	X_indptr = X.indptr
-	verbose = 0#2
-	print self.fit_intercept
-	print self.alpha
-	print self.rho
-	coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_,
-						      self.intercept_,
-						      self.loss_function,
-						      self.penalty_type,
-						      self.alpha, self.rho,
-						      X_data,
-						      X_indices, X_indptr, Y,
-						      self.n_iter,
-						      int(self.fit_intercept),
-						      verbose, int(self.shuffle))
+        X_data = np.array(X.data, dtype=np.float64, order="c")
+        X_indices = X.indices
+        X_indptr = X.indptr
+        verbose = 0#2
+        print self.fit_intercept
+        print self.alpha
+        print self.rho
+        coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_,
+                                                      self.intercept_,
+                                                      self.loss_function,
+                                                      self.penalty_type,
+                                                      self.alpha, self.rho,
+                                                      X_data,
+                                                      X_indices, X_indptr, Y,
+                                                      self.n_iter,
+                                                      int(self.fit_intercept),
+                                                      verbose, 
+                                                      int(self.shuffle))
 
         # update self.coef_ and self.sparse_coef_ consistently
         self._set_coef(coef_)
-	self.intercept_ = intercept_
+        self.intercept_ = intercept_
 
         # return self for chaining fit and predict calls
         return self
@@ -127,13 +126,14 @@ def predict(self, X):
 
         Returns
         -------
-        array, shape = [n_samples] with the predicted class labels (either -1, 1, or 0).
+        array, shape = [n_samples] 
+           Array containing the predicted class labels (either -1 or 1).
         """        
         sign = np.sign(self.predict_margin(X))
-	sign[sign == 1] = 0
-	sign[sign == -1] = 1
-	# FIXME what if sign == 0? break randomly?
-	return np.array([self.classes[p] for p in sign])
+        sign[sign == 1] = 0
+        sign[sign == -1] = 1
+        # FIXME what if sign == 0? break randomly?
+        return np.array([self.classes[p] for p in sign])
 
     def predict_margin(self, X):
         """Predict signed 'distance' to the hyperplane (aka confidence score). 
@@ -153,6 +153,17 @@ def predict_margin(self, X):
                         + self.intercept_)
 
     def predict_proba(self, X):
+        """Predict class membership probability. 
+
+        Parameters
+        ----------
+        X : scipy.sparse matrix of shape [n_samples, n_features]
+
+        Returns
+        -------
+        array, shape = [n_samples] 
+            Contains the membership probabilities of the positive class.
+        """
         # how can this be, logisitic *does* implement this
         raise NotImplementedError(
                 'sgd does not provide this functionality')
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
index 173a399b7526d..3b4ec5cdd4ea1 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.12.1 on Sat Oct 23 20:35:43 2010 */
+/* Generated by Cython 0.12.1 on Sun Oct 24 11:34:09 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -380,7 +380,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
@@ -393,19 +393,19 @@ struct __pyx_obj_15sgd_fast_sparse_LossFunction {
   struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
  *         raise NotImplementedError()
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self,double p, double y):
  */
 
 struct __pyx_obj_15sgd_fast_sparse_Regression {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
  *         return SquaredError,()
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
@@ -418,7 +418,7 @@ struct __pyx_obj_15sgd_fast_sparse_Huber {
   double c;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
  *         return Log,()
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
@@ -430,19 +430,19 @@ struct __pyx_obj_15sgd_fast_sparse_SquaredError {
   struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self, double p, double y):
  */
 
 struct __pyx_obj_15sgd_fast_sparse_Classification {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
  *         return ModifiedHuber,()
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
@@ -454,7 +454,7 @@ struct __pyx_obj_15sgd_fast_sparse_Hinge {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
  *         raise NotImplementedError()
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
@@ -466,7 +466,7 @@ struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
@@ -479,7 +479,7 @@ struct __pyx_obj_15sgd_fast_sparse_Log {
 };
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":34
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
@@ -494,12 +494,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":55
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
  *         raise NotImplementedError()
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self,double p, double y):
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
@@ -508,7 +508,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":143
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
  *         return Log,()
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
@@ -522,7 +522,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
  *         return SquaredError,()
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
@@ -536,12 +536,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":63
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self, double p, double y):
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
@@ -550,7 +550,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
  *         return ModifiedHuber,()
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
@@ -564,7 +564,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
  *         raise NotImplementedError()
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
@@ -578,7 +578,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
@@ -976,9 +976,9 @@ static char __pyx_k_7[] = "Non-native byte order not supported";
 static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)";
 static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_10[] = "Format string allocated too short.";
-static char __pyx_k_11[] = "LossFunction.loss (line 36)";
-static char __pyx_k_12[] = "LossFunction.dloss (line 45)";
-static char __pyx_k_13[] = "plain_sgd (line 184)";
+static char __pyx_k_11[] = "LossFunction.loss (line 35)";
+static char __pyx_k_12[] = "LossFunction.dloss (line 44)";
+static char __pyx_k_13[] = "plain_sgd (line 183)";
 static char __pyx_k__B[] = "B";
 static char __pyx_k__H[] = "H";
 static char __pyx_k__I[] = "I";
@@ -1127,7 +1127,7 @@ static PyObject *__pyx_n_s__y;
 static PyObject *__pyx_n_s__zeros;
 static PyObject *__pyx_int_15;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1148,14 +1148,14 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1163,10 +1163,10 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1175,18 +1175,18 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":43
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self, double p, double y):
  *         """Evaluate the derivative of the loss function.
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1202,7 +1202,7 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1237,29 +1237,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
       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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __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 = 36; __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 = 36; __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 = 35; __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 = 35; __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 = 36; __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 35; __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 = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1277,7 +1277,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1298,14 +1298,14 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1313,10 +1313,10 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1325,18 +1325,18 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":53
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class Regression(LossFunction):
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1352,7 +1352,7 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
  *         :returns: double"""
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1387,29 +1387,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
       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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __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 = 45; __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 = 45; __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 = 44; __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 = 44; __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 = 45; __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 44; __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1427,12 +1427,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self,double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -1448,14 +1448,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __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 = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1463,10 +1463,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1475,18 +1475,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
  *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1502,12 +1502,12 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self,double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -1536,29 +1536,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
       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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __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 = 57; __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 = 57; __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 = 56; __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 = 56; __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 = 57; __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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1576,10 +1576,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
- *     cpdef double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+ *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
  * 
  */
@@ -1597,14 +1597,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1612,10 +1612,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1624,18 +1624,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1651,10 +1651,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
- *     cpdef double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+ *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
  * 
  */
@@ -1685,29 +1685,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
       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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __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 = 59; __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 = 59; __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 = 58; __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 = 58; __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 = 59; __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 58; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1725,12 +1725,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -1746,14 +1746,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1761,10 +1761,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1773,18 +1773,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1800,12 +1800,12 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -1834,29 +1834,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
       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 = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __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 = 65; __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 = 65; __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 = 64; __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 = 64; __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 = 65; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1874,10 +1874,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
- *     cpdef double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+ *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
  * 
  */
@@ -1895,14 +1895,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1910,10 +1910,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1922,18 +1922,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * cdef class ModifiedHuber(Classification):
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1949,10 +1949,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
- *     cpdef double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+ *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         raise NotImplementedError()
  * 
  */
@@ -1983,29 +1983,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
       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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __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 = 67; __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 = 67; __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 = 66; __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 = 66; __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 = 67; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 66; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2023,10 +2023,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
  *     Stochastic Gradient Descent', ICML'04.
  *     """
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z >= 1:
  */
@@ -2047,14 +2047,14 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __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 = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2062,10 +2062,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2074,17 +2074,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
  *     """
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self, double p,double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z >= 1:
  *             return 0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
- *     cpdef double loss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
+ *     cpdef double loss(self, double p,double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
@@ -2093,7 +2093,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   __pyx_t_6 = (__pyx_v_z >= 1);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2105,7 +2105,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
@@ -2115,7 +2115,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   __pyx_t_6 = (__pyx_v_z >= -1);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
  *             return 0
  *         elif z >= -1:
  *             return (1-z) * (1-z)             # <<<<<<<<<<<<<<
@@ -2128,12 +2128,12 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
  *             return (1-z) * (1-z)
  *         else:
  *             return -4*z             # <<<<<<<<<<<<<<
  * 
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  */
     __pyx_r = (-4 * __pyx_v_z);
     goto __pyx_L0;
@@ -2155,10 +2155,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
  *     Stochastic Gradient Descent', ICML'04.
  *     """
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z >= 1:
  */
@@ -2189,29 +2189,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
       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 = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __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 = 80; __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 = 80; __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 = 79; __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 = 79; __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 = 80; __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 = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 79; __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2229,10 +2229,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
  *             return -4*z
  * 
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z >= 1:
  */
@@ -2253,14 +2253,14 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __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 = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2268,10 +2268,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2280,17 +2280,17 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
  * 
- *     cpdef double dloss(self,double p,double y):
+ *     cpdef double dloss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z >= 1:
  *             return 0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
- *     cpdef double dloss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+ *     cpdef double dloss(self, double p, double y):
  *         cdef double z = p*y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
@@ -2299,7 +2299,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   __pyx_t_6 = (__pyx_v_z >= 1);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
  *         cdef double z = p*y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -2311,7 +2311,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
@@ -2321,7 +2321,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   __pyx_t_6 = (__pyx_v_z >= -1);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
  *             return 0
  *         elif z >= -1:
  *             return 2*(1-z)*y             # <<<<<<<<<<<<<<
@@ -2334,7 +2334,7 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
  *             return 2*(1-z)*y
  *         else:
  *             return 4*y             # <<<<<<<<<<<<<<
@@ -2361,10 +2361,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
  *             return -4*z
  * 
- *     cpdef double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z >= 1:
  */
@@ -2395,29 +2395,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
       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 = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __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 = 89; __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 = 89; __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 = 88; __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 = 88; __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 = 89; __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 = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 88; __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 89; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2435,7 +2435,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":97
  *             return 4*y
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2449,7 +2449,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":99
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
  * 
  *     def __reduce__(self):
  *         return ModifiedHuber,()             # <<<<<<<<<<<<<<
@@ -2457,7 +2457,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
  * cdef class Hinge(Classification):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
@@ -2481,10 +2481,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
  *     classification tasks with y in {-1,1}.
  *     """
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z < 1.0:
  */
@@ -2505,14 +2505,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __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 = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2520,10 +2520,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2532,17 +2532,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
  *     """
- *     cpdef  double loss(self,double p,double y):
+ *     cpdef  double loss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return (1 - z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
- *     cpdef  double loss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+ *     cpdef  double loss(self, double p, double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return (1 - z)
@@ -2551,12 +2551,12 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return (1 - z)             # <<<<<<<<<<<<<<
  *         return 0
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  */
     __pyx_r = (1 - __pyx_v_z);
     goto __pyx_L0;
@@ -2564,11 +2564,11 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *         if z < 1.0:
  *             return (1 - z)
  *         return 0             # <<<<<<<<<<<<<<
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y
  */
   __pyx_r = 0;
@@ -2589,10 +2589,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
  *     classification tasks with y in {-1,1}.
  *     """
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z < 1.0:
  */
@@ -2623,29 +2623,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
       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 = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __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 = 105; __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 = 105; __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 = 104; __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 = 104; __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 = 105; __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 = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 104; __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2663,10 +2663,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
  *             return (1 - z)
  *         return 0
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z < 1.0:
  */
@@ -2687,14 +2687,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __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 = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2702,10 +2702,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2714,17 +2714,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *         return 0
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return y
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
- *     cpdef  double dloss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return y
@@ -2733,7 +2733,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
  *         cdef double z = p*y
  *         if z < 1.0:
  *             return y             # <<<<<<<<<<<<<<
@@ -2746,7 +2746,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
  *         if z < 1.0:
  *             return y
  *         return 0             # <<<<<<<<<<<<<<
@@ -2771,10 +2771,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
  *             return (1 - z)
  *         return 0
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z < 1.0:
  */
@@ -2805,29 +2805,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
       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 = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __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 = 110; __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 = 110; __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 = 109; __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 = 109; __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 = 110; __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 = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 109; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2845,7 +2845,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":115
  *         return 0
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -2859,7 +2859,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
  * 
  *     def __reduce__(self):
  *         return Hinge,()             # <<<<<<<<<<<<<<
@@ -2867,7 +2867,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
@@ -2891,10 +2891,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
  *     tasks with y in {-1,1}.
  *     """
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z > 18:
  */
@@ -2915,14 +2915,14 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2930,10 +2930,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2942,17 +2942,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  *     """
- *     cpdef double loss(self,double p,double y):
+ *     cpdef double loss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z > 18:
  *             return exp(-z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
- *     cpdef double loss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+ *     cpdef double loss(self, double p, double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z)
@@ -2961,7 +2961,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_t_6 = (__pyx_v_z > 18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z)             # <<<<<<<<<<<<<<
@@ -2974,7 +2974,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
  *         if z > 18:
  *             return exp(-z)
  *         if z < -18:             # <<<<<<<<<<<<<<
@@ -2984,7 +2984,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_t_6 = (__pyx_v_z < -18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
  *             return exp(-z)
  *         if z < -18:
  *             return -z * y             # <<<<<<<<<<<<<<
@@ -2997,12 +2997,12 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
  *         if z < -18:
  *             return -z * y
  *         return log(1.0+exp(-z))             # <<<<<<<<<<<<<<
  * 
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  */
   __pyx_r = log((1.0 + exp((-__pyx_v_z))));
   goto __pyx_L0;
@@ -3022,10 +3022,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
  *     tasks with y in {-1,1}.
  *     """
- *     cpdef double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z > 18:
  */
@@ -3056,29 +3056,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
       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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __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 = 124; __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 = 124; __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 = 123; __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 = 123; __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 = 124; __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 123; __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3096,10 +3096,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
  *         return log(1.0+exp(-z))
  * 
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z > 18:
  */
@@ -3120,14 +3120,14 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __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 = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3135,10 +3135,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3147,17 +3147,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  * 
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
  *         if z > 18:
  *             return exp(-z) * y
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
- *     cpdef  double dloss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z) * y
@@ -3166,7 +3166,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   __pyx_t_6 = (__pyx_v_z > 18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z) * y             # <<<<<<<<<<<<<<
@@ -3179,7 +3179,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
  *         if z > 18:
  *             return exp(-z) * y
  *         if z < -18:             # <<<<<<<<<<<<<<
@@ -3189,7 +3189,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   __pyx_t_6 = (__pyx_v_z < -18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *             return exp(-z) * y
  *         if z < -18:
  *             return y             # <<<<<<<<<<<<<<
@@ -3202,7 +3202,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
  *         if z < -18:
  *             return y
  *         return y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<
@@ -3227,10 +3227,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
  *         return log(1.0+exp(-z))
  * 
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
  *         if z > 18:
  */
@@ -3261,29 +3261,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
       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 = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __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 = 132; __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 = 132; __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 = 131; __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 = 131; __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 = 132; __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 = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 131; __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3301,7 +3301,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":139
  *         return y / (exp(z) + 1.0)
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3315,7 +3315,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
  * 
  *     def __reduce__(self):
  *         return Log,()             # <<<<<<<<<<<<<<
@@ -3323,7 +3323,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
  * cdef class SquaredError(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
@@ -3347,12 +3347,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
  *     """
  *     """
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3368,14 +3368,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __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 = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3383,10 +3383,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3395,11 +3395,11 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
  *     """
- *     cpdef  double loss(self,double p,double y):
+ *     cpdef  double loss(self, double p, double y):
  *         return 0.5 * (p-y) * (p-y)             # <<<<<<<<<<<<<<
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         return y - p
  */
   __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
@@ -3419,12 +3419,12 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
  *     """
  *     """
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3453,29 +3453,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
       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 = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __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 = 146; __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 = 146; __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 = 145; __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 = 145; __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 = 146; __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 = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3493,10 +3493,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
- *     cpdef  double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
+ *     cpdef  double loss(self, double p, double y):
  *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
  */
@@ -3514,14 +3514,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3529,10 +3529,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3541,9 +3541,9 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
  *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         return y - p             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
@@ -3565,10 +3565,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
- *     cpdef  double loss(self,double p,double y):
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
+ *     cpdef  double loss(self, double p, double y):
  *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
  */
@@ -3599,29 +3599,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
       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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __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 = 148; __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 = 148; __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 = 147; __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 = 147; __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 = 148; __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 147; __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3639,7 +3639,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":150
  *         return y - p
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -3653,7 +3653,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
  * 
  *     def __reduce__(self):
  *         return SquaredError,()             # <<<<<<<<<<<<<<
@@ -3661,7 +3661,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
  * cdef class Huber(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
@@ -3685,12 +3685,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
  *     """
  *     cdef double c
  *     def __init__(self,c):             # <<<<<<<<<<<<<<
  *         self.c = c
- *     cpdef  double loss(self,double p,double y):
+ *     cpdef  double loss(self, double p, double y):
  */
 
 static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3715,7 +3715,7 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
       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 = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_c = values[0];
   } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
@@ -3725,20 +3725,20 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
   return -1;
   __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
  *     cdef double c
  *     def __init__(self,c):
  *         self.c = c             # <<<<<<<<<<<<<<
- *     cpdef  double loss(self,double p,double y):
+ *     cpdef  double loss(self, double p, double y):
  *         cdef double r = p-y
  */
-  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
 
   __pyx_r = 0;
@@ -3751,10 +3751,10 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
  *     def __init__(self,c):
  *         self.c = c
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  */
@@ -3776,14 +3776,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); 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);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __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 = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3791,10 +3791,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3803,32 +3803,32 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
  *         self.c = c
- *     cpdef  double loss(self,double p,double y):
+ *     cpdef  double loss(self, double p, double y):
  *         cdef double r = p-y             # <<<<<<<<<<<<<<
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  */
   __pyx_v_r = (__pyx_v_p - __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
- *     cpdef  double loss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+ *     cpdef  double loss(self, double p, double y):
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __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 = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __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 = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
@@ -3838,7 +3838,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":164
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return 0.5 * r * r             # <<<<<<<<<<<<<<
@@ -3851,12 +3851,12 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165
  *             return 0.5 * r * r
  *         else:
  *             return self.c * abs_r - (0.5*self.c*self.c)             # <<<<<<<<<<<<<<
  * 
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  */
     __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));
     goto __pyx_L0;
@@ -3878,10 +3878,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
  *     def __init__(self,c):
  *         self.c = c
- *     cpdef  double loss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  */
@@ -3912,29 +3912,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
       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 = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __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 = 160; __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 = 160; __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 = 159; __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 = 159; __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 = 160; __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 = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 159; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); 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_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3952,10 +3952,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  */
@@ -3977,14 +3977,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3992,10 +3992,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -4004,32 +4004,32 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
  * 
- *     cpdef  double dloss(self,double p,double y):
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double r = y - p             # <<<<<<<<<<<<<<
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  */
   __pyx_v_r = (__pyx_v_y - __pyx_v_p);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
- *     cpdef  double dloss(self,double p,double y):
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
+ *     cpdef  double dloss(self, double p, double y):
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __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 = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __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 = 170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
@@ -4039,7 +4039,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return r             # <<<<<<<<<<<<<<
@@ -4051,7 +4051,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
  *         if abs_r <= self.c:
  *             return r
  *         elif r > 0:             # <<<<<<<<<<<<<<
@@ -4061,7 +4061,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __pyx_t_6 = (__pyx_v_r > 0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":174
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
  *             return r
  *         elif r > 0:
  *             return self.c             # <<<<<<<<<<<<<<
@@ -4074,7 +4074,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
  *             return self.c
  *         else:
  *             return -self.c             # <<<<<<<<<<<<<<
@@ -4101,10 +4101,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
- *     cpdef  double dloss(self,double p,double y):             # <<<<<<<<<<<<<<
+ *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  */
@@ -4135,29 +4135,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
       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 = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __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, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 168; __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 = 168; __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 = 168; __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 = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4175,7 +4175,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
  *             return -self.c
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -4190,7 +4190,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
  * 
  *     def __reduce__(self):
  *         return Huber,(self.c,)             # <<<<<<<<<<<<<<
@@ -4198,14 +4198,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
  * @cython.boundscheck(False)
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
@@ -4230,7 +4230,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":184
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
  * @cython.wraparound(False)
  * @cython.cdivision(True)
  * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
@@ -4361,119 +4361,119 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 183; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 187; __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 = 188; __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 = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 186; __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 = 187; __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 = 187; __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 = 193; __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 = 193; __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 = 194; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
     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 = 185; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 187; __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 = 188; __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 = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 186; __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 = 187; __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 = 187; __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 = 193; __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 = 193; __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 = 194; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
   return NULL;
@@ -4492,44 +4492,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_bstruct_X_indices.buf = NULL;
   __pyx_bstruct_X_indptr.buf = NULL;
   __pyx_bstruct_Y.buf = NULL;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __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 = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __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 = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __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)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 184; __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 = 183; __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];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    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 = 184; __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 184; __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 184; __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 184; __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
   __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":199
  *     """
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]             # <<<<<<<<<<<<<<
@@ -4538,26 +4538,26 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":201
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]
  *     cdef unsigned int n_features = w.shape[0]             # <<<<<<<<<<<<<<
  * 
- *     # FIXME double to double
+ *     cdef double *w_data_ptr = w.data
  */
   __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":202
+ *     cdef unsigned int n_features = w.shape[0]
  * 
- *     # FIXME double to double
  *     cdef double *w_data_ptr = w.data             # <<<<<<<<<<<<<<
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data
  */
   __pyx_v_w_data_ptr = ((double *)__pyx_v_w->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
- *     # FIXME double to double
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":203
+ * 
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
  *     cdef int *X_indptr_ptr = X_indptr.data
@@ -4565,7 +4565,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_data_ptr = ((double *)__pyx_v_X_data->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":206
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
@@ -4574,7 +4574,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indptr_ptr = ((int *)__pyx_v_X_indptr->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":207
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data
  *     cdef int *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
@@ -4583,54 +4583,54 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indices_ptr = ((int *)__pyx_v_X_indices->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":208
  * 
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
- *                                                                  dtype = np.int32)
+ *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  */
-  __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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); 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_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); 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_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); 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);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":209
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
- *                                                                  dtype = np.int32)             # <<<<<<<<<<<<<<
+ *                                                              dtype = np.int32)             # <<<<<<<<<<<<<<
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  */
-  __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __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 = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__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_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); 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_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
       __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
@@ -4639,17 +4639,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_v_index = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
- *                                                                  dtype = np.int32)
+ *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data             # <<<<<<<<<<<<<<
  *     cdef int offset = 0
  *     cdef int xnnz = 0
  */
   __pyx_v_index_ptr = ((int *)__pyx_v_index->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
- *                                                                  dtype = np.int32)
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
+ *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0             # <<<<<<<<<<<<<<
  *     cdef int xnnz = 0
@@ -4657,7 +4657,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_offset = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  *     cdef int xnnz = 0             # <<<<<<<<<<<<<<
@@ -4666,7 +4666,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_xnnz = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
  *     cdef int offset = 0
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0             # <<<<<<<<<<<<<<
@@ -4675,7 +4675,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wscale = 1.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0             # <<<<<<<<<<<<<<
@@ -4684,7 +4684,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0
  *     cdef double p = 0.0             # <<<<<<<<<<<<<<
@@ -4693,7 +4693,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_p = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
  *     cdef double eta = 0.0
  *     cdef double p = 0.0
  *     cdef double update = 0.0             # <<<<<<<<<<<<<<
@@ -4702,7 +4702,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_update = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
  *     cdef double p = 0.0
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<
@@ -4711,7 +4711,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sumloss = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0             # <<<<<<<<<<<<<<
@@ -4720,7 +4720,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0             # <<<<<<<<<<<<<<
@@ -4729,7 +4729,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0
  *     cdef double y = 0.0             # <<<<<<<<<<<<<<
@@ -4738,7 +4738,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_y = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
  *     cdef double t = 0.0
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<
@@ -4747,7 +4747,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_count = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<
@@ -4756,7 +4756,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_epoch = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
@@ -4765,7 +4765,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_i = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0             # <<<<<<<<<<<<<<
@@ -4774,7 +4774,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sample_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
@@ -4786,7 +4786,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __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];
     }
@@ -4795,7 +4795,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
@@ -4805,46 +4805,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_8 = (__pyx_v_penalty_type != 2);
   if (__pyx_t_8) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")             # <<<<<<<<<<<<<<
  *         q_data_ptr =  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 = 230; __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 = 228; __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 = 230; __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 = 228; __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 = 230; __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 = 228; __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __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 = 230; __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 = 228; __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 = 230; __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 = 228; __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 = 230; __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 = 228; __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 230; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__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 = 230; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
@@ -4861,14 +4861,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __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 = 230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __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;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data             # <<<<<<<<<<<<<<
@@ -4880,7 +4880,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   }
   __pyx_L6:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
@@ -4889,7 +4889,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_u = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
  *     cdef double u = 0.0
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
@@ -4898,7 +4898,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -4907,7 +4907,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta0 = (__pyx_v_typw / __pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -4916,23 +4916,23 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = (1.0 / (__pyx_v_eta0 * __pyx_v_alpha));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch from 0 <= epoch < 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 = 237; __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 = 235; __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 = 237; __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 = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_v_t_start);
   __pyx_v_t_start = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:             # <<<<<<<<<<<<<<
@@ -4942,7 +4942,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_9 = __pyx_v_n_iter;
   for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -4952,25 +4952,25 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.shuffle(index)
  */
-      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __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 = 240; __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 = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L9;
     }
     __pyx_L9:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
@@ -4980,27 +4980,27 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_13 = __pyx_v_shuffle;
     if (__pyx_t_13) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.shuffle(index)             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __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 = 240; __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 = 242; __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 = 240; __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__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 242; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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;
@@ -5009,7 +5009,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __pyx_L10:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
  *         if shuffle:
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:             # <<<<<<<<<<<<<<
@@ -5019,7 +5019,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_14 = __pyx_v_n_samples;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]             # <<<<<<<<<<<<<<
@@ -5029,7 +5029,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_15 = __pyx_v_i;
       __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -5038,7 +5038,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -5047,7 +5047,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]             # <<<<<<<<<<<<<<
@@ -5057,7 +5057,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_16 = __pyx_v_sample_idx;
       __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]
  *             eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5066,7 +5066,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -5075,7 +5075,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_p = ((__pyx_f_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);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -5084,7 +5084,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<
@@ -5093,7 +5093,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)
  *             if update != 0:             # <<<<<<<<<<<<<<
@@ -5103,7 +5103,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_8 = (__pyx_v_update != 0);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
  *             if update != 0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)             # <<<<<<<<<<<<<<
@@ -5112,7 +5112,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_f_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);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
@@ -5122,7 +5122,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         __pyx_t_8 = (__pyx_v_fit_intercept == 1);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01             # <<<<<<<<<<<<<<
@@ -5137,7 +5137,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L13:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
@@ -5147,7 +5147,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_8 = (__pyx_v_penalty_type != 1);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
  *                 wscale *= (1 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
@@ -5156,7 +5156,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
  *             if penalty_type != L1:
  *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
@@ -5166,18 +5166,18 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
  *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __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 = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_17 = ((PyArrayObject *)__pyx_t_3);
           {
@@ -5195,14 +5195,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
             }
             __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
             __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_t_17 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
           __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
+          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
@@ -5217,7 +5217,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L15:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -5228,7 +5228,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         case 1:
         case 3:
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
@@ -5237,7 +5237,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
  *                 u += ((1 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
@@ -5248,7 +5248,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         break;
       }
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
@@ -5257,7 +5257,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_t += 1;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
@@ -5267,7 +5267,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_v_count += 1;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
  *             t += 1
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -5278,7 +5278,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       case 1:
       case 3:
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
  *             u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
@@ -5287,7 +5287,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
  *             u += ((1 - rho) * eta * alpha)
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)             # <<<<<<<<<<<<<<
@@ -5298,29 +5298,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       break;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":274
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
  * 
  *         # 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, w.nonzero()[0].shape[0],
+ *             print("Norm: %.2f, NNZs: %d, "\
  */
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
  *         # 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, w.nonzero()[0].shape[0],
- *                                                                                 intercept, count, sumloss / count))
+ *             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 = 275; __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 = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
@@ -5328,35 +5328,43 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __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_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __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 = 275; __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 = 273; __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 = 275; __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 = 273; __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_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __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 = 273; __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 = 275; __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 = 273; __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_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
- *         if verbose > 0:
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
  *             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, sumloss / count))
- *             print("Total training time: %.2f seconds." % (time()-t_start))
+ *             print("Norm: %.2f, NNZs: %d, "\
+ *             "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,             # <<<<<<<<<<<<<<
+ *                                                     w.nonzero()[0].shape[0],
+ *                                                     intercept, count,
  */
-      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
+ *             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 = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -5373,19 +5381,27 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
       /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
- *             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, sumloss / count))             # <<<<<<<<<<<<<<
+ *             "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_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
+ *                                                     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 = 278; __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 = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
@@ -5402,141 +5418,165 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_5 = 0;
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
- *             print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm, w.nonzero()[0].shape[0],
- *                                                                                 intercept, count, sumloss / count))
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
+ *                                                     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 = 278; __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 = 279; __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 = 278; __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 = 279; __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 = 278; __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 = 279; __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 = 278; __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 = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       goto __pyx_L17;
     }
     __pyx_L17:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":281
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
  * 
  *         # 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):             # <<<<<<<<<<<<<<
+ *         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 = 281; __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 = 282; __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 = 281; __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 = 282; __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 = 281; __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 = 282; __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 = 281; __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 = 282; __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
     PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (!__pyx_t_8) {
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+ *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
+ * 
+ *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_20) {
-        __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+ *         # 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 = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __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 = 281; __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 = 283; __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 = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_DECREF(__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 = 281; __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 = 283; __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 = 281; __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 = 283; __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 = 281; __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 = 283; __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 = 281; __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 = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
           PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __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 = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __pyx_t_23 = __pyx_t_22;
         } else {
@@ -5552,41 +5592,41 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     if (__pyx_t_20) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
- *         # 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):
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
+ *         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 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L18;
     }
     __pyx_L18:;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);
   {
@@ -5604,14 +5644,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __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 = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_17 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
   __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":285
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -5619,9 +5659,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __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 = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
@@ -5678,7 +5718,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":288
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":290
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -5691,7 +5731,7 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("max");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":289
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
@@ -5712,7 +5752,7 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
  *     return a if a >= b else b
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
@@ -5725,7 +5765,7 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("min");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":292
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
@@ -5746,7 +5786,7 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":296
  *     return a if a <= b else b
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
@@ -5761,7 +5801,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("dot");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":296
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  *                 int offset, int xnnz):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -5770,7 +5810,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_sum = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":300
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5780,7 +5820,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":299
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":301
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5790,7 +5830,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
     __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)]));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":300
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
@@ -5806,7 +5846,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
  *     return sum
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
@@ -5824,7 +5864,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("add");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
  *     cdef int idx
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -5833,7 +5873,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":310
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -5842,7 +5882,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5852,7 +5892,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5861,7 +5901,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5870,7 +5910,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":316
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
@@ -5879,7 +5919,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -5888,7 +5928,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":316
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -5898,7 +5938,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
     (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
@@ -5914,12 +5954,12 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":321
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
  *                     int *X_indices_ptr, int offset, int xnnz, double u):
- *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+ *     """Applys the L1 penalty to each updated feature.
  */
 
 static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, double *__pyx_v_q_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz, double __pyx_v_u) {
@@ -5930,8 +5970,8 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":323
- *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+ *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
  *     cdef int j = 0
@@ -5939,7 +5979,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":324
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -5948,7 +5988,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     cdef int idx = 0             # <<<<<<<<<<<<<<
@@ -5957,7 +5997,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
  *     cdef int j = 0
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5967,7 +6007,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5976,7 +6016,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
@@ -5985,7 +6025,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
@@ -5995,7 +6035,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
     __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":334
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0:
  *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])             # <<<<<<<<<<<<<<
@@ -6006,7 +6046,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":336
  *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  *                                                         / wscale) )
  *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
@@ -6016,7 +6056,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
     __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
  *                                                         / wscale) )
  *         elif (wscale * w_data_ptr[idx]) < 0:
  *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])             # <<<<<<<<<<<<<<
@@ -6028,12 +6068,12 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":335
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":339
  *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
  *                                                         / wscale) )
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
  * 
- * cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,
+ * cdef void finall1penalty(double *w_data_ptr, double wscale,
  */
     (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
   }
@@ -6041,12 +6081,12 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
+/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":341
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
  * 
- * cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,             # <<<<<<<<<<<<<<
+ * cdef void finall1penalty(double *w_data_ptr, double wscale,             # <<<<<<<<<<<<<<
+ *                          unsigned int n_features,
  *                          double *q_data_ptr, double u):
- *     """Applys the L1 penalty. This implements the truncated gradient approach by [
  */
 
 static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, unsigned int __pyx_v_n_features, double *__pyx_v_q_data_ptr, double __pyx_v_u) {
@@ -6056,8 +6096,8 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("finall1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":341
- *     """Applys the L1 penalty. This implements the truncated gradient approach by [
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
+ * 
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
  *     cdef int j = 0
@@ -6065,7 +6105,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":342
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":352
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -6074,7 +6114,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":343
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":353
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:             # <<<<<<<<<<<<<<
@@ -6084,7 +6124,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   __pyx_t_1 = __pyx_v_n_features;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":344
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":354
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]             # <<<<<<<<<<<<<<
@@ -6093,7 +6133,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_j]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":345
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":355
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0:             # <<<<<<<<<<<<<<
@@ -6103,7 +6143,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
     __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":346
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":356
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0:
  *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])             # <<<<<<<<<<<<<<
@@ -6114,7 +6154,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":348
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":358
  *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
  *                                                     / wscale) )
  *         elif (wscale * w_data_ptr[j]) < 0:             # <<<<<<<<<<<<<<
@@ -6124,7 +6164,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
     __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":349
+      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":359
  *                                                     / wscale) )
  *         elif (wscale * w_data_ptr[j]) < 0:
  *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])             # <<<<<<<<<<<<<<
@@ -6136,7 +6176,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
+    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":361
  *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
  *                                                     / wscale) )
  *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))             # <<<<<<<<<<<<<<
@@ -9513,8 +9553,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {0, 0, 0, 0, 0, 0, 0}
 };
 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 = 44; __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __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 = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
@@ -9597,9 +9637,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.loss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_loss;
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_LossFunction.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12LossFunction_dloss;
   #endif
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_LossFunction.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_LossFunction.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_15sgd_fast_sparse_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_LossFunction = &__pyx_type_15sgd_fast_sparse_LossFunction;
   __pyx_vtabptr_15sgd_fast_sparse_Regression = &__pyx_vtable_15sgd_fast_sparse_Regression;
   __pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9611,9 +9651,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Regression.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Regression = &__pyx_type_15sgd_fast_sparse_Regression;
   __pyx_vtabptr_15sgd_fast_sparse_Classification = &__pyx_vtable_15sgd_fast_sparse_Classification;
   __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9625,9 +9665,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Classification.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Classification = &__pyx_type_15sgd_fast_sparse_Classification;
   __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber = &__pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9639,9 +9679,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_ModifiedHuber = &__pyx_type_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtabptr_15sgd_fast_sparse_Hinge = &__pyx_vtable_15sgd_fast_sparse_Hinge;
   __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9653,9 +9693,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Hinge.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Hinge = &__pyx_type_15sgd_fast_sparse_Hinge;
   __pyx_vtabptr_15sgd_fast_sparse_Log = &__pyx_vtable_15sgd_fast_sparse_Log;
   __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9667,9 +9707,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Log.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Log = &__pyx_type_15sgd_fast_sparse_Log;
   __pyx_vtabptr_15sgd_fast_sparse_SquaredError = &__pyx_vtable_15sgd_fast_sparse_SquaredError;
   __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9681,9 +9721,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_SquaredError.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_SquaredError = &__pyx_type_15sgd_fast_sparse_SquaredError;
   __pyx_vtabptr_15sgd_fast_sparse_Huber = &__pyx_vtable_15sgd_fast_sparse_Huber;
   __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9695,9 +9735,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Huber.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber;
   /*--- Type import code ---*/
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -9708,48 +9748,48 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":10
  * # License: BSD Style.
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
  * import sys
  * from time import time
  */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
  * 
  * import numpy as np
  * import sys             # <<<<<<<<<<<<<<
  * from time import time
  * 
  */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":13
+  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
  * import numpy as np
  * import sys
  * from time import time             # <<<<<<<<<<<<<<
  * 
  * cimport numpy as np
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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(((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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_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 (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  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;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html
deleted file mode 100644
index d0582316a1450..0000000000000
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.html
+++ /dev/null
@@ -1,3623 +0,0 @@
-
-
-
-
-
-
-
-        
-

Generated by Cython 0.12.1 on Mon Oct 18 22:25:08 2010 -

Raw output: sgd_fast_sparse.c -

 1: # Author: Peter Prettenhofer <peter.prettenhofer@gmail.com>
-
-    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__LossFunction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-
 2: #
-
 3: # License: BSD Style.
-
 4: from __future__ import division
-
 5: 
-
 6: import numpy as np
-
-    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
 7: import sys
-
-    __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
 8: from time import time
-
-    __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __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)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __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 = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-
 9: 
-
 10: cimport numpy as np
-
 11: cimport cython
-
 12: 
-
 13: cdef extern from "math.h":
-
 14:     cdef extern double exp(double x)
-
 15:     cdef extern double log(double x)
-
 16:     cdef extern double sqrt(double x)
-
 17: 
-
 18: ctypedef np.float64_t DOUBLE
-
 19: ctypedef np.int32_t INTEGER
-
 20: 
-
 21: DEF L1 = 1
-
 22: DEF L2 = 2
-
 23: DEF ELASTICNET = 3
-
 24: 
-
 25: 
-
 26: # ----------------------------------------
-
 27: # Extension Types for Loss Functions
-
 28: # ----------------------------------------
-
 29: 
-
 30: cdef class LossFunction:
-
-struct __pyx_obj_15sgd_fast_sparse_LossFunction {
-  PyObject_HEAD
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
-  double (*loss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-  double (*dloss)(struct __pyx_obj_15sgd_fast_sparse_LossFunction *, double, double, int __pyx_skip_dispatch);
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
-
-
 31:     """Base class for convex loss functions"""
-
 32:     cpdef double loss(self, double p, double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __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 = 32; __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 = 32; __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 = 32; __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 = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 33:         """Evaluate the loss function.
-
 34: 
-
 35:         :arg p: The prediction.
-
 36:         :type p: double
-
 37:         :arg y: The true value.
-
 38:         :type y: double
-
 39:         :returns: double"""
-
 40:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 41:     cpdef double dloss(self, double p, double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
-static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __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 = 41; __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 = 41; __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 = 41; __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 = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 42:         """Evaluate the derivative of the loss function.
-
 43: 
-
 44:         :arg p: The prediction.
-
 45:         :type p: double
-
 46:         :arg y: The true value.
-
 47:         :type y: double
-
 48:         :returns: double"""
-
 49:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.LossFunction.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 50: 
-
 51: cdef class Regression(LossFunction):
-
-struct __pyx_obj_15sgd_fast_sparse_Regression {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
-
-
 52:     """Base class for loss functions for regression."""
-
 53:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __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 = 53; __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 = 53; __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 = 53; __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 = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 54:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 55:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __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 = 55; __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 = 55; __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 = 55; __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 = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 56:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Regression.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 57: 
-
 58: 
-
 59: cdef class Classification(LossFunction):
-
-struct __pyx_obj_15sgd_fast_sparse_Classification {
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
-
-
 60:     """Base class for loss functions for classification."""
-
 61:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __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 = 61; __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 = 61; __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 = 61; __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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 62:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 63:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __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 = 63; __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 = 63; __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 = 63; __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 = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 64:         raise NotImplementedError()
-
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_Raise(__pyx_t_1, 0, 0);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Classification.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 65: 
-
 66: cdef class ModifiedHuber(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
-
-
 67:     """Modified Huber loss function for binary
-
 68:     classification tasks with y in {-1,1}.
-
 69:     Its equivalent to quadratically smoothed SVM
-
 70:     with gamma = 2.
-
 71: 
-
 72:     See T. Zhang 'Solving
-
 73:     Large Scale Linear Prediction Problems Using
-
 74:     Stochastic Gradient Descent', ICML'04.
-
 75:     """
-
 76:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __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 = 76; __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 = 76; __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 = 76; __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 = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 76; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 77:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 78:         if z >= 1:
-
-    __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
-
 79:             return 0
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 80:         elif z >= -1:
-
-    __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
-
 81:             return (1-z) * (1-z)
-
-        __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z));
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 82:         else:
-
 83:             return -4*z
-
-        __pyx_r = (-4 * __pyx_v_z);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 84: 
-
 85:     cpdef double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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;}
-      }
-    }
-    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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 86:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 87:         if z >= 1:
-
-    __pyx_t_6 = (__pyx_v_z >= 1);
-  if (__pyx_t_6) {
-
 88:             return 0
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 89:         elif z >= -1:
-
-    __pyx_t_6 = (__pyx_v_z >= -1);
-  if (__pyx_t_6) {
-
 90:             return 2*(1-z)*y
-
-        __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 91:         else:
-
 92:             return 4*y
-
-        __pyx_r = (4 * __pyx_v_y);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 93: 
-
 94:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 95:         return ModifiedHuber,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 95; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 96: 
-
 97: cdef class Hinge(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_Hinge {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
-
-
 98:     """SVM classification loss for binary
-
 99:     classification tasks with y in {-1,1}.
-
 100:     """
-
 101:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __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 = 101; __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 = 101; __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 = 101; __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 = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 102:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 103:         if z < 1.0:
-
-    __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
-
 104:             return (1 - z)
-
-        __pyx_r = (1 - __pyx_v_z);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 105:         return 0
-
-    __pyx_r = 0;
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 106:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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, 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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 107:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 108:         if z < 1.0:
-
-    __pyx_t_6 = (__pyx_v_z < 1.0);
-  if (__pyx_t_6) {
-
 109:             return y
-
-        __pyx_r = __pyx_v_y;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 110:         return 0
-
-    __pyx_r = 0;
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 111: 
-
 112:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 113:         return Hinge,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Hinge.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 114: 
-
 115: 
-
 116: cdef class Log(Classification):
-
-struct __pyx_obj_15sgd_fast_sparse_Log {
-  struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
-};
-
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Classification __pyx_base;
-};
-
 117:     """Logistic regression loss for binary classification
-
 118:     tasks with y in {-1,1}.
-
 119:     """
-
 120:     cpdef double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __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 = 120; __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 = 120; __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 = 120; __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 = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 121:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 122:         if z > 18:
-
-    __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
-
 123:             return exp(-z)
-
-        __pyx_r = exp((-__pyx_v_z));
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 124:         if z < -18:
-
-    __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
-
 125:             return -z * y
-
-        __pyx_r = ((-__pyx_v_z) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L4;
-  }
-  __pyx_L4:;
-
 126:         return log(1.0+exp(-z))
-
-    __pyx_r = log((1.0 + exp((-__pyx_v_z))));
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 127: 
-
 128:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __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 = 128; __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 = 128; __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 = 128; __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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 129:         cdef double z = p*y
-
-    __pyx_v_z = (__pyx_v_p * __pyx_v_y);
-
 130:         if z > 18:
-
-    __pyx_t_6 = (__pyx_v_z > 18);
-  if (__pyx_t_6) {
-
 131:             return exp(-z) * y
-
-        __pyx_r = (exp((-__pyx_v_z)) * __pyx_v_y);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
-
 132:         if z < -18:
-
-    __pyx_t_6 = (__pyx_v_z < -18);
-  if (__pyx_t_6) {
-
 133:             return y
-
-        __pyx_r = __pyx_v_y;
-    goto __pyx_L0;
-    goto __pyx_L4;
-  }
-  __pyx_L4:;
-
 134:         return y / (exp(z) + 1.0)
-
-    __pyx_t_5 = (exp(__pyx_v_z) + 1.0);
-  if (unlikely(__pyx_t_5 == 0)) {
-    PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_r = (__pyx_v_y / __pyx_t_5);
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 135: 
-
 136:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 137:         return Log,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Log.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 138: 
-
 139: cdef class SquaredError(Regression):
-
-struct __pyx_obj_15sgd_fast_sparse_SquaredError {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
-
-
 140:     """
-
 141:     """
-
 142:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __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 = 142; __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 = 142; __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 = 142; __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 = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); 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_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 143:         return 0.5 * (p-y) * (p-y)
-
-    __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 144:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __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 = 144; __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 = 144; __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 = 144; __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 = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 145:         return y - p
-
-    __pyx_r = (__pyx_v_y - __pyx_v_p);
-  goto __pyx_L0;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.SquaredError.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 146: 
-
 147:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 148:         return SquaredError,()
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));
-  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 149: 
-
 150: cdef class Huber(Regression):
-
-struct __pyx_obj_15sgd_fast_sparse_Huber {
-  struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
-  double c;
-};
-
-struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
-  struct __pyx_vtabstruct_15sgd_fast_sparse_Regression __pyx_base;
-};
-static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
-
-
 151:     """
-
 152:     """
-
 153:     cdef double c
-
 154:     def __init__(self,c):
-
-static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyObject *__pyx_v_c = 0;
-  int __pyx_r;
-  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};
-    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 = 154; __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:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
-  return -1;
-  __pyx_L4_argument_unpacking_done:;
-
 155:         self.c = c
-
-    __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
-  __pyx_r = -1;
-  __pyx_L0:;
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 156:     cpdef  double loss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __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 = 156; __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 = 156; __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 = 156; __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 = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 157:         cdef double r = p-y
-
-    __pyx_v_r = (__pyx_v_p - __pyx_v_y);
-
 158:         cdef double abs_r = abs(r)
-
-    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __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 = 158; __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 = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
-
 159:         if abs_r <= self.c:
-
-    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
-
 160:             return 0.5 * r * r
-
-        __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 161:         else:
-
 162:             return self.c * abs_r - (0.5*self.c*self.c)
-
-        __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 163: 
-
 164:     cpdef  double dloss(self,double p,double y):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  double __pyx_v_p;
-  double __pyx_v_y;
-  PyObject *__pyx_r = NULL;
-  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};
-    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 = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 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:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 165:         cdef double r = y - p
-
-    __pyx_v_r = (__pyx_v_y - __pyx_v_p);
-
 166:         cdef double abs_r = abs(r)
-
-    __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __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 = 166; __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 = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_abs_r = __pyx_t_5;
-
 167:         if abs_r <= self.c:
-
-    __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
-  if (__pyx_t_6) {
-
 168:             return r
-
-        __pyx_r = __pyx_v_r;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-
 169:         elif r > 0:
-
-    __pyx_t_6 = (__pyx_v_r > 0);
-  if (__pyx_t_6) {
-
 170:             return self.c
-
-        __pyx_r = __pyx_v_self->c;
-    goto __pyx_L0;
-    goto __pyx_L3;
-  }
-  /*else*/ {
-
 171:         else:
-
 172:             return -self.c
-
-        __pyx_r = (-__pyx_v_self->c);
-    goto __pyx_L0;
-  }
-  __pyx_L3:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
-  __pyx_r = 0;
-  __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 173: 
-
 174:     def __reduce__(self):
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
-  PyObject *__pyx_r = NULL;
-  __Pyx_RefNannySetupContext("__reduce__");
-
 175:         return Huber,(self.c,)
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
-  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_1;
-  __pyx_t_1 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("sgd_fast_sparse.Huber.__reduce__");
-  __pyx_r = NULL;
-  __pyx_L0:;
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 176: 
-
 177: @cython.boundscheck(False)
-
 178: @cython.wraparound(False)
-
 179: @cython.cdivision(True)
-
 180: def plain_sgd(np.ndarray[DOUBLE, ndim=1] w,
-
-static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n\n    \n    ";
-static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
-  PyArrayObject *__pyx_v_w = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_intercept;
-  struct __pyx_obj_15sgd_fast_sparse_LossFunction *__pyx_v_loss = 0;
-  int __pyx_v_penalty_type;
-  double __pyx_v_alpha;
-  double __pyx_v_rho;
-  PyArrayObject *__pyx_v_X_data = 0;
-  PyArrayObject *__pyx_v_X_indices = 0;
-  PyArrayObject *__pyx_v_X_indptr = 0;
-  PyArrayObject *__pyx_v_y = 0;
-  int __pyx_v_n_iter;
-  int __pyx_v_fit_intercept;
-  int __pyx_v_verbose;
-  int __pyx_v_shuffle;
-  unsigned int __pyx_v_n_samples;
-  unsigned int __pyx_v_n_features;
-  PyArrayObject *__pyx_v_index = 0;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wscale;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_p;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_update;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_sumloss;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_wnorm;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_t;
-  unsigned int __pyx_v_count;
-  unsigned int __pyx_v_epoch;
-  unsigned int __pyx_v_i;
-  unsigned int __pyx_v_sample;
-  PyArrayObject *__pyx_v_q = 0;
-  double __pyx_v_u;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_typw;
-  __pyx_t_15sgd_fast_sparse_DOUBLE __pyx_v_eta0;
-  PyObject *__pyx_v_t_start;
-  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_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_q;
-  Py_ssize_t __pyx_bstride_0_q = 0;
-  Py_ssize_t __pyx_bshape_0_q = 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_w;
-  Py_ssize_t __pyx_bstride_0_w = 0;
-  Py_ssize_t __pyx_bshape_0_w = 0;
-  Py_buffer __pyx_bstruct_y;
-  Py_ssize_t __pyx_bstride_0_y = 0;
-  Py_ssize_t __pyx_bshape_0_y = 0;
-  PyObject *__pyx_r = NULL;
-  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,0};
-  __Pyx_RefNannySetupContext("plain_sgd");
-  __pyx_self = __pyx_self;
-  if (unlikely(__pyx_kwds)) {
-    Py_ssize_t kw_args = PyDict_Size(__pyx_kwds);
-    PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-    switch (PyTuple_GET_SIZE(__pyx_args)) {
-      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, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      }
-    }
-    if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
-    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 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 183; __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 = 184; __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 = 184; __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 = 189; __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 = 189; __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 = 190; __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 = 190; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  }
-  goto __pyx_L4_argument_unpacking_done;
-  __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-  __pyx_L3_error:;
-  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
-  return NULL;
-  __pyx_L4_argument_unpacking_done:;
-  __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __Pyx_INCREF((PyObject *)__pyx_v_loss);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_INCREF((PyObject *)__pyx_v_y);
-  __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
-  __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;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_y), __pyx_ptype_5numpy_ndarray, 1, "y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __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];
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_X_data, (PyObject*)__pyx_v_X_data, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_X_indices, (PyObject*)__pyx_v_X_indices, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_X_indptr, (PyObject*)__pyx_v_X_indptr, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __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_bstruct_y, (PyObject*)__pyx_v_y, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_bstride_0_y = __pyx_bstruct_y.strides[0];
-  __pyx_bshape_0_y = __pyx_bstruct_y.shape[0];
-
 181:               DOUBLE intercept,
-
 182:               LossFunction loss,
-
 183:               int penalty_type,
-
 184:               double alpha, double rho,
-
 185:               np.ndarray[DOUBLE, ndim=1] X_data,
-
 186:               np.ndarray[INTEGER, ndim=1] X_indices,
-
 187:               np.ndarray[INTEGER, ndim=1] X_indptr,
-
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
-  int __pyx_v_copy_shape;
-  int __pyx_v_i;
-  int __pyx_v_ndim;
-  int __pyx_v_endian_detector;
-  int __pyx_v_little_endian;
-  int __pyx_v_t;
-  char *__pyx_v_f;
-  PyArray_Descr *__pyx_v_descr = 0;
-  int __pyx_v_offset;
-  int __pyx_v_hasfields;
-  int __pyx_r;
-  __Pyx_RefNannySetupContext("__getbuffer__");
-  if (__pyx_v_info == NULL) return 0;
-  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
-  __Pyx_GIVEREF(__pyx_v_info->obj);
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
-
 188:               np.ndarray[DOUBLE, ndim=1] y,
-
 189:               int n_iter, int fit_intercept,
-
 190:               int verbose, int shuffle):
-
 191:     """Cython implementation of SGD with different loss functions and
-
 192:     penalties.
-
 193: 
-
-    __pyx_v_endian_detector = 1;
-
 194: 
-
-    __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
-
 195:     """
-
 196:     # get the data information into easy vars
-
-    __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
-
 197:     cdef unsigned int n_samples = y.shape[0]
-
-    __pyx_v_n_samples = (__pyx_v_y->dimensions[0]);
-
 198:     cdef unsigned int n_features = w.shape[0]
-
-    __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
-
-    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_1) {
-
 199: 
-
-        __pyx_v_copy_shape = 1;
-    goto __pyx_L5;
-  }
-  /*else*/ {
-
 200:     cdef np.ndarray[INTEGER, ndim=1, mode="c"] index = np.arange(n_samples) # FIXME unsined int?
-
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = ((PyArrayObject *)__pyx_t_1);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_index, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_INTEGER, 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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
-      __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
-    }
-  }
-  __pyx_t_4 = 0;
-  __pyx_v_index = ((PyArrayObject *)__pyx_t_1);
-  __pyx_t_1 = 0;
-
 201:     cdef DOUBLE wscale = 1.0
-
-    __pyx_v_wscale = 1.0;
-
-        __pyx_v_copy_shape = 0;
-  }
-  __pyx_L5:;
-
 202:     cdef DOUBLE eta = 0.0
-
-    __pyx_v_eta = 0.0;
-
 203:     cdef DOUBLE p = 0.0
-
-    __pyx_v_p = 0.0;
-
-    __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
-  if (__pyx_t_1) {
-
 204:     cdef DOUBLE update = 0.0
-
-    __pyx_v_update = 0.0;
-
-        __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_C_CONTIGUOUS));
-    __pyx_t_3 = __pyx_t_2;
-  } else {
-    __pyx_t_3 = __pyx_t_1;
-  }
-  if (__pyx_t_3) {
-
 205:     cdef DOUBLE sumloss = 0.0
-
-    __pyx_v_sumloss = 0.0;
-
-        __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
-    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_Raise(__pyx_t_5, 0, 0);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
-
 206:     cdef DOUBLE wnorm = 0.0
-
-    __pyx_v_wnorm = 0.0;
-
 207:     cdef DOUBLE t = 0.0
-
-    __pyx_v_t = 0.0;
-
-    __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
-  if (__pyx_t_3) {
-
 208:     cdef unsigned int count = 0
-
-    __pyx_v_count = 0;
-
-        __pyx_t_1 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_v_self), NPY_F_CONTIGUOUS));
-    __pyx_t_2 = __pyx_t_1;
-  } else {
-    __pyx_t_2 = __pyx_t_3;
-  }
-  if (__pyx_t_2) {
-
 209:     cdef unsigned int epoch = 0
-
-    __pyx_v_epoch = 0;
-
-        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
-    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
-    __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
-    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __Pyx_Raise(__pyx_t_4, 0, 0);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L7;
-  }
-  __pyx_L7:;
-
 210:     cdef unsigned int i = 0
-
-    __pyx_v_i = 0;
-
 211:     cdef unsigned int sample = 0
-
-    __pyx_v_sample = 0;
-
-    __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
-
 212: 
-
-    __pyx_v_info->ndim = __pyx_v_ndim;
-
 213:     cdef np.ndarray[DOUBLE, ndim=1, mode="c"] q = np.zeros((n_features,),
-
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__zeros); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_features); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __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 = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__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(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-
-    __pyx_t_6 = __pyx_v_copy_shape;
-  if (__pyx_t_6) {
-
 214:                                                            dtype = np.float64,
-
-    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_6 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__float64); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__dtype), __pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_6 = PyEval_CallObjectWithKeywords(__pyx_t_3, __pyx_t_1, ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_q, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_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 = 213; __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_v_q = ((PyArrayObject *)__pyx_t_6);
-  __pyx_t_6 = 0;
-
 215:                                                            order = "c" )
-
 216:     cdef double u = 0.0
-
-    __pyx_v_u = 0.0;
-
-        __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
-
 217:     # computing eta0
-
-        __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
-
 218:     cdef DOUBLE typw = sqrt(1.0 / sqrt(alpha))
-
-    __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
-
-        __pyx_t_6 = __pyx_v_ndim;
-    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
-      __pyx_v_i = __pyx_t_7;
-
 219:     cdef DOUBLE eta0 = typw /max(1.0, loss.dloss(-typw, 1.0))
-
-    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_typw); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_2 = PyFloat_FromDouble(1.0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)); 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_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_2 = 0;
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_max, __pyx_t_3, 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_8 == (npy_float64)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_v_eta0 = __pyx_t_8;
-
-            (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
-
 220:     t = 1.0 / (eta0 * alpha)
-
-    __pyx_v_t = (1.0 / ((double)(__pyx_v_eta0 * __pyx_v_alpha)));
-
-            (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
-    }
-    goto __pyx_L8;
-  }
-  /*else*/ {
-
 221:     t_start = time()
-
-    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(__pyx_v_t_start);
-  __pyx_v_t_start = __pyx_t_1;
-  __pyx_t_1 = 0;
-
 222:     for epoch from 0 <= epoch < n_iter:
-
-    __pyx_t_9 = __pyx_v_n_iter;
-  for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
-
-        __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
-
 223:         if verbose > 0:
-
-        __pyx_t_10 = (__pyx_v_verbose > 0);
-    if (__pyx_t_10) {
-
-        __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_v_self)));
-  }
-  __pyx_L8:;
-
 224:             print("-- Epoch %d" % (epoch + 1))
-
-            __pyx_t_1 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      if (__Pyx_PrintOne(__pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      goto __pyx_L8;
-    }
-    __pyx_L8:;
-
-    __pyx_v_info->suboffsets = NULL;
-
 225:         if shuffle:
-
-        __pyx_t_11 = __pyx_v_shuffle;
-    if (__pyx_t_11) {
-
-    __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
-
 226:             np.random.shuffle(index)
-
-            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__random); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_INCREF(((PyObject *)__pyx_v_index));
-      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_index));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_index));
-      __pyx_t_6 = PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      goto __pyx_L9;
-    }
-    __pyx_L9:;
-
-    __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
-
 227:         for i from 0 <= i < n_samples:
-
-        __pyx_t_12 = __pyx_v_n_samples;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_12; __pyx_v_i++) {
-
 228:             sample = index[i]
-
-            __pyx_t_13 = __pyx_v_i;
-      __pyx_v_sample = (*__Pyx_BufPtrCContig1d(__pyx_t_15sgd_fast_sparse_INTEGER *, __pyx_bstruct_index.buf, __pyx_t_13, __pyx_bstride_0_index));
-
 229:             eta = 1.0 / (alpha * t)
-
-            __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
-
-    __pyx_v_f = NULL;
-
 230:             p = 0.0#(dot(wdata, xdata, xnnz) * wscale) + intercept
-
-            __pyx_v_p = 0.0;
-
-    __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
-  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
-
 231:             sumloss += loss.loss(p,y)
-
-            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0);
-
 232:             update = eta * loss.dloss(p,y)
-
-            __pyx_t_14 = __pyx_PyFloat_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_t_14, 0));
-
 233:             if update != 0:
-
-            __pyx_t_10 = (__pyx_v_update != 0);
-      if (__pyx_t_10) {
-
 234:                 #add(wdata, wscale, xdata,
-
-    __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
-
 235:                 #    xnnz,update)
-
 236:                 if fit_intercept == 1:
-
-                __pyx_t_10 = (__pyx_v_fit_intercept == 1);
-        if (__pyx_t_10) {
-
-    __pyx_t_2 = (!__pyx_v_hasfields);
-  if (__pyx_t_2) {
-    __pyx_t_3 = (!__pyx_v_copy_shape);
-    __pyx_t_1 = __pyx_t_3;
-  } else {
-    __pyx_t_1 = __pyx_t_2;
-  }
-  if (__pyx_t_1) {
-
 237:                     intercept += update * 0.01
-
-                    __pyx_v_intercept += (__pyx_v_update * 0.01);
-          goto __pyx_L13;
-        }
-        __pyx_L13:;
-        goto __pyx_L12;
-      }
-      __pyx_L12:;
-
 238:             if penalty_type != L1:
-
-            __pyx_t_10 = (__pyx_v_penalty_type != 1);
-      if (__pyx_t_10) {
-
-        __Pyx_INCREF(Py_None);
-    __Pyx_GIVEREF(Py_None);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = Py_None;
-    goto __pyx_L11;
-  }
-  /*else*/ {
-
 239:                 wscale *= (1 - rho * eta * alpha)
-
-                __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
-
 240:                 if wscale < 1e-9:
-
-                __pyx_t_10 = (__pyx_v_wscale < 1.0000000000000001e-09);
-        if (__pyx_t_10) {
-
 241:                     w*=wscale
-
-                    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-          __pyx_t_15 = ((PyArrayObject *)__pyx_t_1);
-          {
-            __Pyx_BufFmt_StackElem __pyx_stack[1];
-            __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-            __pyx_t_11 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-            if (unlikely(__pyx_t_11 < 0)) {
-              PyErr_Fetch(&__pyx_t_16, &__pyx_t_17, &__pyx_t_18);
-              if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
-                Py_XDECREF(__pyx_t_16); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_18);
-                __Pyx_RaiseBufferFallbackError();
-              } else {
-                PyErr_Restore(__pyx_t_16, __pyx_t_17, __pyx_t_18);
-              }
-            }
-            __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
-            __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          }
-          __pyx_t_15 = 0;
-          __Pyx_DECREF(((PyObject *)__pyx_v_w));
-          __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
-          __pyx_t_1 = 0;
-
-        __Pyx_INCREF(__pyx_v_self);
-    __Pyx_GIVEREF(__pyx_v_self);
-    __Pyx_GOTREF(__pyx_v_info->obj);
-    __Pyx_DECREF(__pyx_v_info->obj);
-    __pyx_v_info->obj = __pyx_v_self;
-  }
-  __pyx_L11:;
-
 242:                     wscale = 1.0
-
-                    __pyx_v_wscale = 1.0;
-          goto __pyx_L15;
-        }
-        __pyx_L15:;
-        goto __pyx_L14;
-      }
-      __pyx_L14:;
-
 243:             if penalty_type == L2 or penalty_type == ELASTICNET:
-
-            switch (__pyx_v_penalty_type) {
-        case 2:
-        case 3:
-
-    __pyx_t_1 = (!__pyx_v_hasfields);
-  if (__pyx_t_1) {
-
 244:                 u += ((1.0 - rho) * eta * alpha)
-
-                __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
-        break;
-      }
-
-        __pyx_v_t = __pyx_v_descr->type_num;
-
 245:                 #l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
-
-        __pyx_t_1 = (__pyx_v_descr->byteorder == '>');
-    if (__pyx_t_1) {
-      __pyx_t_2 = __pyx_v_little_endian;
-    } else {
-      __pyx_t_2 = __pyx_t_1;
-    }
-    if (!__pyx_t_2) {
-
 246:             t += 1
-
-            __pyx_v_t += 1;
-
-            __pyx_t_1 = (__pyx_v_descr->byteorder == '<');
-      if (__pyx_t_1) {
-        __pyx_t_3 = (!__pyx_v_little_endian);
-        __pyx_t_8 = __pyx_t_3;
-      } else {
-        __pyx_t_8 = __pyx_t_1;
-      }
-      __pyx_t_1 = __pyx_t_8;
-    } else {
-      __pyx_t_1 = __pyx_t_2;
-    }
-    if (__pyx_t_1) {
-
 247:             count += 1
-
-            __pyx_v_count += 1;
-    }
-
-            __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
-      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_Raise(__pyx_t_5, 0, 0);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L13;
-    }
-    __pyx_L13:;
-
 248:         # report epoche information
-
-        __pyx_t_1 = (__pyx_v_t == NPY_BYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__b;
-      goto __pyx_L14;
-    }
-
 249:         if verbose > 0:
-
-        __pyx_t_10 = (__pyx_v_verbose > 0);
-    if (__pyx_t_10) {
-
-        __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__B;
-      goto __pyx_L14;
-    }
-
 250:             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
-
-            __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dot); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__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 = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__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));
-      __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_w));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_3 = PyObject_Call(__pyx_t_6, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyNumber_Multiply(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = PyNumber_Multiply(__pyx_t_6, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_14 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_14 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_v_wnorm = sqrt(__pyx_t_14);
-
-        __pyx_t_1 = (__pyx_v_t == NPY_SHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__h;
-      goto __pyx_L14;
-    }
-
 251:             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 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_w), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__shape); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_6, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyFloat_FromDouble((((double)__pyx_v_sumloss) / ((double)__pyx_v_count))); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_3);
-      __Pyx_GIVEREF(__pyx_t_3);
-      PyTuple_SET_ITEM(__pyx_t_19, 1, __pyx_t_1);
-      __Pyx_GIVEREF(__pyx_t_1);
-      PyTuple_SET_ITEM(__pyx_t_19, 2, __pyx_t_6);
-      __Pyx_GIVEREF(__pyx_t_6);
-      PyTuple_SET_ITEM(__pyx_t_19, 3, __pyx_t_2);
-      __Pyx_GIVEREF(__pyx_t_2);
-      PyTuple_SET_ITEM(__pyx_t_19, 4, __pyx_t_5);
-      __Pyx_GIVEREF(__pyx_t_5);
-      __pyx_t_3 = 0;
-      __pyx_t_1 = 0;
-      __pyx_t_6 = 0;
-      __pyx_t_2 = 0;
-      __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_USHORT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__H;
-      goto __pyx_L14;
-    }
-
 252:             print("Total training time: %.2f seconds." % (time()-t_start))
-
-            __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyNumber_Subtract(__pyx_t_19, __pyx_v_t_start); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __pyx_t_19 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 252; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      goto __pyx_L16;
-    }
-    __pyx_L16:;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_INT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__i;
-      goto __pyx_L14;
-    }
-
 253: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_UINT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__I;
-      goto __pyx_L14;
-    }
-
 254:         # floating-point under-/overflow check.
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__l;
-      goto __pyx_L14;
-    }
-
 255:         if np.any(np.isinf(w)) or np.any(np.isnan(w)) or np.isnan(intercept) or np.isinf(intercept):
-
-        __pyx_t_19 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_5 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__any); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_5);
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_19, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__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_6 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __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 = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_19);
-    PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_6);
-    __Pyx_GIVEREF(__pyx_t_6);
-    __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_6);
-    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    if (!__pyx_t_10) {
-      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_INCREF(((PyObject *)__pyx_v_w));
-      PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
-      __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_2 = PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
-      __Pyx_GIVEREF(__pyx_t_2);
-      __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (!__pyx_t_20) {
-        __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_6 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_6);
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_19);
-        PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_2);
-        __Pyx_GIVEREF(__pyx_t_2);
-        __pyx_t_2 = 0;
-        __pyx_t_2 = PyObject_Call(__pyx_t_6, __pyx_t_19, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-        __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-        __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        if (!__pyx_t_21) {
-          __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_19 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_19);
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_6);
-          PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
-          __Pyx_GIVEREF(__pyx_t_2);
-          __pyx_t_2 = 0;
-          __pyx_t_2 = PyObject_Call(__pyx_t_19, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-          __pyx_t_23 = __pyx_t_22;
-        } else {
-          __pyx_t_23 = __pyx_t_21;
-        }
-        __pyx_t_21 = __pyx_t_23;
-      } else {
-        __pyx_t_21 = __pyx_t_20;
-      }
-      __pyx_t_20 = __pyx_t_21;
-    } else {
-      __pyx_t_20 = __pyx_t_10;
-    }
-    if (__pyx_t_20) {
-
-        __pyx_t_1 = (__pyx_v_t == NPY_ULONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__L;
-      goto __pyx_L14;
-    }
-
 256:             raise ValueError("floating-point under-/overflow occured.")
-
-            __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
-      __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
-      PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_kp_s_4));
-      __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_6 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_Raise(__pyx_t_6, 0, 0);
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L17;
-    }
-    __pyx_L17:;
-  }
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__q;
-      goto __pyx_L14;
-    }
-
 257: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Q;
-      goto __pyx_L14;
-    }
-
 258:     w *= wscale
-
-    __pyx_t_6 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __pyx_t_2 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-  __pyx_t_15 = ((PyArrayObject *)__pyx_t_2);
-  {
-    __Pyx_BufFmt_StackElem __pyx_stack[1];
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_15, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-    if (unlikely(__pyx_t_9 < 0)) {
-      PyErr_Fetch(&__pyx_t_18, &__pyx_t_17, &__pyx_t_16);
-      if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_nn___pyx_t_15sgd_fast_sparse_DOUBLE, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
-        Py_XDECREF(__pyx_t_18); Py_XDECREF(__pyx_t_17); Py_XDECREF(__pyx_t_16);
-        __Pyx_RaiseBufferFallbackError();
-      } else {
-        PyErr_Restore(__pyx_t_18, __pyx_t_17, __pyx_t_16);
-      }
-    }
-    __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 = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  }
-  __pyx_t_15 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_v_w));
-  __pyx_v_w = ((PyArrayObject *)__pyx_t_2);
-  __pyx_t_2 = 0;
-
-        __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__f;
-      goto __pyx_L14;
-    }
-
 259:     return w, intercept
-
-    __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_6);
-  __Pyx_INCREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_w));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2);
-  __Pyx_GIVEREF(__pyx_t_2);
-  __pyx_t_2 = 0;
-  __pyx_r = __pyx_t_6;
-  __pyx_t_6 = 0;
-  goto __pyx_L0;
-
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_1);
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_XDECREF(__pyx_t_6);
-  __Pyx_XDECREF(__pyx_t_19);
-  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
-    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
-  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
-  __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
-  __pyx_r = NULL;
-  goto __pyx_L2;
-  __pyx_L0:;
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_index);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indices);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_indptr);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_q);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_X_data);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-  __Pyx_SafeReleaseBuffer(&__pyx_bstruct_y);
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_index);
-  __Pyx_XDECREF((PyObject *)__pyx_v_q);
-  __Pyx_DECREF(__pyx_v_t_start);
-  __Pyx_DECREF((PyObject *)__pyx_v_w);
-  __Pyx_DECREF((PyObject *)__pyx_v_loss);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_DECREF((PyObject *)__pyx_v_y);
-  __Pyx_XGIVEREF(__pyx_r);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
-        __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__d;
-      goto __pyx_L14;
-    }
-
 260: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__g;
-      goto __pyx_L14;
-    }
-
 261: 
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zf;
-      goto __pyx_L14;
-    }
-
 262: ## # ----------------------------------------
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zd;
-      goto __pyx_L14;
-    }
-
 263: ## # Python function for external prediction
-
-        __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__Zg;
-      goto __pyx_L14;
-    }
-
 264: ## # ----------------------------------------
-
-        __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);
-    if (__pyx_t_1) {
-      __pyx_v_f = __pyx_k__O;
-      goto __pyx_L14;
-    }
-    /*else*/ {
-
 265: ## def predict(np.ndarray x, np.ndarray w,
-
 266: ##             double bias):
-
-            __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
-      __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_Raise(__pyx_t_4, 0, 0);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-    __pyx_L14:;
-
 267: ##     """Computes x*w + b efficiently.
-
-        __pyx_v_info->format = __pyx_v_f;
-
 268: 
-
-        __pyx_r = 0;
-    goto __pyx_L0;
-    goto __pyx_L12;
-  }
-  /*else*/ {
-
 269: ##     :arg x: the instance represented as a sparse vector.
-
 270: ##     :type x: np.ndarray(dtype=bolt.sparsedtype)
-
-        __pyx_v_info->format = ((char *)malloc(255));
-
 271: ##     :arg w: the weight vector represented as a dense vector.
-
-        (__pyx_v_info->format[0]) = '^';
-
 272: ##     :type w: np.ndarray(dtype=bolt.densedtype)
-
-        __pyx_v_offset = 0;
-
 273: ##     :arg b: the bias term (aka offset or intercept).
-
 274: ##     :type b: float
-
 275: ##     :returns: A double representing `x*w + b`.
-
-        __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_v_f = __pyx_t_9;
-
 276: ##     """
-
-        (__pyx_v_f[0]) = 0;
-  }
-  __pyx_L12:;
-
-  __pyx_r = 0;
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_4);
-  __Pyx_XDECREF(__pyx_t_5);
-  __Pyx_AddTraceback("numpy.ndarray.__getbuffer__");
-  __pyx_r = -1;
-  __Pyx_GOTREF(__pyx_v_info->obj);
-  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;
-  goto __pyx_L2;
-  __pyx_L0:;
-  if (__pyx_v_info->obj == Py_None) {
-    __Pyx_GOTREF(Py_None);
-    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;
-  }
-  __pyx_L2:;
-  __Pyx_XDECREF((PyObject *)__pyx_v_descr);
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-  return __pyx_r;
-}
-
 277: ##     cdef int xnnz = x.shape[0]
-
 278: ##     cdef int wdim = w.shape[0]
-
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
-  __Pyx_RefNannySetupContext("__releasebuffer__");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
-
 279: ##     cdef double y = 0.0
-
-    __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
-  if (__pyx_t_1) {
-
 280: ##     if xnnz == 0:
-
-        free(__pyx_v_info->format);
-    goto __pyx_L5;
-  }
-  __pyx_L5:;
-
 281: ##         y = bias
-
-    __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
-  if (__pyx_t_1) {
-
 282: ##     else:
-
-        free(__pyx_v_info->strides);
-    goto __pyx_L6;
-  }
-  __pyx_L6:;
-
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
-  __Pyx_RefNannyFinishContext();
-}
-
 283: ##         y = dot_checked(<double *>w.data,<Pair *>x.data,xnnz,wdim) + bias
-
 284: ##     return y
-
 285: 
-
 286: ##  # ----------------------------------------
-
 287: ##  # C functions for fast sparse-dense vector operations
-
 288: ##  # ----------------------------------------
-
 289: 
-
 290: ## cdef struct Pair:
-
 291: ##     np.uint32_t idx
-
 292: ##     np.float32_t val
-
 293: 
-
 294: ## cdef inline double max(double a, double b):
-
 295: ##     return a if a >= b else b
-
 296: 
-
 297: ## cdef inline double min(double a, double b):
-
 298: ##     return a if a <= b else b
-
 299: 
-
 300: ## cdef double dot(double *w, Pair *x, int nnz):
-
 301: ##     """Dot product of weight vector w and example x.
-
 302: ##     """
-
 303: ##     cdef double sum = 0.0
-
 304: ##     cdef Pair pair
-
 305: ##     cdef int i
-
 306: ##     for i from 0 <= i < nnz:
-
 307: ##         pair = x[i]
-
 308: ##         sum += w[pair.idx] * pair.val
-
 309: ##     return sum
-
 310: 
-
 311: ## cdef double dot_checked(double *w, Pair *x, int nnz, int wdim):
-
 312: ##     """ Checked version of dot product. Ignores features in x
-
 313: ##     with a higher index than dimension of w.
-
 314: ##     """
-
 315: ##     cdef double sum = 0.0
-
 316: ##     cdef Pair pair
-
 317: ##     cdef int i
-
 318: ##     for i from 0 <= i < nnz:
-
 319: ##         pair = x[i]
-
 320: ##         if pair.idx < wdim:
-
 321: ##             sum +=w[pair.idx]*pair.val
-
 322: ##     return sum
-
 323: 
-
 324: ## cdef double add(double *w, double wscale, Pair *x, int nnz, double c):
-
 325: ##     """Scales example x by constant c and adds it to the weight vector w.
-
 326: ##     """
-
 327: ##     cdef Pair pair
-
 328: ##     cdef int i
-
 329: ##     cdef double innerprod = 0.0
-
 330: ##     cdef double xsqnorm = 0.0
-
 331: ##     for i from 0 <= i < nnz:
-
 332: ##         pair = x[i]
-
 333: ##         innerprod += (w[pair.idx] * pair.val)
-
 334: ##         xsqnorm += (pair.val*pair.val)
-
 335: ##         w[pair.idx] += pair.val * (c / wscale)
-
 336: 
-
 337: ##     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
-
 338: 
-
 339: ## # ----------------------------------------
-
 340: ## # Extension type for Stochastic Gradient Descent
-
 341: ## # ----------------------------------------
-
 342: 
-
 343: ## cdef class SGD:
-
 344: 
-
 345: ##     cdef int epochs
-
 346: ##     cdef double reg
-
 347: ##     cdef LossFunction loss
-
 348: ##     cdef int norm
-
 349: ##     cdef double alpha
-
 350: 
-
 351: ##     def __init__(self, loss, reg, epochs = 5, norm = 2, alpha = 0.85):
-
 352: ##         """
-
 353: 
-
 354: ##         :arg loss: The :class:`LossFunction` (default ModifiedHuber) .
-
 355: ##         :arg reg: The regularization parameter lambda (>0).
-
 356: ##         :type reg: float.
-
 357: ##         :arg epochs: The number of iterations through the dataset.
-
 358: ##         :type epochs: int
-
 359: ##         :arg norm: Whether to minimize the L1, L2 norm or the Elastic Net.
-
 360: ##         :type norm: 1 or 2 or 3
-
 361: ##         :arg alpha: The elastic net penality parameter. A value of 1 amounts to L2 regularization whereas a value of 0 gives L1 penalty.
-
 362: ##         :type alpha: float (0 <= alpha <= 1)
-
 363: ##         """
-
 364: ##         if loss == None:
-
 365: ##             raise ValueError("Loss function must not be None.")
-
 366: ##         if reg < 0.0:
-
 367: ##             raise ValueError("reg must be larger than 0. ")
-
 368: ##         if norm not in [1,2,3]:
-
 369: ##             raise ValueError("norm must be in {1,2,3}. ")
-
 370: ##         if alpha > 1.0 or alpha < 0.0:
-
 371: ##             raise ValueError("alpha must be in [0,1]. ")
-
 372: ##         self.loss = loss
-
 373: ##         self.reg = reg
-
 374: ##         self.epochs = epochs
-
 375: ##         self.norm = norm
-
 376: ##         self.alpha = alpha
-
 377: 
-
 378: ##     def __reduce__(self):
-
 379: ##         return SGD,(self.loss,self.reg, self.epochs, self.norm, self.alpha)
-
 380: 
-
 381: ##     def train(self, model, dataset, verbose = 0, shuffle = False):
-
 382: ##         """Train `model` on the `dataset` using SGD.
-
 383: 
-
 384: ##         :arg model: The :class:`bolt.model.LinearModel` that is going to be trained.
-
 385: ##         :arg dataset: The :class:`bolt.io.Dataset`.
-
 386: ##         :arg verbose: The verbosity level. If 0 no output to stdout.
-
 387: ##         :arg shuffle: Whether or not the training data should be shuffled after each epoch.
-
 388: ##         """
-
 389: ##         self._train(model, dataset, verbose, shuffle)
-
 390: 
-
 391: ##     cdef void _train(self,model, dataset, verbose, shuffle):
-
 392: 
-
 393: ##         cdef LossFunction loss = self.loss
-
 394: ##         cdef int m = model.m
-
 395: ##         cdef int n = dataset.n
-
 396: ##         cdef double reg = self.reg
-
 397: 
-
 398: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] w = model.w
-
 399: ##         # weight vector w as c array
-
 400: ##         cdef double *wdata = <double *>w.data
-
 401: ##         # the scale of w
-
 402: ##         cdef double wscale = 1.0
-
 403: 
-
 404: ##         # training instance
-
 405: ##         cdef np.ndarray x = None
-
 406: ##         cdef Pair *xdata = NULL
-
 407: 
-
 408: ##         cdef double y = 0.0
-
 409: 
-
 410: ##         # Variables for penalty term
-
 411: ##         cdef int norm = self.norm
-
 412: ##         cdef np.ndarray[np.float64_t, ndim=1, mode="c"] q = None
-
 413: ##         cdef double *qdata = NULL
-
 414: ##         cdef double u = 0.0
-
 415: ##         if norm == 1 or norm == 3:
-
 416: ##             q = np.zeros((m,), dtype = np.float64, order = "c" )
-
 417: ##             qdata = <double *>q.data
-
 418: 
-
 419: ##         cdef double alpha = 1.0
-
 420: ##         if norm == 1:
-
 421: ##             alpha = 0.0
-
 422: ##         elif norm == 3:
-
 423: ##             alpha = self.alpha
-
 424: 
-
 425: ##         # bias term (aka offset or intercept)
-
 426: ##         cdef int usebias = 1
-
 427: ##         if model.biasterm == False:
-
 428: ##             usebias = 0
-
 429: 
-
 430: ##         cdef double b = 0.0,p = 0.0, wnorm = 0.0, t = 0.0, update = 0.0,sumloss = 0.0, eta = 0.0
-
 431: ##         cdef int xnnz = 0, count = 0, i = 0, e = 0
-
 432: 
-
 433: ##         # computing eta0
-
 434: ##         cdef double typw = sqrt(1.0 / sqrt(reg))
-
 435: ##         cdef double eta0 = typw /max(1.0,loss.dloss(-typw,1.0))
-
 436: ##         t = 1.0 / (eta0 * reg)
-
 437: ##         t1=time()
-
 438: ##         for e from 0 <= e < self.epochs:
-
 439: ##             if verbose > 0:
-
 440: ##                 print("-- Epoch %d" % (e+1))
-
 441: ##             if shuffle:
-
 442: ##                 dataset.shuffle()
-
 443: ##             for x,y in dataset:
-
 444: ##                 eta = 1.0 / (reg * t)
-
 445: ##                 xnnz = x.shape[0]
-
 446: ##                 xdata = <Pair *>x.data
-
 447: ##                 p = (dot(wdata, xdata, xnnz) * wscale) + b
-
 448: ##                 sumloss += loss.loss(p,y)
-
 449: ##                 update = eta * loss.dloss(p,y)
-
 450: ##                 if update != 0:
-
 451: ##                     add(wdata, wscale, xdata,
-
 452: ##                         xnnz,update)
-
 453: ##                     if usebias == 1:
-
 454: ##                         b += update * 0.01
-
 455: 
-
 456: ##                 if norm != 1:
-
 457: ##                     wscale *= (1 - alpha * eta * reg)
-
 458: ##                     if wscale < 1e-9:
-
 459: ##                         w*=wscale
-
 460: ##                         wscale = 1
-
 461: ##                 if norm == 1 or norm == 3:
-
 462: ##                     u += ((1-alpha) * eta * reg)
-
 463: ##                     l1penalty(wscale, wdata, qdata, xdata, xnnz, u)
-
 464: 
-
 465: ##                 t += 1
-
 466: ##                 count += 1
-
 467: 
-
 468: ##             # report epoche information
-
 469: ##             if verbose > 0:
-
 470: ##                 wnorm = sqrt(np.dot(w,w) * wscale * wscale)
-
 471: ##                 print("Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,w.nonzero()[0].shape[0],b,count,sumloss/count))
-
 472: ##                 print("Total training time: %.2f seconds." % (time()-t1))
-
 473: 
-
 474: ##         # floating-point under-/overflow check.
-
 475: ##         if np.any(np.isinf(w)) or np.any(np.isnan(w))or np.isnan(b) or np.isinf(b):
-
 476: ##             raise ValueError("floating-point under-/overflow occured.")
-
 477: ##         if norm == 3:
-
 478: ##             # FIXME rescale naive elastic net coefficient?
-
 479: ##             model.w = w * wscale #* (1.0 + alpha)
-
 480: ##         else:
-
 481: ##             model.w = w * wscale
-
 482: ##         model.bias = b
-
 483: 
-
 484: ## cdef void l1penalty(double wscale, double *w, double *q,
-
 485: ##                     Pair *x, int nnz, double u):
-
 486: ##     cdef double z = 0.0
-
 487: ##     cdef Pair pair
-
 488: ##     cdef int i,j
-
 489: ##     for i from 0 <= i < nnz:
-
 490: ##         pair = x[i]
-
 491: ##         j = pair.idx
-
 492: ##         z = w[j]
-
 493: ##         if (wscale * w[j]) > 0:
-
 494: ##             w[j] = max(0,w[j] - ((u + q[j])/wscale) )
-
 495: ##         elif (wscale * w[j]) < 0:
-
 496: ##             w[j] = min(0,w[j] + ((u - q[j])/wscale) )
-
 497: ##         q[j] += (wscale * (w[j] - z))
-
 498: 
-

diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index 56c4e65e193ca..aee69cded8d44 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -2,7 +2,6 @@
 # cython: cdivision=True
 # cython: boundscheck=False
 # cython: wraparound=False
-# filename: sgd.pyx
 #
 # Author: Peter Prettenhofer 
 #
@@ -54,17 +53,17 @@ cdef class LossFunction:
 
 cdef class Regression(LossFunction):
     """Base class for loss functions for regression."""
-    cpdef double loss(self,double p,double y):
+    cpdef double loss(self,double p, double y):
         raise NotImplementedError()
-    cpdef double dloss(self,double p,double y):
+    cpdef double dloss(self,double p, double y):
         raise NotImplementedError()
 
 
 cdef class Classification(LossFunction):
     """Base class for loss functions for classification."""
-    cpdef double loss(self,double p,double y):
+    cpdef double loss(self, double p, double y):
         raise NotImplementedError()
-    cpdef double dloss(self,double p,double y):
+    cpdef double dloss(self, double p, double y):
         raise NotImplementedError()
 
 cdef class ModifiedHuber(Classification):
@@ -77,7 +76,7 @@ cdef class ModifiedHuber(Classification):
     Large Scale Linear Prediction Problems Using
     Stochastic Gradient Descent', ICML'04.
     """
-    cpdef double loss(self,double p,double y):
+    cpdef double loss(self, double p,double y):
         cdef double z = p*y
         if z >= 1:
             return 0
@@ -86,7 +85,7 @@ cdef class ModifiedHuber(Classification):
         else:
             return -4*z
 
-    cpdef double dloss(self,double p,double y):
+    cpdef double dloss(self, double p, double y):
         cdef double z = p*y
         if z >= 1:
             return 0
@@ -102,12 +101,12 @@ cdef class Hinge(Classification):
     """SVM classification loss for binary
     classification tasks with y in {-1,1}.
     """
-    cpdef  double loss(self,double p,double y):
+    cpdef  double loss(self, double p, double y):
         cdef double z = p*y
         if z < 1.0:
             return (1 - z)
         return 0
-    cpdef  double dloss(self,double p,double y):
+    cpdef  double dloss(self, double p, double y):
         cdef double z = p*y
         if z < 1.0:
             return y
@@ -121,7 +120,7 @@ cdef class Log(Classification):
     """Logistic regression loss for binary classification
     tasks with y in {-1,1}.
     """
-    cpdef double loss(self,double p,double y):
+    cpdef double loss(self, double p, double y):
         cdef double z = p*y
         if z > 18:
             return exp(-z)
@@ -129,7 +128,7 @@ cdef class Log(Classification):
             return -z * y
         return log(1.0+exp(-z)) 
 
-    cpdef  double dloss(self,double p,double y):
+    cpdef  double dloss(self, double p, double y):
         cdef double z = p*y
         if z > 18:
             return exp(-z) * y
@@ -143,9 +142,9 @@ cdef class Log(Classification):
 cdef class SquaredError(Regression):
     """
     """
-    cpdef  double loss(self,double p,double y):
+    cpdef  double loss(self, double p, double y):
         return 0.5 * (p-y) * (p-y)
-    cpdef  double dloss(self,double p,double y):
+    cpdef  double dloss(self, double p, double y):
         return y - p
 
     def __reduce__(self):
@@ -157,7 +156,7 @@ cdef class Huber(Regression):
     cdef double c
     def __init__(self,c):
         self.c = c
-    cpdef  double loss(self,double p,double y):
+    cpdef  double loss(self, double p, double y):
         cdef double r = p-y
         cdef double abs_r = abs(r)
         if abs_r <= self.c:
@@ -165,7 +164,7 @@ cdef class Huber(Regression):
         else:
             return self.c * abs_r - (0.5*self.c*self.c)
 
-    cpdef  double dloss(self,double p,double y):
+    cpdef  double dloss(self, double p, double y):
         cdef double r = y - p 
         cdef double abs_r = abs(r)
         if abs_r <= self.c:
@@ -199,8 +198,7 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
     # get the data information into easy vars
     cdef unsigned int n_samples = Y.shape[0]
     cdef unsigned int n_features = w.shape[0]
-
-    # FIXME double to double
+    
     cdef double *w_data_ptr = w.data
     cdef double *X_data_ptr = X_data.data
     cdef int *X_indptr_ptr = X_indptr.data
@@ -208,7 +206,7 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
 
     # FIXME unsined int?
     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
-                                                                 dtype = np.int32)
+                                                             dtype = np.int32)
     cdef int *index_ptr = index.data
     cdef int offset = 0
     cdef int xnnz = 0
@@ -273,12 +271,16 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
         # 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, w.nonzero()[0].shape[0],
-                                                                                intercept, count, sumloss / count))
+            print("Norm: %.2f, NNZs: %d, "\
+            "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))
 
         # 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):
+        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
@@ -318,7 +320,9 @@ cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
 
 cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
                     int *X_indices_ptr, int offset, int xnnz, double u):
-    """Applys the L1 penalty. This implements the truncated gradient approach by [
+    """Applys the L1 penalty to each updated feature. 
+    This implements the truncated gradient approach by 
+    [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
     """
     cdef double z = 0.0
     cdef int j = 0
@@ -334,9 +338,15 @@ cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
                                                         / wscale) )
         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
 
-cdef void finall1penalty(double *w_data_ptr, double wscale, unsigned int n_features,
+cdef void finall1penalty(double *w_data_ptr, double wscale, 
+                         unsigned int n_features, 
                          double *q_data_ptr, double u):
-    """Applys the L1 penalty. This implements the truncated gradient approach by [
+    """Applys the L1 penalty to all feature. 
+    This implements the truncated gradient approach by 
+    [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
+
+    Experimental: this was proposed by Bob Carpenter (LingPipe). 
+    
     """
     cdef double z = 0.0
     cdef int j = 0
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index 094d62f7c8cbf..27a473f3bd9c7 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -6,8 +6,6 @@
 
 from nose.tools import assert_raises
 
-import bolt
-
 # test sample 1
 X = np.array([[-2, -1], [-1, -1], [-1, -2], [1, 1], [1, 2], [2, 1]])
 Y = [1, 1, 1, 2, 2, 2]
@@ -22,8 +20,10 @@
 true_result2 = [1, 2, 3]
 
 # test sample 3
-X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0], [0,0,1,0,0,0], [0,0,1,0,0,0],
-	       [0,0,0,0,1,1], [0,0,0,0,1,1], [0,0,0,1,0,0], [0,0,0,1,0,0]])
+X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0], 
+               [0,0,1,0,0,0], [0,0,1,0,0,0],
+	       [0,0,0,0,1,1], [0,0,0,0,1,1], 
+               [0,0,0,1,0,0], [0,0,0,1,0,0]])
 Y3 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 X4 = np.array([[1,0.9,0.8,0,0,0], [1,.84,.98,0,0,0],
@@ -32,17 +32,19 @@
 	       [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
 Y4 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
-X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0], [1,1,1,0,0,0], [1,1,1,0,0,0],
-	       [0,0,0,1,1,1], [0,0,0,1,1,1], [0,0,0,1,1,1], [0,0,0,1,1,1]])
+X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0], 
+               [1,1,1,0,0,0], [1,1,1,0,0,0],
+	       [0,0,0,1,1,1], [0,0,0,1,1,1], 
+               [0,0,0,1,1,1], [0,0,0,1,1,1]])
 Y5 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 
 def test_sgd():
     """Check that sparse SGD gives any results :-)"""
     
-    clf = sgd.sparse.SGD(penalty='l2', alpha = 0.01,
-			 fit_intercept = True,
-			 n_iter = 10, shuffle = True)
+    clf = sgd.sparse.SGD(penalty='l2', alpha=0.01,
+			 fit_intercept=True,
+			 n_iter=10, shuffle=True)
     clf.fit(X, Y)
     print clf.coef_
     #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
@@ -54,22 +56,22 @@ def test_sgd_penalties():
     assert clf.rho == 1.0
     clf = sgd.sparse.SGD(penalty='l1')
     assert clf.rho == 0.0
-    clf = sgd.sparse.SGD(penalty='elasticnet', rho = 0.85)
+    clf = sgd.sparse.SGD(penalty='elasticnet', rho=0.85)
     assert clf.rho == 0.85
 
 def test_sgd_params():
     """Test parameter validity check.
     """
     try:
-	clf = sgd.sparse.SGD(n_iter = 0)
-	clf = sgd.sparse.SGD(n_iter = -10000)
+	clf = sgd.sparse.SGD(n_iter=0)
+	clf = sgd.sparse.SGD(n_iter=-10000)
     except ValueError:
 	pass
     else:
 	assert False
 
     try:
-	clf = sgd.sparse.SGD(shuffle = "false")
+	clf = sgd.sparse.SGD(shuffle="false")
     except ValueError:
 	pass
     else:
@@ -93,32 +95,10 @@ def test_sgd_l1():
     np.random.shuffle(idx)
     X = X4[idx, :]
     Y = Y4[idx, :]
-    clf = sgd.sparse.SGD(penalty='l1', alpha = .2,
-			 fit_intercept = False,
-			 n_iter = 1000)
+    clf = sgd.sparse.SGD(penalty='l1', alpha=.2,
+			 fit_intercept=False,
+			 n_iter=1000)
     clf.fit(X, Y)
     print clf.coef_
     assert_array_equal(clf.coef_[1:-1], np.zeros((4,)))
-    
-
-## def test_rcv1():
-##     ds = bolt.io.MemoryDataset.load("/home/pprett/corpora/rcv1-ccat/test.npy")
-##     m, n = ds.n, ds.dim
-##     X = sparse.lil_matrix((m, n), dtype = np.float32)
-##     print "Build sparse matrix... ", 
-##     for i, x in enumerate(ds.iterinstances()):
-##         X[i, x['f0']] = x['f1']
-##     print "[done]"
-
-##     X = X.tocsr()
-##     Y = ds.labels
-##     print "Fitting model... "
-##     clf = sgd.sparse.SGD(penalty='l1', alpha = 0.0001, fit_intercept = True)
-##     clf.fit(X, Y)
-##     score = clf.score(X,Y)
-##     print "training score: ", score
-##     print "training error: ", ((1.0 - score) * 100.0)
-##     print "nnz: ", clf.coef_.nonzero()[0].shape[0]
 
-## if __name__ == "__main__":
-##     test_rcv1()

From 658002360d5bc3394ab199665498c8c262916e4f Mon Sep 17 00:00:00 2001
From: Peter Prettenhofer 
Date: Sun, 24 Oct 2010 12:45:33 +0200
Subject: [PATCH 07/17] removed unnecessary print statements. added mlcomp
 example atheism vs. graphics.

---
 ...comp_sparse_document_classification_sgd.py | 114 ++++++++++++++++++
 scikits/learn/sgd/sparse/sgd.py               |   3 -
 2 files changed, 114 insertions(+), 3 deletions(-)
 create mode 100644 examples/sgd/mlcomp_sparse_document_classification_sgd.py

diff --git a/examples/sgd/mlcomp_sparse_document_classification_sgd.py b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
new file mode 100644
index 0000000000000..127ad7e4a6d11
--- /dev/null
+++ b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
@@ -0,0 +1,114 @@
+"""
+======================================================
+Classification of text documents using sparse features
+======================================================
+
+This is an example showing how the scikit-learn can be used to classify
+documents by topics using a bag-of-words approach. This example uses
+a scipy.sparse matrix to store the features instead of standard numpy arrays.
+
+The dataset used in this example is the 20 newsgroups dataset and should be
+downloaded from the http://mlcomp.org (free registration required):
+
+  http://mlcomp.org/datasets/379
+
+Once downloaded unzip the arhive somewhere on your filesystem. For instance in::
+
+  % mkdir -p ~/data/mlcomp
+  % cd  ~/data/mlcomp
+  % unzip /path/to/dataset-379-20news-18828_XXXXX.zip
+
+You should get a folder ``~/data/mlcomp/379`` with a file named ``metadata`` and
+subfolders ``raw``, ``train`` and ``test`` holding the text documents organized by
+newsgroups.
+
+Then set the ``MLCOMP_DATASETS_HOME`` environment variable pointing to
+the root folder holding the uncompressed archive::
+
+  % export MLCOMP_DATASETS_HOME="~/data/mlcomp"
+
+Then you are ready to run this example using your favorite python shell::
+
+  % ipython examples/mlcomp_sparse_document_classification.py
+
+"""
+# Author: Peter Prettenhofer 
+# Author: Olivier Grisel 
+# License: Simplified BSD
+
+from time import time
+import sys
+import os
+import numpy as np
+import scipy.sparse as sp
+import pylab as pl
+
+from scikits.learn.datasets import load_mlcomp
+from scikits.learn.metrics import confusion_matrix
+
+from scikits.learn.svm.sparse import LinearSVC
+from scikits.learn.sgd.sparse import SGD
+
+
+if 'MLCOMP_DATASETS_HOME' not in os.environ:
+    print "Please follow those instructions to get started:"
+    print __doc__
+    sys.exit(0)
+
+# Load the training set
+print "Loading 20 newsgroups training set... "
+t0 = time()
+news_train = load_mlcomp('20news-18828', 'train', sparse=True)
+print "done in %fs" % (time() - t0)
+
+print "Creating binary classification task\n"\
+      "alt.atheism vs. comp.graphics"
+target = news_train.target
+pos = 0 # alt.atheism
+neg = 1 # comp.graphics
+pos_idx = np.where(target == pos)[0]
+neg_idx = np.where(target == neg)[0]
+idx = np.concatenate((pos_idx,neg_idx))
+np.random.seed(13)
+np.random.shuffle(idx)
+data = news_train.data[idx]
+target = news_train.target[idx]
+
+print "num train docs: ", data.shape[0]
+print ""
+print "Training a linear SVM (hinge loss and L2 regularizer) using SGD.\n"\
+      "SGD(n_iter=50,alpha=0.00001,fit_intercept=True)"
+t0 = time()
+clf = SGD(n_iter=50,alpha=0.00001,fit_intercept=True)
+#clf = LinearSVC(**parameters)
+clf.fit(data, target)
+print "done in %fs" % (time() - t0)
+print "Percentage of non zeros coef: %f" % (np.mean(clf.coef_ != 0) * 100)
+
+print "Loading 20 newsgroups test set... "
+t0 = time()
+news_test = load_mlcomp('20news-18828', 'test', sparse=True)
+print "done in %fs" % (time() - t0)
+
+target = news_test.target
+pos_idx = np.where(target == pos)[0]
+neg_idx = np.where(target == neg)[0]
+idx = np.concatenate((pos_idx,neg_idx))
+data = news_test.data[idx]
+target = news_test.target[idx]
+
+print "Predicting the labels of the test set..."
+t0 = time()
+pred = clf.predict(data)
+print "done in %fs" % (time() - t0)
+print "Classification accuracy: %f" % (np.mean(pred == target) * 100)
+
+cm = confusion_matrix(target, pred)
+print "Confusion matrix:"
+print cm
+
+## # Show confusion matrix
+## pl.matshow(cm)
+## pl.title('Confusion matrix')
+## pl.colorbar()
+## pl.show()
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index 09b48050c1864..d8f9843e52783 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -95,9 +95,6 @@ def fit(self, X, Y, **params):
         X_indices = X.indices
         X_indptr = X.indptr
         verbose = 0#2
-        print self.fit_intercept
-        print self.alpha
-        print self.rho
         coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_,
                                                       self.intercept_,
                                                       self.loss_function,

From 68634d28912c08093625b0ce33151f289811497f Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 15:58:33 +0200
Subject: [PATCH 08/17] kill evil tabs

---
 scikits/learn/sgd/tests/test_sparse.py | 53 ++++++++++++--------------
 1 file changed, 25 insertions(+), 28 deletions(-)

diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index 27a473f3bd9c7..32b5f2caedc46 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -20,36 +20,35 @@
 true_result2 = [1, 2, 3]
 
 # test sample 3
-X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0], 
+X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0],
                [0,0,1,0,0,0], [0,0,1,0,0,0],
-	       [0,0,0,0,1,1], [0,0,0,0,1,1], 
+               [0,0,0,0,1,1], [0,0,0,0,1,1],
                [0,0,0,1,0,0], [0,0,0,1,0,0]])
 Y3 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 X4 = np.array([[1,0.9,0.8,0,0,0], [1,.84,.98,0,0,0],
-	       [1,.96,.88,0,0,0], [1,.91,.99,0,0,0],
-	       [0,0,0,.89,.91,1], [0,0,0,.79,.84,1],
-	       [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
+               [1,.96,.88,0,0,0], [1,.91,.99,0,0,0],
+               [0,0,0,.89,.91,1], [0,0,0,.79,.84,1],
+               [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
 Y4 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
-X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0], 
+X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0],
                [1,1,1,0,0,0], [1,1,1,0,0,0],
-	       [0,0,0,1,1,1], [0,0,0,1,1,1], 
+               [0,0,0,1,1,1], [0,0,0,1,1,1],
                [0,0,0,1,1,1], [0,0,0,1,1,1]])
 Y5 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 
 def test_sgd():
     """Check that sparse SGD gives any results :-)"""
-    
+
     clf = sgd.sparse.SGD(penalty='l2', alpha=0.01,
-			 fit_intercept=True,
-			 n_iter=10, shuffle=True)
+                         fit_intercept=True,
+                         n_iter=10, shuffle=True)
     clf.fit(X, Y)
-    print clf.coef_
     #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
     assert_array_equal(clf.predict(T), true_result)
-    
+
 def test_sgd_penalties():
     """Check whether penalties and hyperparameters are set properly"""
     clf = sgd.sparse.SGD(penalty='l2')
@@ -60,33 +59,31 @@ def test_sgd_penalties():
     assert clf.rho == 0.85
 
 def test_sgd_params():
-    """Test parameter validity check.
-    """
+    """Test parameter validity check"""
     try:
-	clf = sgd.sparse.SGD(n_iter=0)
-	clf = sgd.sparse.SGD(n_iter=-10000)
+        clf = sgd.sparse.SGD(n_iter=0)
+        clf = sgd.sparse.SGD(n_iter=-10000)
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
 
     try:
-	clf = sgd.sparse.SGD(shuffle="false")
+        clf = sgd.sparse.SGD(shuffle="false")
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
 
 def test_sgd_multiclass():
-    """SGD is not able to handle multi class problems. 
-    """
+    """SGD is not able to handle multi class problems"""
     clf = sgd.sparse.SGD()
     try:
-	clf.fit(X2, Y2)
+        clf.fit(X2, Y2)
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
 
 def test_sgd_l1():
     n = len(X4)
@@ -96,8 +93,8 @@ def test_sgd_l1():
     X = X4[idx, :]
     Y = Y4[idx, :]
     clf = sgd.sparse.SGD(penalty='l1', alpha=.2,
-			 fit_intercept=False,
-			 n_iter=1000)
+                         fit_intercept=False,
+                         n_iter=1000)
     clf.fit(X, Y)
     print clf.coef_
     assert_array_equal(clf.coef_[1:-1], np.zeros((4,)))

From 86ef9e0a7f78fe13837b029068f6ad43eac82f02 Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 16:12:15 +0200
Subject: [PATCH 09/17] cosmit

---
 examples/sgd/mlcomp_sparse_document_classification_sgd.py | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/examples/sgd/mlcomp_sparse_document_classification_sgd.py b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
index 127ad7e4a6d11..17bfb0465c213 100644
--- a/examples/sgd/mlcomp_sparse_document_classification_sgd.py
+++ b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
@@ -68,7 +68,7 @@
 neg = 1 # comp.graphics
 pos_idx = np.where(target == pos)[0]
 neg_idx = np.where(target == neg)[0]
-idx = np.concatenate((pos_idx,neg_idx))
+idx = np.concatenate((pos_idx, neg_idx))
 np.random.seed(13)
 np.random.shuffle(idx)
 data = news_train.data[idx]
@@ -79,8 +79,7 @@
 print "Training a linear SVM (hinge loss and L2 regularizer) using SGD.\n"\
       "SGD(n_iter=50,alpha=0.00001,fit_intercept=True)"
 t0 = time()
-clf = SGD(n_iter=50,alpha=0.00001,fit_intercept=True)
-#clf = LinearSVC(**parameters)
+clf = SGD(n_iter=50, alpha=0.00001, fit_intercept=True)
 clf.fit(data, target)
 print "done in %fs" % (time() - t0)
 print "Percentage of non zeros coef: %f" % (np.mean(clf.coef_ != 0) * 100)
@@ -93,7 +92,7 @@
 target = news_test.target
 pos_idx = np.where(target == pos)[0]
 neg_idx = np.where(target == neg)[0]
-idx = np.concatenate((pos_idx,neg_idx))
+idx = np.concatenate((pos_idx, neg_idx))
 data = news_test.data[idx]
 target = news_test.target[idx]
 

From e4ac71e3db4995f02c3e5aee10e9c613d2707bec Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 16:43:31 +0200
Subject: [PATCH 10/17] cosmit on example

---
 examples/sgd/mlcomp_sparse_document_classification_sgd.py | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/examples/sgd/mlcomp_sparse_document_classification_sgd.py b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
index 17bfb0465c213..cf8e6473f9bba 100644
--- a/examples/sgd/mlcomp_sparse_document_classification_sgd.py
+++ b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
@@ -76,10 +76,12 @@
 
 print "num train docs: ", data.shape[0]
 print ""
-print "Training a linear SVM (hinge loss and L2 regularizer) using SGD.\n"\
-      "SGD(n_iter=50,alpha=0.00001,fit_intercept=True)"
-t0 = time()
+print "Training a linear SVM (hinge loss and L2 regularizer) using SGD:"
+
 clf = SGD(n_iter=50, alpha=0.00001, fit_intercept=True)
+print clf
+
+t0 = time()
 clf.fit(data, target)
 print "done in %fs" % (time() - t0)
 print "Percentage of non zeros coef: %f" % (np.mean(clf.coef_ != 0) * 100)

From 4af396d3ad39ca36671c2b99ef1558c0bae5352f Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 17:27:41 +0200
Subject: [PATCH 11/17] cosmit: PEP8 + some missing docstrings

---
 scikits/learn/sgd/base.py                     |   19 +-
 .../learn/sgd/sparse/src/sgd_fast_sparse.c    | 2923 +++++++++--------
 .../learn/sgd/sparse/src/sgd_fast_sparse.pyx  |  135 +-
 3 files changed, 1563 insertions(+), 1514 deletions(-)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index bd11bca400595..cf275ac951631 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -5,14 +5,20 @@
 
 from ..base import BaseEstimator
 
+
 class LinearModel(BaseEstimator):
-    """Linear Model trained by minimizing a regularized training
-    error using SGD.
-    
+    """Linear Model trained by regularized Stochastic Gradient Descent
+
+    SGD works by iteratively minimizing (sample by sample) the sum a
+    running estimate of a loss function (e.g. hinge loss or quadratic
+    loss) and a regularizer (e.g. the squared euclidean (L2) norm of the
+    coefs) that encodes apriori knowledge of the distribution of the coefs
+    (e.g. centered guaussian distribution for the L2 regularizer.
+
     Parameters
     ----------
     loss : str, ('hinge'|'log'|'modifiedhuber')
-        The loss function to be used. 
+        The loss function to be used.
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
     alpha : float
@@ -30,7 +36,7 @@ class LinearModel(BaseEstimator):
         The number of passes over the training data (aka epochs).
     shuffle: bool
         Whether or not the training data should be shuffled after each epoch.
-        Defaults to False. 
+        Defaults to False.
 
     Attributes
     ----------
@@ -62,7 +68,7 @@ def __init__(self, loss="hinge", penalty='l2', alpha=0.0001,
         self._get_penalty_type()
 
     def _get_penalty_type(self):
-        penalty_types = {"l2":2, "l1":1, "elasticnet":3}
+        penalty_types = {"l2": 2, "l1": 1, "elasticnet": 3}
         try:
             self.penalty_type = penalty_types[self.penalty]
             if self.penalty_type == 2:
@@ -71,3 +77,4 @@ def _get_penalty_type(self):
                 self.rho = 0.0
         except KeyError:
             raise ValueError("Penalty %s is not supported. " % self.penalty)
+
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
index 3b4ec5cdd4ea1..669c9ff5405a1 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
@@ -1,18 +1,39 @@
-/* Generated by Cython 0.12.1 on Sun Oct 24 11:34:09 2010 */
+/* Generated by Cython 0.13 on Sun Oct 24 17:24:08 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
-#include "structmember.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
 #else
 
-#ifndef PY_LONG_LONG
-  #define PY_LONG_LONG LONG_LONG
+#include  /* For offsetof */
+#ifndef offsetof
+#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
+#endif
+
+#if !defined(WIN32) && !defined(MS_WINDOWS)
+  #ifndef __stdcall
+    #define __stdcall
+  #endif
+  #ifndef __cdecl
+    #define __cdecl
+  #endif
+  #ifndef __fastcall
+    #define __fastcall
+  #endif
+#endif
+
+#ifndef DL_IMPORT
+  #define DL_IMPORT(t) t
 #endif
 #ifndef DL_EXPORT
   #define DL_EXPORT(t) t
 #endif
+
+#ifndef PY_LONG_LONG
+  #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)
@@ -82,11 +103,35 @@
 
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
+  #define PyStringObject               PyUnicodeObject
   #define PyString_Type                PyUnicode_Type
+  #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
-#else
+#endif
+
+#if PY_VERSION_HEX < 0x02060000
+  #define PyBytesObject                PyStringObject
   #define PyBytes_Type                 PyString_Type
+  #define PyBytes_Check                PyString_Check
   #define PyBytes_CheckExact           PyString_CheckExact
+  #define PyBytes_FromString           PyString_FromString
+  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
+  #define PyBytes_FromFormat           PyString_FromFormat
+  #define PyBytes_DecodeEscape         PyString_DecodeEscape
+  #define PyBytes_AsString             PyString_AsString
+  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
+  #define PyBytes_Size                 PyString_Size
+  #define PyBytes_AS_STRING            PyString_AS_STRING
+  #define PyBytes_GET_SIZE             PyString_GET_SIZE
+  #define PyBytes_Repr                 PyString_Repr
+  #define PyBytes_Concat               PyString_Concat
+  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
+  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
+  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
+#endif
+
+#ifndef PySet_CheckExact
+#  define PySet_CheckExact(obj)          (Py_TYPE(obj) == &PySet_Type)
 #endif
 
 #if PY_MAJOR_VERSION >= 3
@@ -103,30 +148,23 @@
   #define PyInt_AsSsize_t              PyLong_AsSsize_t
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+#endif
+
+#if PY_MAJOR_VERSION >= 3
+  #define PyBoolObject PyLongObject
+#endif
+
+
+#if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
   #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
 #else
   #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
   #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
-
 #endif
 
 #if PY_MAJOR_VERSION >= 3
-  #define PyMethod_New(func, self, klass) PyInstanceMethod_New(func)
-#endif
-
-#if !defined(WIN32) && !defined(MS_WINDOWS)
-  #ifndef __stdcall
-    #define __stdcall
-  #endif
-  #ifndef __cdecl
-    #define __cdecl
-  #endif
-  #ifndef __fastcall
-    #define __fastcall
-  #endif
-#else
-  #define _USE_MATH_DEFINES
+  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #endif
 
 #if PY_VERSION_HEX < 0x02050000
@@ -146,113 +184,64 @@
   #define __Pyx_NAMESTR(n) (n)
   #define __Pyx_DOCSTR(n)  (n)
 #endif
+
 #ifdef __cplusplus
 #define __PYX_EXTERN_C extern "C"
 #else
 #define __PYX_EXTERN_C extern
 #endif
+
+#if defined(WIN32) || defined(MS_WINDOWS)
+#define _USE_MATH_DEFINES
+#endif
 #include 
 #define __PYX_HAVE_API__sgd_fast_sparse
-#include "stdlib.h"
 #include "stdio.h"
+#include "stdlib.h"
 #include "numpy/arrayobject.h"
 #include "numpy/ufuncobject.h"
 #include "math.h"
 
+/* inline attribute */
 #ifndef CYTHON_INLINE
   #if defined(__GNUC__)
     #define CYTHON_INLINE __inline__
   #elif defined(_MSC_VER)
     #define CYTHON_INLINE __inline
+  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define CYTHON_INLINE inline
   #else
     #define CYTHON_INLINE 
   #endif
 #endif
 
+/* unused attribute */
+#ifndef CYTHON_UNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define CYTHON_UNUSED __attribute__ ((__unused__)) 
+#   else
+#     define CYTHON_UNUSED
+#   endif
+# elif defined(__ICC) || defined(__INTEL_COMPILER)
+#   define CYTHON_UNUSED __attribute__ ((__unused__)) 
+# else
+#   define CYTHON_UNUSED 
+# endif
+#endif
+
 typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
 
 
 /* Type Conversion Predeclarations */
 
-#if PY_MAJOR_VERSION < 3
-#define __Pyx_PyBytes_FromString          PyString_FromString
-#define __Pyx_PyBytes_FromStringAndSize   PyString_FromStringAndSize
-#define __Pyx_PyBytes_AsString            PyString_AsString
-#else
-#define __Pyx_PyBytes_FromString          PyBytes_FromString
-#define __Pyx_PyBytes_FromStringAndSize   PyBytes_FromStringAndSize
-#define __Pyx_PyBytes_AsString            PyBytes_AsString
-#endif
-
-#define __Pyx_PyBytes_FromUString(s)      __Pyx_PyBytes_FromString((char*)s)
-#define __Pyx_PyBytes_AsUString(s)        ((unsigned char*) __Pyx_PyBytes_AsString(s))
+#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)
+#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))
 
 #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
 static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 
-#if !defined(T_PYSSIZET)
-#if PY_VERSION_HEX < 0x02050000
-#define T_PYSSIZET T_INT
-#elif !defined(T_LONGLONG)
-#define T_PYSSIZET \
-        ((sizeof(Py_ssize_t) == sizeof(int))  ? T_INT  : \
-        ((sizeof(Py_ssize_t) == sizeof(long)) ? T_LONG : -1))
-#else
-#define T_PYSSIZET \
-        ((sizeof(Py_ssize_t) == sizeof(int))          ? T_INT      : \
-        ((sizeof(Py_ssize_t) == sizeof(long))         ? T_LONG     : \
-        ((sizeof(Py_ssize_t) == sizeof(PY_LONG_LONG)) ? T_LONGLONG : -1)))
-#endif
-#endif
-
-
-#if !defined(T_ULONGLONG)
-#define __Pyx_T_UNSIGNED_INT(x) \
-        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
-        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
-        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
-        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : -1))))
-#else
-#define __Pyx_T_UNSIGNED_INT(x) \
-        ((sizeof(x) == sizeof(unsigned char))  ? T_UBYTE : \
-        ((sizeof(x) == sizeof(unsigned short)) ? T_USHORT : \
-        ((sizeof(x) == sizeof(unsigned int))   ? T_UINT : \
-        ((sizeof(x) == sizeof(unsigned long))  ? T_ULONG : \
-        ((sizeof(x) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))))
-#endif
-#if !defined(T_LONGLONG)
-#define __Pyx_T_SIGNED_INT(x) \
-        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
-        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
-        ((sizeof(x) == sizeof(int))   ? T_INT : \
-        ((sizeof(x) == sizeof(long))  ? T_LONG : -1))))
-#else
-#define __Pyx_T_SIGNED_INT(x) \
-        ((sizeof(x) == sizeof(char))  ? T_BYTE : \
-        ((sizeof(x) == sizeof(short)) ? T_SHORT : \
-        ((sizeof(x) == sizeof(int))   ? T_INT : \
-        ((sizeof(x) == sizeof(long))  ? T_LONG : \
-        ((sizeof(x) == sizeof(PY_LONG_LONG))   ? T_LONGLONG : -1)))))
-#endif
-
-#define __Pyx_T_FLOATING(x) \
-        ((sizeof(x) == sizeof(float)) ? T_FLOAT : \
-        ((sizeof(x) == sizeof(double)) ? T_DOUBLE : -1))
-
-#if !defined(T_SIZET)
-#if !defined(T_ULONGLONG)
-#define T_SIZET \
-        ((sizeof(size_t) == sizeof(unsigned int))  ? T_UINT  : \
-        ((sizeof(size_t) == sizeof(unsigned long)) ? T_ULONG : -1))
-#else
-#define T_SIZET \
-        ((sizeof(size_t) == sizeof(unsigned int))          ? T_UINT      : \
-        ((sizeof(size_t) == sizeof(unsigned long))         ? T_ULONG     : \
-        ((sizeof(size_t) == sizeof(unsigned PY_LONG_LONG)) ? T_ULONGLONG : -1)))
-#endif
-#endif
-
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
 static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
@@ -262,7 +251,7 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
 #ifdef __GNUC__
 /* Test for GCC > 2.95 */
-#if __GNUC__ > 2 ||               (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) 
+#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) 
 #define likely(x)   __builtin_expect(!!(x), 1)
 #define unlikely(x) __builtin_expect(!!(x), 0)
 #else /* __GNUC__ > 2 ... */
@@ -282,7 +271,6 @@ static int __pyx_lineno;
 static int __pyx_clineno = 0;
 static const char * __pyx_cfilenm= __FILE__;
 static const char *__pyx_filename;
-static const char **__pyx_f;
 
 
 #if !defined(CYTHON_CCOMPLEX)
@@ -308,6 +296,11 @@ static const char **__pyx_f;
   #define _Complex_I 1.0fj
 #endif
 
+static const char *__pyx_f[] = {
+  "sgd_fast_sparse.pyx",
+  "numpy.pxd",
+};
+
 typedef npy_int8 __pyx_t_5numpy_int8_t;
 
 typedef npy_int16 __pyx_t_5numpy_int16_t;
@@ -380,12 +373,12 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
  *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_LossFunction {
@@ -393,8 +386,8 @@ struct __pyx_obj_15sgd_fast_sparse_LossFunction {
   struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
- *         raise NotImplementedError()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+ * 
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
@@ -405,12 +398,12 @@ struct __pyx_obj_15sgd_fast_sparse_Regression {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
- *         return SquaredError,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
+ * 
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
+ *     """Huber regression loss
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_Huber {
@@ -418,19 +411,19 @@ struct __pyx_obj_15sgd_fast_sparse_Huber {
   double c;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
- *         return Log,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+ * 
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
+ *     """Squared euclidean norm of difference (regression loss)"""
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_SquaredError {
   struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
@@ -442,36 +435,36 @@ struct __pyx_obj_15sgd_fast_sparse_Classification {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
- *         return ModifiedHuber,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":103
+ * 
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
+ *     """SVM classification loss for binary classification with y in {-1, 1}"""
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_Hinge {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
- *         raise NotImplementedError()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":73
+ * 
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
+ *     """Modified Huber loss for binary classification with y in {-1, 1}
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
+ *     """Logistic regression loss for binary classification with y in {-1, 1}"""
+ * 
  */
 
 struct __pyx_obj_15sgd_fast_sparse_Log {
@@ -479,12 +472,12 @@ struct __pyx_obj_15sgd_fast_sparse_Log {
 };
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
  *     """Base class for convex loss functions"""
- *     cpdef double loss(self, double p, double y):
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
@@ -494,8 +487,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
- *         raise NotImplementedError()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+ * 
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
@@ -508,12 +501,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
- *         return Log,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+ * 
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
+ *     """Squared euclidean norm of difference (regression loss)"""
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
@@ -522,12 +515,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
- *         return SquaredError,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
+ * 
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
- *     """
- *     """
+ *     """Huber regression loss
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
@@ -536,7 +529,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
@@ -550,12 +543,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
- *         return ModifiedHuber,()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":103
+ * 
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
- *     """SVM classification loss for binary
- *     classification tasks with y in {-1,1}.
+ *     """SVM classification loss for binary classification with y in {-1, 1}"""
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
@@ -564,12 +557,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
- *         raise NotImplementedError()
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":73
+ * 
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
- *     """Modified Huber loss function for binary
- *     classification tasks with y in {-1,1}.
+ *     """Modified Huber loss for binary classification with y in {-1, 1}
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
@@ -578,12 +571,12 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
- *     """Logistic regression loss for binary classification
- *     tasks with y in {-1,1}.
+ *     """Logistic regression loss for binary classification with y in {-1, 1}"""
+ * 
  */
 
 struct __pyx_vtabstruct_15sgd_fast_sparse_Log {
@@ -637,6 +630,8 @@ static struct __pyx_vtabstruct_15sgd_fast_sparse_Log *__pyx_vtabptr_15sgd_fast_s
 #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)
 #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)
 
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
+
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name, PyObject* kw_name); /*proto*/
 
@@ -645,6 +640,9 @@ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
 
 static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],     PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,     const char* function_name); /*proto*/
 
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact); /*proto*/
+
 /* Run-time type information about structs used with buffers */
 struct __Pyx_StructField_;
 
@@ -667,8 +665,8 @@ typedef struct {
 } __Pyx_BufFmt_StackElem;
 
 
+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 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_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
 
@@ -686,11 +684,11 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
 }
 
 
-#define __Pyx_GetItemInt_List(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_List_Fast(o, i, size <= sizeof(long)) : \
+#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_List_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {
     if (likely(o != Py_None)) {
         if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
             PyObject *r = PyList_GET_ITEM(o, i);
@@ -703,14 +701,14 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_
             return r;
         }
     }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Tuple_Fast(o, i, size <= sizeof(long)) : \
+#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Tuple_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {
     if (likely(o != Py_None)) {
         if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
             PyObject *r = PyTuple_GET_ITEM(o, i);
@@ -723,15 +721,15 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize
             return r;
         }
     }
-    return __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
 
-#define __Pyx_GetItemInt(o, i, size, to_py_func) ((size <= sizeof(Py_ssize_t)) ? \
-                                                    __Pyx_GetItemInt_Fast(o, i, size <= sizeof(long)) : \
+#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_GetItemInt_Fast(o, i) : \
                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
 
-static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int fits_long) {
+static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
     PyObject *r;
     if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
         r = PyList_GET_ITEM(o, i);
@@ -745,7 +743,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
         r = PySequence_GetItem(o, i);
     }
     else {
-        r = __Pyx_GetItemInt_Generic(o, fits_long ? PyInt_FromLong(i) : PyLong_FromLongLong(i));
+        r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
     }
     return r;
 }
@@ -753,19 +751,13 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
 static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
 static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
 
-static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
-
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void);
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
 
-static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
-static int __Pyx_EndUnpack(PyObject *); /*proto*/
+static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
 
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
 
 static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
-
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact); /*proto*/
 #if PY_MAJOR_VERSION < 3
 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);
 static void __Pyx_ReleaseBuffer(Py_buffer *view);
@@ -779,17 +771,15 @@ Py_ssize_t __Pyx_minusones[] = {-1};
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
 
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
-
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
 
-static int __Pyx_Print(PyObject *, int); /*proto*/
+static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/
 #if PY_MAJOR_VERSION >= 3
 static PyObject* __pyx_print = 0;
 static PyObject* __pyx_print_kwargs = 0;
 #endif
 
-static int __Pyx_PrintOne(PyObject *o); /*proto*/
+static int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/
 
 #if CYTHON_CCOMPLEX
   #ifdef __cplusplus
@@ -890,6 +880,8 @@ static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
 
 static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
 
+static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);
+
 static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
 
 static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
@@ -913,13 +905,15 @@ static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
 static void __Pyx_AddTraceback(const char *funcname); /*proto*/
 
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
-/* Module declarations from python_buffer */
+/* Module declarations from cpython.buffer */
+
+/* Module declarations from cpython.ref */
 
-/* Module declarations from python_ref */
+/* Module declarations from libc.stdio */
 
-/* Module declarations from stdlib */
+/* Module declarations from cpython.object */
 
-/* Module declarations from stdio */
+/* Module declarations from libc.stdlib */
 
 /* Module declarations from numpy */
 
@@ -976,9 +970,9 @@ static char __pyx_k_7[] = "Non-native byte order not supported";
 static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)";
 static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_10[] = "Format string allocated too short.";
-static char __pyx_k_11[] = "LossFunction.loss (line 35)";
-static char __pyx_k_12[] = "LossFunction.dloss (line 44)";
-static char __pyx_k_13[] = "plain_sgd (line 183)";
+static char __pyx_k_11[] = "LossFunction.loss (line 36)";
+static char __pyx_k_12[] = "LossFunction.dloss (line 46)";
+static char __pyx_k_13[] = "plain_sgd (line 200)";
 static char __pyx_k__B[] = "B";
 static char __pyx_k__H[] = "H";
 static char __pyx_k__I[] = "I";
@@ -1127,9 +1121,9 @@ static PyObject *__pyx_n_s__y;
 static PyObject *__pyx_n_s__zeros;
 static PyObject *__pyx_int_15;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
- * cdef class LossFunction:
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  *     """Base class for convex loss functions"""
+ * 
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the loss function.
  * 
@@ -1148,14 +1142,14 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1163,10 +1157,10 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1175,18 +1169,18 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":43
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
  *     cpdef double dloss(self, double p, double y):
- *         """Evaluate the derivative of the loss function.
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1202,16 +1196,16 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
- * cdef class LossFunction:
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":36
  *     """Base class for convex loss functions"""
+ * 
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the loss function.
  * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n\n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   double __pyx_v_p;
   double __pyx_v_y;
@@ -1237,29 +1231,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
       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 = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __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 = 35; __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 = 35; __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 = 36; __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 = 36; __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 = 35; __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 = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 36; __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 = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1277,9 +1272,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
- *         :returns: double"""
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":46
  *         raise NotImplementedError()
+ * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the derivative of the loss function.
  * 
@@ -1298,14 +1293,14 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1313,10 +1308,10 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1325,18 +1320,18 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
- * cdef class Regression(LossFunction):
+ * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1352,16 +1347,16 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
- *         :returns: double"""
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":46
  *         raise NotImplementedError()
+ * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the derivative of the loss function.
  * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n\n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   double __pyx_v_p;
   double __pyx_v_y;
@@ -1387,29 +1382,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
       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 = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __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 = 44; __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 = 44; __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 = 46; __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 = 46; __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 = 44; __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 46; __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 = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1427,7 +1423,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1448,14 +1444,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1463,10 +1459,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1475,18 +1471,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1502,7 +1498,7 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1536,29 +1532,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
       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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __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 = 56; __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 = 56; __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 = 59; __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 = 59; __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 59; __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 = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1576,7 +1573,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":61
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1597,14 +1594,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1612,10 +1609,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1624,18 +1621,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1651,7 +1648,7 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":61
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1685,29 +1682,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
       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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __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 = 58; __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 = 58; __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 = 61; __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 = 61; __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 = 58; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 61; __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 = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1725,7 +1723,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1746,14 +1744,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1761,10 +1759,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1773,18 +1771,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1800,7 +1798,7 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1834,29 +1832,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
       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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __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 = 64; __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 = 64; __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 = 67; __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 = 67; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 67; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1874,7 +1873,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1895,14 +1894,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1910,10 +1909,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1922,18 +1921,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":70
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
- * cdef class ModifiedHuber(Classification):
+ * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1949,7 +1948,7 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1983,29 +1982,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
       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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __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 = 66; __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 = 66; __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 = 69; __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 = 69; __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 = 66; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 69; __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 = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2023,11 +2023,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
  *     Stochastic Gradient Descent', ICML'04.
  *     """
- *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z >= 1:
  */
 
@@ -2042,19 +2042,18 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2062,10 +2061,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2074,68 +2073,68 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *     """
- *     cpdef double loss(self, double p,double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z >= 1:
  *             return 0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
- *     cpdef double loss(self, double p,double y):
- *         cdef double z = p*y
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double z = p * y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
+  __pyx_t_6 = (__pyx_v_z >= 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
- *         cdef double z = p*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
+ *         cdef double z = p * y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
  *         elif z >= -1:
- *             return (1-z) * (1-z)
+ *             return (1 - z) * (1 - z)
  */
-    __pyx_r = 0;
+    __pyx_r = 0.0;
     goto __pyx_L0;
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
- *             return (1-z) * (1-z)
+ *             return (1 - z) * (1 - z)
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
+  __pyx_t_6 = (__pyx_v_z >= -1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
  *             return 0
  *         elif z >= -1:
- *             return (1-z) * (1-z)             # <<<<<<<<<<<<<<
+ *             return (1 - z) * (1 - z)             # <<<<<<<<<<<<<<
  *         else:
- *             return -4*z
+ *             return -4 * z
  */
-    __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z));
+    __pyx_r = ((1.0 - __pyx_v_z) * (1.0 - __pyx_v_z));
     goto __pyx_L0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
- *             return (1-z) * (1-z)
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
+ *             return (1 - z) * (1 - z)
  *         else:
- *             return -4*z             # <<<<<<<<<<<<<<
+ *             return -4 * z             # <<<<<<<<<<<<<<
  * 
  *     cpdef double dloss(self, double p, double y):
  */
-    __pyx_r = (-4 * __pyx_v_z);
+    __pyx_r = (-4.0 * __pyx_v_z);
     goto __pyx_L0;
   }
   __pyx_L3:;
@@ -2150,16 +2149,15 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
  *     Stochastic Gradient Descent', ICML'04.
  *     """
- *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z >= 1:
  */
 
@@ -2189,29 +2187,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
       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 = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __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 = 79; __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 = 79; __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 = 81; __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 = 81; __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 = 79; __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 81; __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 = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2229,11 +2228,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
- *             return -4*z
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+ *             return -4 * z
  * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z >= 1:
  */
 
@@ -2248,19 +2247,18 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2268,10 +2266,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2280,68 +2278,68 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
  * 
  *     cpdef double dloss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z >= 1:
  *             return 0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
  *     cpdef double dloss(self, double p, double y):
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z >= 1:             # <<<<<<<<<<<<<<
  *             return 0
  *         elif z >= -1:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
+  __pyx_t_6 = (__pyx_v_z >= 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
- *         cdef double z = p*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
+ *         cdef double z = p * y
  *         if z >= 1:
  *             return 0             # <<<<<<<<<<<<<<
  *         elif z >= -1:
- *             return 2*(1-z)*y
+ *             return 2 * (1 - z) * y
  */
-    __pyx_r = 0;
+    __pyx_r = 0.0;
     goto __pyx_L0;
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
  *         if z >= 1:
  *             return 0
  *         elif z >= -1:             # <<<<<<<<<<<<<<
- *             return 2*(1-z)*y
+ *             return 2 * (1 - z) * y
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
+  __pyx_t_6 = (__pyx_v_z >= -1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
  *             return 0
  *         elif z >= -1:
- *             return 2*(1-z)*y             # <<<<<<<<<<<<<<
+ *             return 2 * (1 - z) * y             # <<<<<<<<<<<<<<
  *         else:
- *             return 4*y
+ *             return 4 * y
  */
-    __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y);
+    __pyx_r = ((2.0 * (1.0 - __pyx_v_z)) * __pyx_v_y);
     goto __pyx_L0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
- *             return 2*(1-z)*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":97
+ *             return 2 * (1 - z) * y
  *         else:
- *             return 4*y             # <<<<<<<<<<<<<<
+ *             return 4 * y             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-    __pyx_r = (4 * __pyx_v_y);
+    __pyx_r = (4.0 * __pyx_v_y);
     goto __pyx_L0;
   }
   __pyx_L3:;
@@ -2356,16 +2354,15 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   __Pyx_WriteUnraisable("sgd_fast_sparse.ModifiedHuber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
- *             return -4*z
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+ *             return -4 * z
  * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z >= 1:
  */
 
@@ -2395,29 +2392,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
       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 = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __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 = 88; __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 = 88; __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 = 90; __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 = 90; __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 = 88; __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 90; __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 = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2435,29 +2433,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":97
- *             return 4*y
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":99
+ *             return 4 * y
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return ModifiedHuber,()
+ *         return ModifiedHuber, ()
  * 
  */
 
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
  * 
  *     def __reduce__(self):
- *         return ModifiedHuber,()             # <<<<<<<<<<<<<<
+ *         return ModifiedHuber, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class Hinge(Classification):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
@@ -2481,11 +2479,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
- *     classification tasks with y in {-1,1}.
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+ *     """SVM classification loss for binary classification with y in {-1, 1}"""
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2500,19 +2498,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2520,10 +2517,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2532,18 +2529,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
- *     """
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
+ * 
  *     cpdef  double loss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return (1 - z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *     cpdef  double loss(self, double p, double y):
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return (1 - z)
  *         return 0
@@ -2551,27 +2548,27 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
- *         cdef double z = p*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+ *         cdef double z = p * y
  *         if z < 1.0:
  *             return (1 - z)             # <<<<<<<<<<<<<<
  *         return 0
  *     cpdef  double dloss(self, double p, double y):
  */
-    __pyx_r = (1 - __pyx_v_z);
+    __pyx_r = (1.0 - __pyx_v_z);
     goto __pyx_L0;
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
  *         if z < 1.0:
  *             return (1 - z)
  *         return 0             # <<<<<<<<<<<<<<
  *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y
+ *         cdef double z = p * y
  */
-  __pyx_r = 0;
+  __pyx_r = 0.0;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -2584,16 +2581,15 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
- *     classification tasks with y in {-1,1}.
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
+ *     """SVM classification loss for binary classification with y in {-1, 1}"""
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2623,29 +2619,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
       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 = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 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, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 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 = 104; __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 = 104; __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 = 104; __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2663,11 +2660,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2682,19 +2679,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2702,10 +2698,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2714,18 +2710,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
  *         return 0
  *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return y
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
  *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return y
  *         return 0
@@ -2733,8 +2729,8 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
- *         cdef double z = p*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+ *         cdef double z = p * y
  *         if z < 1.0:
  *             return y             # <<<<<<<<<<<<<<
  *         return 0
@@ -2746,14 +2742,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":115
  *         if z < 1.0:
  *             return y
  *         return 0             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-  __pyx_r = 0;
+  __pyx_r = 0.0;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -2766,16 +2762,15 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   __Pyx_WriteUnraisable("sgd_fast_sparse.Hinge.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
  *             return (1 - z)
  *         return 0
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2805,29 +2800,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
       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 = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __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 = 109; __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 = 109; __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 = 111; __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 = 111; __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 = 109; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 111; __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 = 111; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2845,29 +2841,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":115
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
  *         return 0
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return Hinge,()
+ *         return Hinge, ()
  * 
  */
 
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":118
  * 
  *     def __reduce__(self):
- *         return Hinge,()             # <<<<<<<<<<<<<<
+ *         return Hinge, ()             # <<<<<<<<<<<<<<
  * 
  * 
  */
   __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_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
@@ -2891,12 +2887,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
- *     tasks with y in {-1,1}.
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+ *     """Logistic regression loss for binary classification with y in {-1, 1}"""
+ * 
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z > 18:
+ *         cdef double z = p * y
+ *         # TODO: explain where does this 18 comes from
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -2910,19 +2906,18 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2930,10 +2925,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2942,27 +2937,27 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
- *     """
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+ * 
  *     cpdef double loss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
+ *         # TODO: explain where does this 18 comes from
  *         if z > 18:
- *             return exp(-z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
- *     cpdef double loss(self, double p, double y):
- *         cdef double z = p*y
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+ *         cdef double z = p * y
+ *         # TODO: explain where does this 18 comes from
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z)
  *         if z < -18:
  */
-  __pyx_t_6 = (__pyx_v_z > 18);
+  __pyx_t_6 = (__pyx_v_z > 18.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
- *         cdef double z = p*y
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
+ *         # TODO: explain where does this 18 comes from
  *         if z > 18:
  *             return exp(-z)             # <<<<<<<<<<<<<<
  *         if z < -18:
@@ -2974,21 +2969,21 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
  *         if z > 18:
  *             return exp(-z)
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return -z * y
- *         return log(1.0+exp(-z))
+ *         return log(1.0 + exp(-z))
  */
-  __pyx_t_6 = (__pyx_v_z < -18);
+  __pyx_t_6 = (__pyx_v_z < -18.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
  *             return exp(-z)
  *         if z < -18:
  *             return -z * y             # <<<<<<<<<<<<<<
- *         return log(1.0+exp(-z))
+ *         return log(1.0 + exp(-z))
  * 
  */
     __pyx_r = ((-__pyx_v_z) * __pyx_v_y);
@@ -2997,10 +2992,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
  *         if z < -18:
  *             return -z * y
- *         return log(1.0+exp(-z))             # <<<<<<<<<<<<<<
+ *         return log(1.0 + exp(-z))             # <<<<<<<<<<<<<<
  * 
  *     cpdef  double dloss(self, double p, double y):
  */
@@ -3017,17 +3012,16 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
- *     tasks with y in {-1,1}.
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+ *     """Logistic regression loss for binary classification with y in {-1, 1}"""
+ * 
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z > 18:
+ *         cdef double z = p * y
+ *         # TODO: explain where does this 18 comes from
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3056,29 +3050,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
       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 = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __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 = 123; __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 = 123; __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 = 124; __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 = 124; __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 = 123; __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 124; __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 = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3096,8 +3091,8 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
- *         return log(1.0+exp(-z))
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+ *         return log(1.0 + exp(-z))
  * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
@@ -3115,19 +3110,18 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3135,10 +3129,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3147,7 +3141,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
  * 
  *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y             # <<<<<<<<<<<<<<
@@ -3156,17 +3150,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
  *     cpdef  double dloss(self, double p, double y):
  *         cdef double z = p*y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z) * y
  *         if z < -18:
  */
-  __pyx_t_6 = (__pyx_v_z > 18);
+  __pyx_t_6 = (__pyx_v_z > 18.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *         cdef double z = p*y
  *         if z > 18:
  *             return exp(-z) * y             # <<<<<<<<<<<<<<
@@ -3179,17 +3173,17 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
  *         if z > 18:
  *             return exp(-z) * y
  *         if z < -18:             # <<<<<<<<<<<<<<
  *             return y
  *         return y / (exp(z) + 1.0)
  */
-  __pyx_t_6 = (__pyx_v_z < -18);
+  __pyx_t_6 = (__pyx_v_z < -18.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
  *             return exp(-z) * y
  *         if z < -18:
  *             return y             # <<<<<<<<<<<<<<
@@ -3202,7 +3196,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":139
  *         if z < -18:
  *             return y
  *         return y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<
@@ -3222,13 +3216,12 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   __Pyx_WriteUnraisable("sgd_fast_sparse.Log.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
- *         return log(1.0+exp(-z))
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
+ *         return log(1.0 + exp(-z))
  * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double z = p*y
@@ -3261,29 +3254,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
       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 = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __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 = 131; __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 = 131; __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 = 133; __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 = 133; __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 = 131; __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 133; __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 = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3301,29 +3295,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":139
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
  *         return y / (exp(z) + 1.0)
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return Log,()
+ *         return Log, ()
  * 
  */
 
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
  * 
  *     def __reduce__(self):
- *         return Log,()             # <<<<<<<<<<<<<<
+ *         return Log, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class SquaredError(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); 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_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
@@ -3347,12 +3341,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
- *     """
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+ *     """Squared euclidean norm of difference (regression loss)"""
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3368,14 +3362,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3383,10 +3377,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3395,12 +3389,12 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
- *     """
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":149
+ * 
  *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)             # <<<<<<<<<<<<<<
+ *         return 0.5 * (p - y) * (p - y)             # <<<<<<<<<<<<<<
+ * 
  *     cpdef  double dloss(self, double p, double y):
- *         return y - p
  */
   __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
   goto __pyx_L0;
@@ -3419,12 +3413,12 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
- *     """
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+ *     """Squared euclidean norm of difference (regression loss)"""
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3453,29 +3447,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
       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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __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 = 145; __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 = 145; __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 = 148; __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 = 148; __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 148; __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 = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3493,9 +3488,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
- *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
@@ -3514,14 +3509,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3529,10 +3524,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3541,8 +3536,8 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
- *         return 0.5 * (p-y) * (p-y)
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
+ * 
  *     cpdef  double dloss(self, double p, double y):
  *         return y - p             # <<<<<<<<<<<<<<
  * 
@@ -3565,9 +3560,9 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
- *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
@@ -3599,29 +3594,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
       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 = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __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 = 147; __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 = 147; __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 = 151; __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 = 151; __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 = 147; __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 151; __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 = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3639,29 +3635,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":150
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
  *         return y - p
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return SquaredError,()
+ *         return SquaredError, ()
  * 
  */
 
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":155
  * 
  *     def __reduce__(self):
- *         return SquaredError,()             # <<<<<<<<<<<<<<
+ *         return SquaredError, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class Huber(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
@@ -3685,12 +3681,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
- *     """
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
  *     cdef double c
+ * 
  *     def __init__(self,c):             # <<<<<<<<<<<<<<
  *         self.c = c
- *     cpdef  double loss(self, double p, double y):
+ * 
  */
 
 static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3715,7 +3711,7 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
       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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_c = values[0];
   } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
@@ -3725,20 +3721,21 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
+  __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
- *     cdef double c
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+ * 
  *     def __init__(self,c):
  *         self.c = c             # <<<<<<<<<<<<<<
+ * 
  *     cpdef  double loss(self, double p, double y):
- *         cdef double r = p-y
  */
-  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
 
   __pyx_r = 0;
@@ -3751,9 +3748,9 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
- *     def __init__(self,c):
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
  *         self.c = c
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
@@ -3771,19 +3768,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("loss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3791,10 +3787,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3803,8 +3799,8 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
- *         self.c = c
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":176
+ * 
  *     cpdef  double loss(self, double p, double y):
  *         cdef double r = p-y             # <<<<<<<<<<<<<<
  *         cdef double abs_r = abs(r)
@@ -3812,23 +3808,23 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
  */
   __pyx_v_r = (__pyx_v_p - __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
  *     cpdef  double loss(self, double p, double y):
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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 = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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 = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
@@ -3838,7 +3834,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return 0.5 * r * r             # <<<<<<<<<<<<<<
@@ -3851,7 +3847,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":181
  *             return 0.5 * r * r
  *         else:
  *             return self.c * abs_r - (0.5*self.c*self.c)             # <<<<<<<<<<<<<<
@@ -3873,14 +3869,13 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.loss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
- *     def __init__(self,c):
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
  *         self.c = c
+ * 
  *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = p-y
  *         cdef double abs_r = abs(r)
@@ -3912,29 +3907,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
       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 = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __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 = 159; __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 = 159; __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 = 175; __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 = 175; __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 = 159; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 175; __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 = 175; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3952,7 +3948,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -3972,19 +3968,18 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   double __pyx_t_5;
   int __pyx_t_6;
   __Pyx_RefNannySetupContext("dloss");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
   /* Check if called by wrapper */
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __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_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3992,10 +3987,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -4004,7 +3999,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":184
  * 
  *     cpdef  double dloss(self, double p, double y):
  *         cdef double r = y - p             # <<<<<<<<<<<<<<
@@ -4013,23 +4008,23 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
  */
   __pyx_v_r = (__pyx_v_y - __pyx_v_p);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":185
  *     cpdef  double dloss(self, double p, double y):
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":186
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
@@ -4039,7 +4034,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":187
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return r             # <<<<<<<<<<<<<<
@@ -4051,17 +4046,17 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":188
  *         if abs_r <= self.c:
  *             return r
  *         elif r > 0:             # <<<<<<<<<<<<<<
  *             return self.c
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_r > 0);
+  __pyx_t_6 = (__pyx_v_r > 0.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":189
  *             return r
  *         elif r > 0:
  *             return self.c             # <<<<<<<<<<<<<<
@@ -4074,7 +4069,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":191
  *             return self.c
  *         else:
  *             return -self.c             # <<<<<<<<<<<<<<
@@ -4096,12 +4091,11 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   __Pyx_WriteUnraisable("sgd_fast_sparse.Huber.dloss");
   __pyx_r = 0;
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
  *             return self.c * abs_r - (0.5*self.c*self.c)
  * 
  *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -4135,29 +4129,30 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
       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;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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 = 183; __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;}
+    __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 = 183; __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 = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4175,37 +4170,37 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":193
  *             return -self.c
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return Huber,(self.c,)
+ *         return Huber, (self.c,)
  * 
  */
 
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused); /*proto*/
-static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, PyObject *unused) {
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
+static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
   PyObject *__pyx_r = NULL;
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":194
  * 
  *     def __reduce__(self):
- *         return Huber,(self.c,)             # <<<<<<<<<<<<<<
+ *         return Huber, (self.c,)             # <<<<<<<<<<<<<<
+ * 
  * 
- * @cython.boundscheck(False)
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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 = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__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 = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
@@ -4230,7 +4225,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
  * @cython.wraparound(False)
  * @cython.cdivision(True)
  * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
@@ -4239,7 +4234,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n    \n    ";
+static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Generic cython impl of SGD for various loss functions and penalties";
 static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_w = 0;
   double __pyx_v_intercept;
@@ -4317,11 +4312,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   PyObject *__pyx_t_10 = NULL;
   PyObject *__pyx_t_11 = NULL;
   PyObject *__pyx_t_12 = NULL;
-  int __pyx_t_13;
+  unsigned int __pyx_t_13;
   unsigned int __pyx_t_14;
   unsigned int __pyx_t_15;
-  unsigned int __pyx_t_16;
-  PyArrayObject *__pyx_t_17 = NULL;
+  PyArrayObject *__pyx_t_16 = NULL;
+  int __pyx_t_17;
   double __pyx_t_18;
   PyObject *__pyx_t_19 = NULL;
   int __pyx_t_20;
@@ -4361,129 +4356,125 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 200; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 186; __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 = 187; __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 203; __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 = 204; __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 = 204; __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 209; __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 = 209; __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 = 210; __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 = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
     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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 186; __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 = 187; __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 203; __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 = 204; __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 = 204; __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 209; __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 = 209; __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 = 210; __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 = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
+  __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_INCREF((PyObject *)__pyx_v_w);
-  __Pyx_INCREF((PyObject *)__pyx_v_loss);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_data);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_INCREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_INCREF((PyObject *)__pyx_v_Y);
   __pyx_v_t_start = Py_None; __Pyx_INCREF(Py_None);
   __pyx_bstruct_index.buf = NULL;
   __pyx_bstruct_q.buf = NULL;
@@ -4492,45 +4483,45 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_bstruct_X_indices.buf = NULL;
   __pyx_bstruct_X_indptr.buf = NULL;
   __pyx_bstruct_Y.buf = NULL;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __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 = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __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 = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __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)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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 = 200; __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];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    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 = 183; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
   __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":199
- *     """
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+ * 
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]             # <<<<<<<<<<<<<<
  *     cdef unsigned int n_features = w.shape[0]
@@ -4538,7 +4529,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]
  *     cdef unsigned int n_features = w.shape[0]             # <<<<<<<<<<<<<<
@@ -4547,7 +4538,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":202
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
  *     cdef unsigned int n_features = w.shape[0]
  * 
  *     cdef double *w_data_ptr = w.data             # <<<<<<<<<<<<<<
@@ -4556,7 +4547,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_w_data_ptr = ((double *)__pyx_v_w->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":203
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
  * 
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
@@ -4565,7 +4556,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_data_ptr = ((double *)__pyx_v_X_data->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
@@ -4574,7 +4565,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indptr_ptr = ((int *)__pyx_v_X_indptr->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data
  *     cdef int *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
@@ -4583,54 +4574,54 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indices_ptr = ((int *)__pyx_v_X_indices->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":208
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
  * 
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __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 = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":209
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                              dtype = np.int32)             # <<<<<<<<<<<<<<
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  */
-  __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 = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
       __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
@@ -4639,7 +4630,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_v_index = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data             # <<<<<<<<<<<<<<
@@ -4648,7 +4639,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_index_ptr = ((int *)__pyx_v_index->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0             # <<<<<<<<<<<<<<
@@ -4657,7 +4648,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_offset = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  *     cdef int xnnz = 0             # <<<<<<<<<<<<<<
@@ -4666,7 +4657,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_xnnz = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
  *     cdef int offset = 0
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0             # <<<<<<<<<<<<<<
@@ -4675,7 +4666,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wscale = 1.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0             # <<<<<<<<<<<<<<
@@ -4684,7 +4675,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0
  *     cdef double p = 0.0             # <<<<<<<<<<<<<<
@@ -4693,7 +4684,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_p = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
  *     cdef double eta = 0.0
  *     cdef double p = 0.0
  *     cdef double update = 0.0             # <<<<<<<<<<<<<<
@@ -4702,7 +4693,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_update = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
  *     cdef double p = 0.0
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<
@@ -4711,7 +4702,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sumloss = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0             # <<<<<<<<<<<<<<
@@ -4720,7 +4711,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0             # <<<<<<<<<<<<<<
@@ -4729,7 +4720,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0
  *     cdef double y = 0.0             # <<<<<<<<<<<<<<
@@ -4738,7 +4729,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_y = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
  *     cdef double t = 0.0
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<
@@ -4747,7 +4738,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_count = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<
@@ -4756,7 +4747,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_epoch = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
@@ -4765,7 +4756,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_i = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0             # <<<<<<<<<<<<<<
@@ -4774,7 +4765,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sample_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
@@ -4786,7 +4777,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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];
     }
@@ -4795,7 +4786,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
@@ -4805,46 +4796,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_8 = (__pyx_v_penalty_type != 2);
   if (__pyx_t_8) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")             # <<<<<<<<<<<<<<
  *         q_data_ptr =  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 = 228; __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 = 243; __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 = 228; __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 = 243; __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 = 228; __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 = 243; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __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 = 228; __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 = 243; __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 = 228; __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 = 243; __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 = 228; __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 = 243; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __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 = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__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 = 228; __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 = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
@@ -4861,14 +4852,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __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;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data             # <<<<<<<<<<<<<<
@@ -4880,7 +4871,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   }
   __pyx_L6:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
@@ -4889,7 +4880,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_u = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
  *     cdef double u = 0.0
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
@@ -4898,7 +4889,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -4907,7 +4898,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta0 = (__pyx_v_typw / __pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -4916,23 +4907,23 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = (1.0 / (__pyx_v_eta0 * __pyx_v_alpha));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch from 0 <= epoch < 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 = 235; __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 = 250; __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 = 235; __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 = 250; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_v_t_start);
   __pyx_v_t_start = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:             # <<<<<<<<<<<<<<
@@ -4942,7 +4933,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_9 = __pyx_v_n_iter;
   for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -4952,55 +4943,54 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.shuffle(index)
  */
-      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __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 = 253; __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 = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __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 = 253; __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(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_4)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       goto __pyx_L9;
     }
     __pyx_L9:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  */
-    __pyx_t_13 = __pyx_v_shuffle;
-    if (__pyx_t_13) {
+    if (__pyx_v_shuffle) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.shuffle(index)             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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 = 255; __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 = 240; __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 = 255; __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__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __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(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __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;
@@ -5009,27 +4999,27 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __pyx_L10:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
  *         if shuffle:
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:             # <<<<<<<<<<<<<<
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  */
-    __pyx_t_14 = __pyx_v_n_samples;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
+    __pyx_t_13 = __pyx_v_n_samples;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_13; __pyx_v_i++) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]             # <<<<<<<<<<<<<<
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  */
-      __pyx_t_15 = __pyx_v_i;
-      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index));
+      __pyx_t_14 = __pyx_v_i;
+      __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_14, __pyx_bstride_0_index));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -5038,7 +5028,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -5047,17 +5037,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]             # <<<<<<<<<<<<<<
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  */
-      __pyx_t_16 = __pyx_v_sample_idx;
-      __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y));
+      __pyx_t_15 = __pyx_v_sample_idx;
+      __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_15, __pyx_bstride_0_Y));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]
  *             eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5066,7 +5056,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":263
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -5075,7 +5065,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_p = ((__pyx_f_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);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
@@ -5084,7 +5074,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<
@@ -5093,17 +5083,17 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)
  *             if update != 0:             # <<<<<<<<<<<<<<
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  */
-      __pyx_t_8 = (__pyx_v_update != 0);
+      __pyx_t_8 = (__pyx_v_update != 0.0);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
  *             if update != 0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)             # <<<<<<<<<<<<<<
@@ -5112,7 +5102,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_f_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);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
@@ -5122,7 +5112,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         __pyx_t_8 = (__pyx_v_fit_intercept == 1);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
+          /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01             # <<<<<<<<<<<<<<
@@ -5137,7 +5127,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L13:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
@@ -5147,44 +5137,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_8 = (__pyx_v_penalty_type != 1);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
  *                 wscale *= (1 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
  *                 if wscale < 1e-9:
  *                     w *= wscale
  */
-        __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
+        __pyx_v_wscale *= (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
  *             if penalty_type != L1:
  *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
  *                     w *= wscale
  *                     wscale = 1.0
  */
-        __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09);
+        __pyx_t_8 = (__pyx_v_wscale < 1e-9);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
+          /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":274
  *                 wscale *= (1 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  *                     w *= wscale             # <<<<<<<<<<<<<<
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __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 = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_17 = ((PyArrayObject *)__pyx_t_3);
+          __pyx_t_16 = ((PyArrayObject *)__pyx_t_3);
           {
             __Pyx_BufFmt_StackElem __pyx_stack[1];
             __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-            __pyx_t_13 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
-            if (unlikely(__pyx_t_13 < 0)) {
+            __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_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);
@@ -5195,14 +5185,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
             }
             __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
             __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_t_17 = 0;
+          __pyx_t_16 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
           __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
+          /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
@@ -5217,7 +5207,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L15:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -5228,16 +5218,16 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         case 1:
         case 3:
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
  *                 u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  */
-        __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+        __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
  *                 u += ((1 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
@@ -5248,16 +5238,16 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         break;
       }
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":280
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
  */
-      __pyx_v_t += 1;
+      __pyx_v_t += 1.0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":281
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
@@ -5267,7 +5257,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_v_count += 1;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
  *             t += 1
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
@@ -5278,29 +5268,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       case 1:
       case 3:
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
  *             u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
  * 
  */
-      __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+      __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
  *             u += ((1 - rho) * eta * alpha)
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)             # <<<<<<<<<<<<<<
  * 
- *         # report epoche information
+ *         # report epoch progress information
  */
       __pyx_f_15sgd_fast_sparse_finall1penalty(__pyx_v_w_data_ptr, __pyx_v_wscale, __pyx_v_n_features, __pyx_v_q_data_ptr, __pyx_v_u);
       break;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
  * 
- *         # report epoche information
+ *         # report epoch progress information
  *         if verbose > 0:             # <<<<<<<<<<<<<<
  *             wnorm = sqrt(np.dot(w, w) * wscale * wscale)
  *             print("Norm: %.2f, NNZs: %d, "\
@@ -5308,19 +5298,19 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
- *         # report epoche information
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":288
+ *         # report epoch progress 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 = 273; __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 = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
@@ -5328,80 +5318,80 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __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_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __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 = 273; __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 = 288; __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 = 273; __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 = 288; __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_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __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 = 288; __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 = 273; __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 = 288; __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_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":290
  *             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_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
  *             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 = 276; __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 = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":292
  *             "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_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __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 = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
  *                                                     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 = 278; __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 = 293; __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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
@@ -5418,165 +5408,165 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_5 = 0;
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_2));
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  *                                                     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 = 279; __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 = 294; __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 = 279; __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 = 294; __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 = 279; __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 = 294; __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 = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_19);
+      __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 = 294; __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(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
+      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_19)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(((PyObject *)__pyx_t_19)); __pyx_t_19 = 0;
       goto __pyx_L17;
     }
     __pyx_L17:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":297
  * 
  *         # 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 = 282; __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 = 297; __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 = 282; __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 = 297; __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 = 282; __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 = 297; __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 = 282; __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 = 297; __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
     PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (!__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
  *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":297
  * 
  *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_20) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+        /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
  *         # 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 = 283; __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 = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __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 = 283; __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 = 298; __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 = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_DECREF(__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 = 283; __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 = 298; __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 = 283; __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 = 298; __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 = 283; __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 = 298; __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 = 283; __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 = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
           PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __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 = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __pyx_t_23 = __pyx_t_22;
         } else {
@@ -5592,47 +5582,47 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     if (__pyx_t_20) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":299
  *         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 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L18;
     }
     __pyx_L18:;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":301
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);
+  __pyx_t_16 = ((PyArrayObject *)__pyx_t_1);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     __Pyx_SafeReleaseBuffer(&__pyx_bstruct_w);
-    __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_bstruct_w, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack);
+    __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_bstruct_w, (PyObject*)__pyx_v_w, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {
@@ -5644,14 +5634,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __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 = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  __pyx_t_17 = 0;
+  __pyx_t_16 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
   __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -5659,9 +5649,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __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 = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
@@ -5708,17 +5698,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_XDECREF((PyObject *)__pyx_v_q);
   __Pyx_DECREF(__pyx_v_t_start);
   __Pyx_DECREF((PyObject *)__pyx_v_w);
-  __Pyx_DECREF((PyObject *)__pyx_v_loss);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_data);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indices);
-  __Pyx_DECREF((PyObject *)__pyx_v_X_indptr);
-  __Pyx_DECREF((PyObject *)__pyx_v_Y);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":290
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":305
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -5731,12 +5716,12 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("max");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef inline double min(double a, double b):
+ * 
  */
   if ((__pyx_v_a >= __pyx_v_b)) {
     __pyx_t_1 = __pyx_v_a;
@@ -5752,8 +5737,8 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
- *     return a if a >= b else b
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+ * 
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
  *     return a if a <= b else b
@@ -5765,12 +5750,12 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("min");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":310
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
+ * 
  */
   if ((__pyx_v_a <= __pyx_v_b)) {
     __pyx_t_1 = __pyx_v_a;
@@ -5786,8 +5771,8 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":296
- *     return a if a <= b else b
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
+ * 
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
  *                 int offset, int xnnz):
@@ -5801,7 +5786,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("dot");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  *                 int offset, int xnnz):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -5810,7 +5795,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_sum = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":300
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5820,7 +5805,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":301
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5830,12 +5815,12 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
     __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)]));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
  * 
- * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
+ * 
  */
   __pyx_r = __pyx_v_sum;
   goto __pyx_L0;
@@ -5846,12 +5831,12 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
- *     return sum
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":322
+ * 
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
  *                 int *X_indices_ptr, int offset, int xnnz, double c):
- *     """Scales example x by constant c and adds it to the weight vector w.
+ *     """Scales example x by constant c and adds it to the weight vector w"""
  */
 
 static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, double *__pyx_v_X_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz, double __pyx_v_c) {
@@ -5864,7 +5849,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("add");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
  *     cdef int idx
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -5873,7 +5858,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -5882,7 +5867,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5892,7 +5877,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5901,7 +5886,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5910,7 +5895,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":316
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":334
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
@@ -5919,7 +5904,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":335
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -5928,7 +5913,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":336
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -5938,12 +5923,12 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
     (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
  * 
- * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
+ * 
  */
   __pyx_r = (((__pyx_v_xsqnorm * __pyx_v_c) * __pyx_v_c) + (((2.0 * __pyx_v_innerprod) * __pyx_v_wscale) * __pyx_v_c));
   goto __pyx_L0;
@@ -5954,12 +5939,12 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":321
- *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":340
+ * 
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
  *                     int *X_indices_ptr, int offset, int xnnz, double u):
- *     """Applys the L1 penalty to each updated feature.
+ *     """Apply the L1 penalty to each updated feature
  */
 
 static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, double __pyx_v_wscale, double *__pyx_v_q_data_ptr, int *__pyx_v_X_indices_ptr, int __pyx_v_offset, int __pyx_v_xnnz, double __pyx_v_u) {
@@ -5970,7 +5955,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":347
  *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -5979,7 +5964,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":348
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -5988,7 +5973,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":349
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     cdef int idx = 0             # <<<<<<<<<<<<<<
@@ -5997,7 +5982,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":350
  *     cdef int j = 0
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -6007,7 +5992,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -6016,7 +6001,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":352
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
@@ -6025,55 +6010,55 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":353
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
  *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  *                                                         / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":334
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":354
  *         z = w_data_ptr[idx]
  *         if (wscale * w_data_ptr[idx]) > 0:
  *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])             # <<<<<<<<<<<<<<
  *                                                         / wscale) )
  *         elif (wscale * w_data_ptr[idx]) < 0:
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":336
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":356
  *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  *                                                         / wscale) )
  *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
  *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
  *                                                         / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":357
  *                                                         / wscale) )
  *         elif (wscale * w_data_ptr[idx]) < 0:
  *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])             # <<<<<<<<<<<<<<
  *                                                         / wscale) )
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":339
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":359
  *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
  *                                                         / wscale) )
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
  * 
- * cdef void finall1penalty(double *w_data_ptr, double wscale,
+ * 
  */
     (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
   }
@@ -6081,8 +6066,8 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":341
- *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
+/* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":362
+ * 
  * 
  * cdef void finall1penalty(double *w_data_ptr, double wscale,             # <<<<<<<<<<<<<<
  *                          unsigned int n_features,
@@ -6096,8 +6081,8 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("finall1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
- * 
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":372
+ *     Experimental: this was proposed by Bob Carpenter (LingPipe).
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
  *     cdef int j = 0
@@ -6105,7 +6090,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":352
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":373
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -6114,7 +6099,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":353
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":374
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:             # <<<<<<<<<<<<<<
@@ -6124,7 +6109,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   __pyx_t_1 = __pyx_v_n_features;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":354
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":375
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]             # <<<<<<<<<<<<<<
@@ -6133,50 +6118,50 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_j]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":355
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":376
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0:             # <<<<<<<<<<<<<<
  *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
  *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":356
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":377
  *         z = w_data_ptr[j]
  *         if (wscale * w_data_ptr[j]) > 0:
  *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])             # <<<<<<<<<<<<<<
  *                                                     / wscale) )
  *         elif (wscale * w_data_ptr[j]) < 0:
  */
-      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_j]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":358
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":379
  *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
  *                                                     / wscale) )
  *         elif (wscale * w_data_ptr[j]) < 0:             # <<<<<<<<<<<<<<
  *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
  *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":359
+      /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":380
  *                                                     / wscale) )
  *         elif (wscale * w_data_ptr[j]) < 0:
  *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])             # <<<<<<<<<<<<<<
  *                                                     / wscale) )
  *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))
  */
-      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_j]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":361
+    /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":382
  *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
  *                                                     / wscale) )
  *         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))             # <<<<<<<<<<<<<<
@@ -6188,7 +6173,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":187
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":188
  *         # experimental exception made for __getbuffer__ and __releasebuffer__
  *         # -- the details of this may change.
  *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
@@ -6196,8 +6181,8 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  *             # requirements, and does not yet fullfill the PEP.
  */
 
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
-static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
+static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/
+static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {
   int __pyx_v_copy_shape;
   int __pyx_v_i;
   int __pyx_v_ndim;
@@ -6222,9 +6207,8 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   if (__pyx_v_info == NULL) return 0;
   __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);
   __Pyx_GIVEREF(__pyx_v_info->obj);
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":193
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":194
  *             # of flags
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -6233,7 +6217,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":194
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":195
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -6242,7 +6226,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":196
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":197
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)
  * 
  *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
@@ -6251,7 +6235,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":198
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":199
  *             ndim = PyArray_NDIM(self)
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -6261,7 +6245,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":199
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":200
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 copy_shape = 1             # <<<<<<<<<<<<<<
@@ -6273,7 +6257,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":201
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":202
  *                 copy_shape = 1
  *             else:
  *                 copy_shape = 0             # <<<<<<<<<<<<<<
@@ -6284,7 +6268,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":203
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":204
  *                 copy_shape = 0
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
@@ -6294,7 +6278,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":204
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":205
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
@@ -6308,29 +6292,29 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":205
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":206
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  */
-    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_5));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));
-    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_Raise(__pyx_t_5, 0, 0);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L6;
   }
   __pyx_L6:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":207
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":208
  *                 raise ValueError(u"ndarray is not C contiguous")
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
@@ -6340,7 +6324,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
   if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":208
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":209
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
@@ -6354,29 +6338,29 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_2) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":209
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":210
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
  * 
  *             info.buf = PyArray_DATA(self)
  */
-    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));
     PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_6));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));
-    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_Raise(__pyx_t_4, 0, 0);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L7;
   }
   __pyx_L7:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":211
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":212
  *                 raise ValueError(u"ndarray is not Fortran contiguous")
  * 
  *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
@@ -6385,7 +6369,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":212
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":213
  * 
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim             # <<<<<<<<<<<<<<
@@ -6394,17 +6378,16 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":213
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":214
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim
  *             if copy_shape:             # <<<<<<<<<<<<<<
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  */
-  __pyx_t_6 = __pyx_v_copy_shape;
-  if (__pyx_t_6) {
+  if (__pyx_v_copy_shape) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":216
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":217
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<
@@ -6413,7 +6396,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":217
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":218
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
@@ -6422,7 +6405,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":218
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":219
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):             # <<<<<<<<<<<<<<
@@ -6433,7 +6416,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
       __pyx_v_i = __pyx_t_7;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":219
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":220
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
@@ -6442,7 +6425,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
       (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":220
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":221
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
@@ -6455,7 +6438,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":222
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":223
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  *             else:
  *                 info.strides = PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
@@ -6464,7 +6447,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":223
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":224
  *             else:
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)             # <<<<<<<<<<<<<<
@@ -6475,7 +6458,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L8:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":224
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":225
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
@@ -6484,7 +6467,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->suboffsets = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":225
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":226
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
@@ -6493,7 +6476,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":226
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":227
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)
  *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
@@ -6502,7 +6485,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":229
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":230
  * 
  *             cdef int t
  *             cdef char* f = NULL             # <<<<<<<<<<<<<<
@@ -6511,7 +6494,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_f = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":230
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":231
  *             cdef int t
  *             cdef char* f = NULL
  *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
@@ -6521,7 +6504,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
   __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":234
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":235
  *             cdef int offset
  * 
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
@@ -6530,7 +6513,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":236
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":237
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
  * 
  *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
@@ -6546,7 +6529,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":238
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":239
  *             if not hasfields and not copy_shape:
  *                 # do not call releasebuffer
  *                 info.obj = None             # <<<<<<<<<<<<<<
@@ -6562,7 +6545,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":241
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":242
  *             else:
  *                 # need to call releasebuffer
  *                 info.obj = self             # <<<<<<<<<<<<<<
@@ -6577,7 +6560,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L11:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":243
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":244
  *                 info.obj = self
  * 
  *             if not hasfields:             # <<<<<<<<<<<<<<
@@ -6587,7 +6570,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = (!__pyx_v_hasfields);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":244
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":245
  * 
  *             if not hasfields:
  *                 t = descr.type_num             # <<<<<<<<<<<<<<
@@ -6596,7 +6579,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_t = __pyx_v_descr->type_num;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":245
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":246
  *             if not hasfields:
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
@@ -6611,7 +6594,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     if (!__pyx_t_2) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":246
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":247
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
@@ -6631,29 +6614,29 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     if (__pyx_t_1) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":247
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":248
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  */
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
       PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_kp_u_7));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":248
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":249
  *                     (descr.byteorder == '<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
@@ -6666,7 +6649,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":249
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":250
  *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
@@ -6679,7 +6662,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":250
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":251
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
@@ -6692,7 +6675,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":251
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":252
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
@@ -6705,7 +6688,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":252
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":253
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
@@ -6718,7 +6701,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":253
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":254
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
@@ -6731,7 +6714,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":254
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":255
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
@@ -6744,7 +6727,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":255
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":256
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
@@ -6757,7 +6740,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":256
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":257
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
@@ -6770,7 +6753,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":257
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":258
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
@@ -6783,7 +6766,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":258
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":259
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
@@ -6796,7 +6779,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":259
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":260
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
@@ -6809,7 +6792,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":260
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":261
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
@@ -6822,7 +6805,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":261
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":262
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
@@ -6835,7 +6818,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":262
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":263
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
@@ -6848,7 +6831,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":263
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":264
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
@@ -6861,7 +6844,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":264
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":265
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
@@ -6875,33 +6858,33 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":266
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":267
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *                 info.format = f
  *                 return
  */
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_4 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(((PyObject *)__pyx_t_4));
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
-      __Pyx_GIVEREF(__pyx_t_4);
+      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_4));
+      __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_4, 0, 0);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_L14:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":267
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":268
  *                 else:
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f             # <<<<<<<<<<<<<<
@@ -6910,7 +6893,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = __pyx_v_f;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":268
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":269
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f
  *                 return             # <<<<<<<<<<<<<<
@@ -6923,7 +6906,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":270
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":271
  *                 return
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
@@ -6932,7 +6915,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = ((char *)malloc(255));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":271
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":272
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
@@ -6941,7 +6924,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     (__pyx_v_info->format[0]) = '^';
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":272
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":273
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment
  *                 offset = 0             # <<<<<<<<<<<<<<
@@ -6950,17 +6933,17 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_offset = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":275
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":276
  *                 f = _util_dtypestring(descr, info.format + 1,
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)             # <<<<<<<<<<<<<<
  *                 f[0] = 0 # Terminate format string
  * 
  */
-    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_f = __pyx_t_9;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":276
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":277
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)
  *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<
@@ -6988,12 +6971,11 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L2:;
   __Pyx_XDECREF((PyObject *)__pyx_v_descr);
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":278
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":279
  *                 f[0] = 0 # Terminate format string
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
@@ -7001,13 +6983,12 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  *                 stdlib.free(info.format)
  */
 
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
-static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
+static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/
+static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__releasebuffer__");
-  __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":279
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":280
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
@@ -7017,7 +6998,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":280
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":281
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
@@ -7029,7 +7010,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":281
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":282
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -7039,7 +7020,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":282
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":283
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
@@ -7051,11 +7032,10 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   }
   __pyx_L6:;
 
-  __Pyx_DECREF((PyObject *)__pyx_v_self);
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":755
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":756
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -7068,7 +7048,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":756
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":757
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, a)             # <<<<<<<<<<<<<<
@@ -7076,7 +7056,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
  * cdef inline object PyArray_MultiIterNew2(a, b):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7094,7 +7074,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":758
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":759
  *     return PyArray_MultiIterNew(1, a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -7107,7 +7087,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":759
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":760
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, a, b)             # <<<<<<<<<<<<<<
@@ -7115,7 +7095,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7133,7 +7113,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":761
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":762
  *     return PyArray_MultiIterNew(2, a, b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -7146,7 +7126,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":762
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":763
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, a, b,  c)             # <<<<<<<<<<<<<<
@@ -7154,7 +7134,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7172,7 +7152,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":764
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":765
  *     return PyArray_MultiIterNew(3, a, b,  c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -7185,7 +7165,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":765
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":766
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, a, b, c,  d)             # <<<<<<<<<<<<<<
@@ -7193,7 +7173,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7211,7 +7191,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":767
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":768
  *     return PyArray_MultiIterNew(4, a, b, c,  d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -7224,7 +7204,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":768
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":769
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)             # <<<<<<<<<<<<<<
@@ -7232,7 +7212,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
  * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -7250,7 +7230,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":770
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":771
  *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
  * 
  * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
@@ -7278,14 +7258,13 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   int __pyx_t_9;
   char *__pyx_t_10;
   __Pyx_RefNannySetupContext("_util_dtypestring");
-  __Pyx_INCREF((PyObject *)__pyx_v_descr);
   __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);
   __pyx_v_fields = ((PyObject *)Py_None); __Pyx_INCREF(Py_None);
   __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":777
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":778
  *     cdef int delta_offset
  *     cdef tuple i
  *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -7294,7 +7273,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":778
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":779
  *     cdef tuple i
  *     cdef int endian_detector = 1
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -7303,7 +7282,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":781
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":782
  *     cdef tuple fields
  * 
  *     for childname in descr.names:             # <<<<<<<<<<<<<<
@@ -7313,7 +7292,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   if (likely(((PyObject *)__pyx_v_descr->names) != Py_None)) {
     __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);
   } else {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   for (;;) {
     if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
@@ -7322,21 +7301,21 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __pyx_v_childname = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":782
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":783
  * 
  *     for childname in descr.names:
  *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
  *         child, new_offset = fields
  * 
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_v_fields));
     __pyx_v_fields = ((PyObject *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":783
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":784
  *     for childname in descr.names:
  *         fields = descr.fields[childname]
  *         child, new_offset = fields             # <<<<<<<<<<<<<<
@@ -7346,7 +7325,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {
       PyObject* tuple = ((PyObject *)__pyx_v_fields);
       __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);
-      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);
       __Pyx_DECREF(((PyObject *)__pyx_v_child));
       __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);
@@ -7356,57 +7335,57 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       __pyx_t_4 = 0;
     } else {
       __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":785
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":786
  *         child, new_offset = fields
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
  * 
  */
-    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 785; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":786
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":787
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  */
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_kp_u_9));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));
-      __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_3, 0, 0);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":788
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":789
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
  * 
  *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
@@ -7421,7 +7400,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     if (!__pyx_t_7) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":789
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":790
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
@@ -7441,29 +7420,29 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":790
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":791
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):
  *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
  *             # One could encode it in the format string and have Cython
  *             # complain instead, BUT: < and > in format strings also imply
  */
-      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_7));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 790; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":800
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":801
  * 
  *         # Output padding bytes
  *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
@@ -7471,16 +7450,16 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  *             f += 1
  */
     while (1) {
-      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (!__pyx_t_6) break;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":801
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":802
  *         # Output padding bytes
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
@@ -7489,7 +7468,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       (__pyx_v_f[0]) = 120;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":802
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":803
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7498,7 +7477,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       __pyx_v_f += 1;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":803
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":804
  *             f[0] = 120 # "x"; pad byte
  *             f += 1
  *             offset[0] += 1             # <<<<<<<<<<<<<<
@@ -7508,7 +7487,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       (__pyx_v_offset[0]) += 1;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":805
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":806
  *             offset[0] += 1
  * 
  *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
@@ -7517,7 +7496,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
     (__pyx_v_offset[0]) += __pyx_v_child->elsize;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":807
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":808
  *         offset[0] += child.itemsize
  * 
  *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
@@ -7527,20 +7506,20 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":808
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":809
  * 
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num             # <<<<<<<<<<<<<<
  *             if end - f < 5:
  *                 raise RuntimeError(u"Format string allocated too short.")
  */
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 808; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_v_t);
       __pyx_v_t = __pyx_t_3;
       __pyx_t_3 = 0;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":809
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":810
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num
  *             if end - f < 5:             # <<<<<<<<<<<<<<
@@ -7550,288 +7529,288 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);
       if (__pyx_t_6) {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":810
+        /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":811
  *             t = child.type_num
  *             if end - f < 5:
  *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  */
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));
         PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_u_10));
         __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));
-        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_Raise(__pyx_t_5, 0, 0);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 810; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         goto __pyx_L10;
       }
       __pyx_L10:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":813
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":814
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 98;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":814
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":815
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 66;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":815
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":816
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 104;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":816
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":817
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 72;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":817
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":818
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 105;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":818
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":819
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 73;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":819
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":820
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 108;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":820
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":821
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 76;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":821
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":822
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 113;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":822
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":823
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 81;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":823
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":824
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 102;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":824
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":825
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 100;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":825
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":826
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 103;
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":826
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":827
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
@@ -7840,19 +7819,19 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":827
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":828
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
@@ -7861,19 +7840,19 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":828
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":829
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
  */
-      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 90;
@@ -7882,19 +7861,19 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":829
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":830
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
  *             else:
  *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  */
-      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (__pyx_t_6) {
         (__pyx_v_f[0]) = 79;
@@ -7902,30 +7881,30 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       }
       /*else*/ {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":831
+        /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":832
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
  *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
  *             f += 1
  *         else:
  */
-        __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_8), __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+        __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
-        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
-        __Pyx_GIVEREF(__pyx_t_3);
+        PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_t_3));
+        __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
         __pyx_t_3 = 0;
-        __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_Raise(__pyx_t_3, 0, 0);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_L11:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":832
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":833
  *             else:
  *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7937,21 +7916,21 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":836
+      /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":837
  *             # Cython ignores struct boundary information ("T{...}"),
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
  *     return f
  * 
  */
-      __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_v_f = __pyx_t_10;
     }
     __pyx_L9:;
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":837
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":838
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)
  *     return f             # <<<<<<<<<<<<<<
@@ -7976,12 +7955,11 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   __Pyx_DECREF(__pyx_v_childname);
   __Pyx_DECREF(__pyx_v_new_offset);
   __Pyx_DECREF(__pyx_v_t);
-  __Pyx_DECREF((PyObject *)__pyx_v_descr);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":952
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":953
  * 
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -7993,10 +7971,8 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   PyObject *__pyx_v_baseptr;
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("set_array_base");
-  __Pyx_INCREF((PyObject *)__pyx_v_arr);
-  __Pyx_INCREF(__pyx_v_base);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":954
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":955
  * cdef inline void set_array_base(ndarray arr, object base):
  *      cdef PyObject* baseptr
  *      if base is None:             # <<<<<<<<<<<<<<
@@ -8006,7 +7982,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __pyx_t_1 = (__pyx_v_base == Py_None);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":955
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":956
  *      cdef PyObject* baseptr
  *      if base is None:
  *          baseptr = NULL             # <<<<<<<<<<<<<<
@@ -8018,7 +7994,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":957
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":958
  *          baseptr = NULL
  *      else:
  *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
@@ -8027,7 +8003,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
     Py_INCREF(__pyx_v_base);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":958
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":959
  *      else:
  *          Py_INCREF(base) # important to do this before decref below!
  *          baseptr = base             # <<<<<<<<<<<<<<
@@ -8038,7 +8014,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   }
   __pyx_L3:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":959
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":960
  *          Py_INCREF(base) # important to do this before decref below!
  *          baseptr = base
  *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
@@ -8047,7 +8023,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_XDECREF(__pyx_v_arr->base);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":960
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":961
  *          baseptr = base
  *      Py_XDECREF(arr.base)
  *      arr.base = baseptr             # <<<<<<<<<<<<<<
@@ -8056,12 +8032,10 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   __pyx_v_arr->base = __pyx_v_baseptr;
 
-  __Pyx_DECREF((PyObject *)__pyx_v_arr);
-  __Pyx_DECREF(__pyx_v_base);
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":962
+/* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":963
  *      arr.base = baseptr
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -8073,9 +8047,8 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   PyObject *__pyx_r = NULL;
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("get_array_base");
-  __Pyx_INCREF((PyObject *)__pyx_v_arr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":963
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":964
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     if arr.base is NULL:             # <<<<<<<<<<<<<<
@@ -8085,7 +8058,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = (__pyx_v_arr->base == NULL);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":964
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":965
  * cdef inline object get_array_base(ndarray arr):
  *     if arr.base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -8100,7 +8073,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":966
+    /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":967
  *         return None
  *     else:
  *         return arr.base             # <<<<<<<<<<<<<<
@@ -8114,7 +8087,6 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   __pyx_L0:;
-  __Pyx_DECREF((PyObject *)__pyx_v_arr);
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -8134,7 +8106,7 @@ static void __pyx_tp_dealloc_15sgd_fast_sparse_LossFunction(PyObject *o) {
   (*Py_TYPE(o)->tp_free)(o);
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_LossFunction[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_LossFunction[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12LossFunction_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_12LossFunction_loss)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_12LossFunction_dloss)},
   {0, 0, 0, 0}
@@ -8164,10 +8136,10 @@ static PyNumberMethods __pyx_tp_as_number_LossFunction = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -8193,7 +8165,7 @@ static PyNumberMethods __pyx_tp_as_number_LossFunction = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -8247,7 +8219,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_LossFunction = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_LossFunction, /*tp_as_number*/
   &__pyx_tp_as_sequence_LossFunction, /*tp_as_sequence*/
@@ -8300,7 +8276,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_Regression(PyTypeObject *t, PyOb
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Regression[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_Regression[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_10Regression_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_10Regression_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
@@ -8330,10 +8306,10 @@ static PyNumberMethods __pyx_tp_as_number_Regression = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -8359,7 +8335,7 @@ static PyNumberMethods __pyx_tp_as_number_Regression = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -8413,7 +8389,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Regression = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_Regression, /*tp_as_number*/
   &__pyx_tp_as_sequence_Regression, /*tp_as_sequence*/
@@ -8466,7 +8446,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_Classification(PyTypeObject *t,
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Classification[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_Classification[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_14Classification_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_14Classification_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {0, 0, 0, 0}
@@ -8496,10 +8476,10 @@ static PyNumberMethods __pyx_tp_as_number_Classification = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -8525,7 +8505,7 @@ static PyNumberMethods __pyx_tp_as_number_Classification = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -8579,7 +8559,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Classification = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_Classification, /*tp_as_number*/
   &__pyx_tp_as_sequence_Classification, /*tp_as_sequence*/
@@ -8632,7 +8616,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_ModifiedHuber(PyTypeObject *t, P
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_ModifiedHuber[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_ModifiedHuber[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},
@@ -8663,10 +8647,10 @@ static PyNumberMethods __pyx_tp_as_number_ModifiedHuber = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -8692,7 +8676,7 @@ static PyNumberMethods __pyx_tp_as_number_ModifiedHuber = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -8746,7 +8730,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_ModifiedHuber = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_ModifiedHuber, /*tp_as_number*/
   &__pyx_tp_as_sequence_ModifiedHuber, /*tp_as_sequence*/
@@ -8758,7 +8746,7 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_ModifiedHuber = {
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_ModifiedHuber, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
-  __Pyx_DOCSTR("Modified Huber loss function for binary\n    classification tasks with y in {-1,1}.\n    Its equivalent to quadratically smoothed SVM\n    with gamma = 2.\n\n    See T. Zhang 'Solving\n    Large Scale Linear Prediction Problems Using\n    Stochastic Gradient Descent', ICML'04.\n    "), /*tp_doc*/
+  __Pyx_DOCSTR("Modified Huber loss for binary classification with y in {-1, 1}\n\n    This is equivalent to quadratically smoothed SVM with gamma = 2.\n\n    See T. Zhang 'Solving Large Scale Linear Prediction Problems Using\n    Stochastic Gradient Descent', ICML'04.\n    "), /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
@@ -8799,7 +8787,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_Hinge(PyTypeObject *t, PyObject
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Hinge[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_Hinge[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},
@@ -8830,10 +8818,10 @@ static PyNumberMethods __pyx_tp_as_number_Hinge = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -8859,7 +8847,7 @@ static PyNumberMethods __pyx_tp_as_number_Hinge = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -8913,7 +8901,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Hinge = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_Hinge, /*tp_as_number*/
   &__pyx_tp_as_sequence_Hinge, /*tp_as_sequence*/
@@ -8925,7 +8917,7 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Hinge = {
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Hinge, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
-  __Pyx_DOCSTR("SVM classification loss for binary\n    classification tasks with y in {-1,1}.\n    "), /*tp_doc*/
+  __Pyx_DOCSTR("SVM classification loss for binary classification with y in {-1, 1}"), /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
@@ -8966,7 +8958,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_Log(PyTypeObject *t, PyObject *a
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Log[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_Log[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_3Log___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},
@@ -8997,10 +8989,10 @@ static PyNumberMethods __pyx_tp_as_number_Log = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -9026,7 +9018,7 @@ static PyNumberMethods __pyx_tp_as_number_Log = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -9080,7 +9072,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Log = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_Log, /*tp_as_number*/
   &__pyx_tp_as_sequence_Log, /*tp_as_sequence*/
@@ -9092,7 +9088,7 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Log = {
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Log, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
-  __Pyx_DOCSTR("Logistic regression loss for binary classification\n    tasks with y in {-1,1}.\n    "), /*tp_doc*/
+  __Pyx_DOCSTR("Logistic regression loss for binary classification with y in {-1, 1}"), /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
@@ -9133,7 +9129,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_SquaredError(PyTypeObject *t, Py
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_SquaredError[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_SquaredError[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},
@@ -9164,10 +9160,10 @@ static PyNumberMethods __pyx_tp_as_number_SquaredError = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -9193,7 +9189,7 @@ static PyNumberMethods __pyx_tp_as_number_SquaredError = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -9247,7 +9243,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_SquaredError = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_SquaredError, /*tp_as_number*/
   &__pyx_tp_as_sequence_SquaredError, /*tp_as_sequence*/
@@ -9259,7 +9259,7 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_SquaredError = {
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_SquaredError, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
-  __Pyx_DOCSTR("\n    "), /*tp_doc*/
+  __Pyx_DOCSTR("Squared euclidean norm of difference (regression loss)"), /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
@@ -9300,7 +9300,7 @@ static PyObject *__pyx_tp_new_15sgd_fast_sparse_Huber(PyTypeObject *t, PyObject
   return o;
 }
 
-static struct PyMethodDef __pyx_methods_15sgd_fast_sparse_Huber[] = {
+static PyMethodDef __pyx_methods_15sgd_fast_sparse_Huber[] = {
   {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber_loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber_dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},
   {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_5Huber___reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},
@@ -9331,10 +9331,10 @@ static PyNumberMethods __pyx_tp_as_number_Huber = {
   0, /*nb_coerce*/
   #endif
   0, /*nb_int*/
-  #if PY_MAJOR_VERSION >= 3
-  0, /*reserved*/
-  #else
+  #if PY_MAJOR_VERSION < 3
   0, /*nb_long*/
+  #else
+  0, /*reserved*/
   #endif
   0, /*nb_float*/
   #if PY_MAJOR_VERSION < 3
@@ -9360,7 +9360,7 @@ static PyNumberMethods __pyx_tp_as_number_Huber = {
   0, /*nb_true_divide*/
   0, /*nb_inplace_floor_divide*/
   0, /*nb_inplace_true_divide*/
-  #if (PY_MAJOR_VERSION >= 3) || (Py_TPFLAGS_DEFAULT & Py_TPFLAGS_HAVE_INDEX)
+  #if PY_VERSION_HEX >= 0x02050000
   0, /*nb_index*/
   #endif
 };
@@ -9414,7 +9414,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = {
   0, /*tp_print*/
   0, /*tp_getattr*/
   0, /*tp_setattr*/
+  #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
+  #else
+  0, /*reserved*/
+  #endif
   0, /*tp_repr*/
   &__pyx_tp_as_number_Huber, /*tp_as_number*/
   &__pyx_tp_as_sequence_Huber, /*tp_as_sequence*/
@@ -9426,7 +9430,7 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = {
   0, /*tp_setattro*/
   &__pyx_tp_as_buffer_Huber, /*tp_as_buffer*/
   Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_NEWBUFFER, /*tp_flags*/
-  __Pyx_DOCSTR("\n    "), /*tp_doc*/
+  __Pyx_DOCSTR("Huber regression loss\n\n    Variant of the SquaredError that is robust to outliers (quadratic near zero,\n    linear in for large errors).\n\n    References\n    ----------\n\n    http://en.wikipedia.org/wiki/Huber_Loss_Function\n    "), /*tp_doc*/
   0, /*tp_traverse*/
   0, /*tp_clear*/
   0, /*tp_richcompare*/
@@ -9457,13 +9461,11 @@ PyTypeObject __pyx_type_15sgd_fast_sparse_Huber = {
   #endif
 };
 
-static struct PyMethodDef __pyx_methods[] = {
+static PyMethodDef __pyx_methods[] = {
   {__Pyx_NAMESTR("plain_sgd"), (PyCFunction)__pyx_pf_15sgd_fast_sparse_plain_sgd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_15sgd_fast_sparse_plain_sgd)},
   {0, 0, 0, 0}
 };
 
-static void __pyx_init_filenames(void); /*proto*/
-
 #if PY_MAJOR_VERSION >= 3
 static struct PyModuleDef __pyx_moduledef = {
     PyModuleDef_HEAD_INIT,
@@ -9553,10 +9555,10 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {0, 0, 0, 0, 0, 0, 0}
 };
 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 = 43; __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 = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __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 = 299; __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 = 219; __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 = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -9592,12 +9594,10 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   }
   __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)", __LINE__, __FILE__);
   #endif
-  __pyx_init_filenames();
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #if PY_MAJOR_VERSION < 3
-  __pyx_empty_bytes = PyString_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  #else
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #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 ---*/
@@ -9651,9 +9651,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Regression.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Regression = &__pyx_type_15sgd_fast_sparse_Regression;
   __pyx_vtabptr_15sgd_fast_sparse_Classification = &__pyx_vtable_15sgd_fast_sparse_Classification;
   __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9665,9 +9665,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Classification.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Classification = &__pyx_type_15sgd_fast_sparse_Classification;
   __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber = &__pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9679,9 +9679,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_ModifiedHuber = &__pyx_type_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtabptr_15sgd_fast_sparse_Hinge = &__pyx_vtable_15sgd_fast_sparse_Hinge;
   __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9693,9 +9693,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Hinge.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Hinge = &__pyx_type_15sgd_fast_sparse_Hinge;
   __pyx_vtabptr_15sgd_fast_sparse_Log = &__pyx_vtable_15sgd_fast_sparse_Log;
   __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9707,9 +9707,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Log.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Log = &__pyx_type_15sgd_fast_sparse_Log;
   __pyx_vtabptr_15sgd_fast_sparse_SquaredError = &__pyx_vtable_15sgd_fast_sparse_SquaredError;
   __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9721,9 +9721,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_SquaredError.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_SquaredError = &__pyx_type_15sgd_fast_sparse_SquaredError;
   __pyx_vtabptr_15sgd_fast_sparse_Huber = &__pyx_vtable_15sgd_fast_sparse_Huber;
   __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9735,20 +9735,20 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Huber.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber;
   /*--- Type import code ---*/
-  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 848; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":10
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":10
  * # License: BSD Style.
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
@@ -9760,7 +9760,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
  * 
  * import numpy as np
  * import sys             # <<<<<<<<<<<<<<
@@ -9772,7 +9772,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
  * import numpy as np
  * import sys
  * from time import time             # <<<<<<<<<<<<<<
@@ -9793,7 +9793,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
+  /* "/home/ogrisel/coding/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
  * # encoding: utf-8             # <<<<<<<<<<<<<<
  * # cython: cdivision=True
  * # cython: boundscheck=False
@@ -9805,7 +9805,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__loss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_11), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -9815,14 +9815,14 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__dloss); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__");
+  __pyx_t_1 = __Pyx_GetAttrString(__pyx_t_3, "__doc__"); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_12), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_t_1 = PyObject_GetAttr(__pyx_m, __pyx_n_s__plain_sgd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__");
+  __pyx_t_3 = __Pyx_GetAttrString(__pyx_t_1, "__doc__"); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_kp_u_13), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -9830,11 +9830,12 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
+  /* "/usr/local/lib/python2.6/dist-packages/Cython/Includes/numpy.pxd":963
+ *      arr.base = baseptr
  * 
- * cdef extern from "stdlib.h" nogil:             # <<<<<<<<<<<<<<
- *     void free(void *ptr)
- *     void *malloc(size_t size)
+ * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
+ *     if arr.base is NULL:
+ *         return None
  */
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -9856,15 +9857,14 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   #endif
 }
 
-static const char *__pyx_filenames[] = {
-  "sgd_fast_sparse.pyx",
-  "numpy.pxd",
-};
-
 /* Runtime support code */
 
-static void __pyx_init_filenames(void) {
-  __pyx_f = __pyx_filenames;
+static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
+    PyObject *result;
+    result = PyObject_GetAttr(dict, name);
+    if (!result)
+        PyErr_SetObject(PyExc_NameError, name);
+    return result;
 }
 
 static void __Pyx_RaiseDoubleKeywordsError(
@@ -9989,6 +9989,26 @@ static int __Pyx_ParseOptionalKeywords(
     return -1;
 }
 
+static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact)
+{
+    if (!type) {
+        PyErr_Format(PyExc_SystemError, "Missing type object");
+        return 0;
+    }
+    if (none_allowed && obj == Py_None) return 1;
+    else if (exact) {
+        if (Py_TYPE(obj) == type) return 1;
+    }
+    else {
+        if (PyObject_TypeCheck(obj, type)) return 1;
+    }
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%s' has incorrect type (expected %s, got %s)",
+        name, type->tp_name, Py_TYPE(obj)->tp_name);
+    return 0;
+}
+
 static CYTHON_INLINE int __Pyx_IsLittleEndian(void) {
   unsigned int n = 1;
   return *(unsigned char*)(&n) != 0;
@@ -10394,7 +10414,7 @@ static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {
   buf->suboffsets = __Pyx_minusones;
 }
 
-static int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) {
+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) {
     __Pyx_ZeroBuffer(buf);
     return 0;
@@ -10479,6 +10499,10 @@ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyOb
 }
 
 
+static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
+    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+}
+
 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
     PyErr_Format(PyExc_ValueError,
         #if PY_VERSION_HEX < 0x02050000
@@ -10489,35 +10513,13 @@ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
                  (index == 1) ? "" : "s");
 }
 
-static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(void) {
-    PyErr_SetString(PyExc_ValueError, "too many values to unpack");
-}
-
-static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
-    PyObject *item;
-    if (!(item = PyIter_Next(iter))) {
-        if (!PyErr_Occurred()) {
-            __Pyx_RaiseNeedMoreValuesError(index);
-        }
-    }
-    return item;
-}
-
-static int __Pyx_EndUnpack(PyObject *iter) {
-    PyObject *item;
-    if ((item = PyIter_Next(iter))) {
-        Py_DECREF(item);
-        __Pyx_RaiseTooManyValuesError();
-        return -1;
-    }
-    else if (!PyErr_Occurred())
-        return 0;
-    else
-        return -1;
-}
-
-static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
-    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
+static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
+    PyErr_Format(PyExc_ValueError,
+        #if PY_VERSION_HEX < 0x02050000
+            "too many values to unpack (expected %d)", (int)expected);
+        #else
+            "too many values to unpack (expected %zd)", expected);
+        #endif
 }
 
 static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
@@ -10526,30 +10528,10 @@ static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
     } else if (PyTuple_GET_SIZE(t) < index) {
       __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
     } else {
-      __Pyx_RaiseTooManyValuesError();
+      __Pyx_RaiseTooManyValuesError(index);
     }
 }
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact)
-{
-    if (!type) {
-        PyErr_Format(PyExc_SystemError, "Missing type object");
-        return 0;
-    }
-    if (none_allowed && obj == Py_None) return 1;
-    else if (exact) {
-        if (Py_TYPE(obj) == type) return 1;
-    }
-    else {
-        if (PyObject_TypeCheck(obj, type)) return 1;
-    }
-    PyErr_Format(PyExc_TypeError,
-        "Argument '%s' has incorrect type (expected %s, got %s)",
-        name, type->tp_name, Py_TYPE(obj)->tp_name);
-    return 0;
-}
-
 #if PY_MAJOR_VERSION < 3
 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {
   #if PY_VERSION_HEX >= 0x02060000
@@ -10575,14 +10557,14 @@ if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pf_5numpy_7ndarra
 #endif
 
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
-    PyObject *__import__ = 0;
+    PyObject *py_import = 0;
     PyObject *empty_list = 0;
     PyObject *module = 0;
     PyObject *global_dict = 0;
     PyObject *empty_dict = 0;
     PyObject *list;
-    __import__ = __Pyx_GetAttrString(__pyx_b, "__import__");
-    if (!__import__)
+    py_import = __Pyx_GetAttrString(__pyx_b, "__import__");
+    if (!py_import)
         goto bad;
     if (from_list)
         list = from_list;
@@ -10598,23 +10580,15 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
     empty_dict = PyDict_New();
     if (!empty_dict)
         goto bad;
-    module = PyObject_CallFunctionObjArgs(__import__,
+    module = PyObject_CallFunctionObjArgs(py_import,
         name, global_dict, empty_dict, list, NULL);
 bad:
     Py_XDECREF(empty_list);
-    Py_XDECREF(__import__);
+    Py_XDECREF(py_import);
     Py_XDECREF(empty_dict);
     return module;
 }
 
-static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
-    PyObject *result;
-    result = PyObject_GetAttr(dict, name);
-    if (!result)
-        PyErr_SetObject(PyExc_NameError, name);
-    return result;
-}
-
 #if PY_MAJOR_VERSION < 3
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {
     Py_XINCREF(type);
@@ -10734,13 +10708,14 @@ static PyObject *__Pyx_GetStdout(void) {
     return f;
 }
 
-static int __Pyx_Print(PyObject *arg_tuple, int newline) {
-    PyObject *f;
+static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {
     PyObject* v;
     int i;
 
-    if (!(f = __Pyx_GetStdout()))
-        return -1;
+    if (!f) {
+        if (!(f = __Pyx_GetStdout()))
+            return -1;
+    }
     for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {
         if (PyFile_SoftSpace(f, 1)) {
             if (PyFile_WriteString(" ", f) < 0)
@@ -10768,22 +10743,38 @@ static int __Pyx_Print(PyObject *arg_tuple, int newline) {
 
 #else /* Python 3 has a print function */
 
-static int __Pyx_Print(PyObject *arg_tuple, int newline) {
+static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {
     PyObject* kwargs = 0;
     PyObject* result = 0;
     PyObject* end_string;
-    if (!__pyx_print) {
+    if (unlikely(!__pyx_print)) {
         __pyx_print = __Pyx_GetAttrString(__pyx_b, "print");
         if (!__pyx_print)
             return -1;
     }
-    if (!newline) {
-        if (!__pyx_print_kwargs) {
+    if (stream) {
+        kwargs = PyDict_New();
+        if (unlikely(!kwargs))
+            return -1;
+        if (unlikely(PyDict_SetItemString(kwargs, "file", stream) < 0))
+            goto bad;
+        if (!newline) {
+            end_string = PyUnicode_FromStringAndSize(" ", 1);
+            if (unlikely(!end_string))
+                goto bad;
+            if (PyDict_SetItemString(kwargs, "end", end_string) < 0) {
+                Py_DECREF(end_string);
+                goto bad;
+            }
+            Py_DECREF(end_string);
+        }
+    } else if (!newline) {
+        if (unlikely(!__pyx_print_kwargs)) {
             __pyx_print_kwargs = PyDict_New();
-            if (!__pyx_print_kwargs)
+            if (unlikely(!__pyx_print_kwargs))
                 return -1;
             end_string = PyUnicode_FromStringAndSize(" ", 1);
-            if (!end_string)
+            if (unlikely(!end_string))
                 return -1;
             if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) {
                 Py_DECREF(end_string);
@@ -10794,20 +10785,27 @@ static int __Pyx_Print(PyObject *arg_tuple, int newline) {
         kwargs = __pyx_print_kwargs;
     }
     result = PyObject_Call(__pyx_print, arg_tuple, kwargs);
+    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))
+        Py_DECREF(kwargs);
     if (!result)
         return -1;
     Py_DECREF(result);
     return 0;
+bad:
+    if (kwargs != __pyx_print_kwargs)
+        Py_XDECREF(kwargs);
+    return -1;
 }
 
 #endif
 
 #if PY_MAJOR_VERSION < 3
 
-static int __Pyx_PrintOne(PyObject *o) {
-    PyObject *f;
-    if (!(f = __Pyx_GetStdout()))
-        return -1;
+static int __Pyx_PrintOne(PyObject* f, PyObject *o) {
+    if (!f) {
+        if (!(f = __Pyx_GetStdout()))
+            return -1;
+    }
     if (PyFile_SoftSpace(f, 0)) {
         if (PyFile_WriteString(" ", f) < 0)
             return -1;
@@ -10819,19 +10817,19 @@ static int __Pyx_PrintOne(PyObject *o) {
     return 0;
     /* the line below is just to avoid compiler
      * compiler warnings about unused functions */
-    return __Pyx_Print(NULL, 0);
+    return __Pyx_Print(f, NULL, 0);
 }
 
 #else /* Python 3 has a print function */
 
-static int __Pyx_PrintOne(PyObject *o) {
+static int __Pyx_PrintOne(PyObject* stream, PyObject *o) {
     int res;
     PyObject* arg_tuple = PyTuple_New(1);
     if (unlikely(!arg_tuple))
         return -1;
     Py_INCREF(o);
     PyTuple_SET_ITEM(arg_tuple, 0, o);
-    res = __Pyx_Print(arg_tuple, 1);
+    res = __Pyx_Print(stream, arg_tuple, 1);
     Py_DECREF(arg_tuple);
     return res;
 }
@@ -11159,6 +11157,25 @@ static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
     return (signed int)__Pyx_PyInt_AsSignedLong(x);
 }
 
+static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {
+    const int neg_one = (int)-1, const_zero = 0;
+    const int is_unsigned = neg_one > const_zero;
+    if (sizeof(int) < sizeof(long)) {
+        long val = __Pyx_PyInt_AsLong(x);
+        if (unlikely(val != (long)(int)val)) {
+            if (!unlikely(val == -1 && PyErr_Occurred())) {
+                PyErr_SetString(PyExc_OverflowError,
+                    (is_unsigned && unlikely(val < 0)) ?
+                    "can't convert negative value to int" :
+                    "value too large to convert to int");
+            }
+            return (int)-1;
+        }
+        return (int)val;
+    }
+    return (int)__Pyx_PyInt_AsLong(x);
+}
+
 static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
     const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
@@ -11388,10 +11405,10 @@ static void __Pyx_WriteUnraisable(const char *name) {
 }
 
 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
-#if PY_VERSION_HEX < 0x03010000
-    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
-#else
+#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
     PyObject *ob = PyCapsule_New(vtable, 0, 0);
+#else
+    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
 #endif
     if (!ob)
         goto bad;
@@ -11441,7 +11458,11 @@ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class
         PyOS_snprintf(warning, sizeof(warning), 
             "%s.%s size changed, may indicate binary incompatibility",
             module_name, class_name);
+        #if PY_VERSION_HEX < 0x02050000
+        PyErr_Warn(NULL, warning);
+        #else
         PyErr_WarnEx(NULL, warning, 0);
+        #endif
     }
     else if (((PyTypeObject *)result)->tp_basicsize != size) {
         PyErr_Format(PyExc_ValueError, 
@@ -11582,8 +11603,8 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
-   if (x == Py_True) return 1;
-   else if ((x == Py_False) | (x == Py_None)) return 0;
+   int is_true = x == Py_True;
+   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
    else return PyObject_IsTrue(x);
 }
 
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index aee69cded8d44..b1dce5ee9584f 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -32,18 +32,20 @@ DEF ELASTICNET = 3
 
 cdef class LossFunction:
     """Base class for convex loss functions"""
+
     cpdef double loss(self, double p, double y):
         """Evaluate the loss function.
-        
+
         :arg p: The prediction.
         :type p: double
         :arg y: The true value.
         :type y: double
         :returns: double"""
         raise NotImplementedError()
+
     cpdef double dloss(self, double p, double y):
         """Evaluate the derivative of the loss function.
-        
+
         :arg p: The prediction.
         :type p: double
         :arg y: The true value.
@@ -51,6 +53,7 @@ cdef class LossFunction:
         :returns: double"""
         raise NotImplementedError()
 
+
 cdef class Regression(LossFunction):
     """Base class for loss functions for regression."""
     cpdef double loss(self,double p, double y):
@@ -66,67 +69,66 @@ cdef class Classification(LossFunction):
     cpdef double dloss(self, double p, double y):
         raise NotImplementedError()
 
+
 cdef class ModifiedHuber(Classification):
-    """Modified Huber loss function for binary
-    classification tasks with y in {-1,1}.
-    Its equivalent to quadratically smoothed SVM
-    with gamma = 2.
+    """Modified Huber loss for binary classification with y in {-1, 1}
 
-    See T. Zhang 'Solving
-    Large Scale Linear Prediction Problems Using
+    This is equivalent to quadratically smoothed SVM with gamma = 2.
+
+    See T. Zhang 'Solving Large Scale Linear Prediction Problems Using
     Stochastic Gradient Descent', ICML'04.
     """
-    cpdef double loss(self, double p,double y):
-        cdef double z = p*y
+    cpdef double loss(self, double p, double y):
+        cdef double z = p * y
         if z >= 1:
             return 0
         elif z >= -1:
-            return (1-z) * (1-z) 
+            return (1 - z) * (1 - z)
         else:
-            return -4*z
+            return -4 * z
 
     cpdef double dloss(self, double p, double y):
-        cdef double z = p*y
+        cdef double z = p * y
         if z >= 1:
             return 0
         elif z >= -1:
-            return 2*(1-z)*y
+            return 2 * (1 - z) * y
         else:
-            return 4*y
+            return 4 * y
 
     def __reduce__(self):
-        return ModifiedHuber,()
+        return ModifiedHuber, ()
+
 
 cdef class Hinge(Classification):
-    """SVM classification loss for binary
-    classification tasks with y in {-1,1}.
-    """
+    """SVM classification loss for binary classification with y in {-1, 1}"""
+
     cpdef  double loss(self, double p, double y):
-        cdef double z = p*y
+        cdef double z = p * y
         if z < 1.0:
             return (1 - z)
         return 0
     cpdef  double dloss(self, double p, double y):
-        cdef double z = p*y
+        cdef double z = p * y
         if z < 1.0:
             return y
         return 0
 
     def __reduce__(self):
-        return Hinge,()
+        return Hinge, ()
 
 
 cdef class Log(Classification):
-    """Logistic regression loss for binary classification
-    tasks with y in {-1,1}.
-    """
+    """Logistic regression loss for binary classification with y in {-1, 1}"""
+
     cpdef double loss(self, double p, double y):
-        cdef double z = p*y
+        cdef double z = p * y
+        # TODO: explain where does this 18 comes from
         if z > 18:
             return exp(-z)
         if z < -18:
             return -z * y
-        return log(1.0+exp(-z)) 
+        return log(1.0 + exp(-z))
 
     cpdef  double dloss(self, double p, double y):
         cdef double z = p*y
@@ -137,25 +139,39 @@ cdef class Log(Classification):
         return y / (exp(z) + 1.0)
 
     def __reduce__(self):
-        return Log,()
+        return Log, ()
+
 
 cdef class SquaredError(Regression):
-    """
-    """
+    """Squared euclidean norm of difference (regression loss)"""
+
     cpdef  double loss(self, double p, double y):
-        return 0.5 * (p-y) * (p-y)
+        return 0.5 * (p - y) * (p - y)
+
     cpdef  double dloss(self, double p, double y):
         return y - p
 
     def __reduce__(self):
-        return SquaredError,()
+        return SquaredError, ()
+
 
 cdef class Huber(Regression):
+    """Huber regression loss
+
+    Variant of the SquaredError that is robust to outliers (quadratic near zero,
+    linear in for large errors).
+
+    References
+    ----------
+
+    http://en.wikipedia.org/wiki/Huber_Loss_Function
     """
-    """
+
     cdef double c
+
     def __init__(self,c):
         self.c = c
+
     cpdef  double loss(self, double p, double y):
         cdef double r = p-y
         cdef double abs_r = abs(r)
@@ -165,7 +181,7 @@ cdef class Huber(Regression):
             return self.c * abs_r - (0.5*self.c*self.c)
 
     cpdef  double dloss(self, double p, double y):
-        cdef double r = y - p 
+        cdef double r = y - p
         cdef double abs_r = abs(r)
         if abs_r <= self.c:
             return r
@@ -175,7 +191,8 @@ cdef class Huber(Regression):
             return -self.c
 
     def __reduce__(self):
-        return Huber,(self.c,)
+        return Huber, (self.c,)
+
 
 @cython.boundscheck(False)
 @cython.wraparound(False)
@@ -191,14 +208,12 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
               np.ndarray[double, ndim=1] Y,
               int n_iter, int fit_intercept,
               int verbose, int shuffle):
-    """Cython implementation of SGD with different loss functions and
-    penalties.
-    
-    """
+    """Generic cython impl of SGD for various loss functions and penalties"""
+
     # get the data information into easy vars
     cdef unsigned int n_samples = Y.shape[0]
     cdef unsigned int n_features = w.shape[0]
-    
+
     cdef double *w_data_ptr = w.data
     cdef double *X_data_ptr = X_data.data
     cdef int *X_indptr_ptr = X_indptr.data
@@ -267,21 +282,21 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
         if penalty_type == L1 or penalty_type == ELASTICNET:
             u += ((1 - rho) * eta * alpha)
             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
-	    
-        # report epoche information
+
+        # report epoch progress 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, 
+            "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
                                                     w.nonzero()[0].shape[0],
-                                                    intercept, count, 
+                                                    intercept, count,
                                                     sumloss / count))
             print("Total training time: %.2f seconds." % (time()-t_start))
 
         # 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.")     
+            raise ValueError("floating-point under-/overflow occured.")
 
     w *= wscale
     return w, intercept
@@ -290,9 +305,11 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
 cdef inline double max(double a, double b):
     return a if a >= b else b
 
+
 cdef inline double min(double a, double b):
     return a if a <= b else b
 
+
 cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
                 int offset, int xnnz):
     cdef double sum = 0.0
@@ -301,10 +318,11 @@ cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
     return sum
 
+
 cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
                 int *X_indices_ptr, int offset, int xnnz, double c):
-    """Scales example x by constant c and adds it to the weight vector w. 
-    """
+    """Scales example x by constant c and adds it to the weight vector w"""
+
     cdef int j
     cdef int idx
     cdef double val
@@ -315,13 +333,15 @@ cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
         val = X_data_ptr[offset + j]
         innerprod += (w_data_ptr[idx] * val)
         xsqnorm += (val * val)
-        w_data_ptr[idx] += val * (c / wscale)    
+        w_data_ptr[idx] += val * (c / wscale)
     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
 
+
 cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
                     int *X_indices_ptr, int offset, int xnnz, double u):
-    """Applys the L1 penalty to each updated feature. 
-    This implements the truncated gradient approach by 
+    """Apply the L1 penalty to each updated feature
+
+    This implements the truncated gradient approach by
     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
     """
     cdef double z = 0.0
@@ -338,15 +358,16 @@ cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
                                                         / wscale) )
         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
 
-cdef void finall1penalty(double *w_data_ptr, double wscale, 
-                         unsigned int n_features, 
+
+cdef void finall1penalty(double *w_data_ptr, double wscale,
+                         unsigned int n_features,
                          double *q_data_ptr, double u):
-    """Applys the L1 penalty to all feature. 
-    This implements the truncated gradient approach by 
+    """Apply the L1 penalty to all feature
+
+    This implements the truncated gradient approach by
     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
 
-    Experimental: this was proposed by Bob Carpenter (LingPipe). 
-    
+    Experimental: this was proposed by Bob Carpenter (LingPipe).
     """
     cdef double z = 0.0
     cdef int j = 0
@@ -359,4 +380,4 @@ cdef void finall1penalty(double *w_data_ptr, double wscale,
             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
                                                     / wscale) )
         q_data_ptr[j] += (wscale * (w_data_ptr[j] - z))
-    
+

From d6517b93f0575728c82a18d813703ace3b518676 Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 18:02:22 +0200
Subject: [PATCH 12/17] more cosmit

---
 scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index b1dce5ee9584f..665b678a1deb4 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -55,17 +55,21 @@ cdef class LossFunction:
 
 
 cdef class Regression(LossFunction):
-    """Base class for loss functions for regression."""
+    """Base class for loss functions for regression"""
+
     cpdef double loss(self,double p, double y):
         raise NotImplementedError()
+
     cpdef double dloss(self,double p, double y):
         raise NotImplementedError()
 
 
 cdef class Classification(LossFunction):
-    """Base class for loss functions for classification."""
+    """Base class for loss functions for classification"""
+
     cpdef double loss(self, double p, double y):
         raise NotImplementedError()
+
     cpdef double dloss(self, double p, double y):
         raise NotImplementedError()
 

From 94b6d6e62fefe4a018b81d6802a356027049dabc Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 18:20:25 +0200
Subject: [PATCH 13/17] more cosmit

---
 scikits/learn/sgd/sparse/sgd.py        | 25 +++++++++++++------------
 scikits/learn/sgd/tests/test_sparse.py |  5 ++++-
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index d8f9843e52783..cf4c6af4b7123 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -15,11 +15,11 @@ class SGD(LinearModel, ClassifierMixin):
     error using SGD.
 
     This implementation works on scipy.sparse X and dense coef_.
-    
+
     Parameters
     ----------
     loss : str, ('hinge'|'log'|'modifiedhuber')
-        The loss function to be used. 
+        The loss function to be used.
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
     alpha : float
@@ -37,7 +37,7 @@ class SGD(LinearModel, ClassifierMixin):
         The number of passes over the training data (aka epochs).
     shuffle: bool
         Whether or not the training data should be shuffled after each epoch.
-        Defaults to False. 
+        Defaults to False.
 
     Attributes
     ----------
@@ -58,7 +58,7 @@ def _get_loss_function(self):
             self.loss_function = loss_functions[self.loss]
         except KeyError:
             raise ValueError("The loss %s is not supported. " % self.loss)
-    
+
     def _set_coef(self, coef_):
         self.coef_ = coef_
         if coef_ is None:
@@ -81,7 +81,7 @@ def fit(self, X, Y, **params):
             raise ValueError("SGD supports binary classification only.")
         self.classes = classes
 
-        # encode original class labels as 1 (classes[0]) or -1 (classes[1]). 
+        # encode original class labels as 1 (classes[0]) or -1 (classes[1]).
         Y_new = np.ones(Y.shape, dtype=np.float64)
         Y_new *= -1.0
         Y_new[Y == classes[0]] = 1.0
@@ -90,7 +90,7 @@ def fit(self, X, Y, **params):
         n_samples, n_features = X.shape[0], X.shape[1]
         if self.coef_ is None:
             self.coef_ = np.zeros(n_features, dtype=np.float64, order="c")
-        
+
         X_data = np.array(X.data, dtype=np.float64, order="c")
         X_indices = X.indices
         X_indptr = X.indptr
@@ -104,7 +104,7 @@ def fit(self, X, Y, **params):
                                                       X_indices, X_indptr, Y,
                                                       self.n_iter,
                                                       int(self.fit_intercept),
-                                                      verbose, 
+                                                      verbose,
                                                       int(self.shuffle))
 
         # update self.coef_ and self.sparse_coef_ consistently
@@ -123,9 +123,9 @@ def predict(self, X):
 
         Returns
         -------
-        array, shape = [n_samples] 
+        array, shape = [n_samples]
            Array containing the predicted class labels (either -1 or 1).
-        """        
+        """
         sign = np.sign(self.predict_margin(X))
         sign[sign == 1] = 0
         sign[sign == -1] = 1
@@ -133,7 +133,7 @@ def predict(self, X):
         return np.array([self.classes[p] for p in sign])
 
     def predict_margin(self, X):
-        """Predict signed 'distance' to the hyperplane (aka confidence score). 
+        """Predict signed 'distance' to the hyperplane (aka confidence score).
 
         Parameters
         ----------
@@ -150,7 +150,7 @@ def predict_margin(self, X):
                         + self.intercept_)
 
     def predict_proba(self, X):
-        """Predict class membership probability. 
+        """Predict class membership probability.
 
         Parameters
         ----------
@@ -158,9 +158,10 @@ def predict_proba(self, X):
 
         Returns
         -------
-        array, shape = [n_samples] 
+        array, shape = [n_samples]
             Contains the membership probabilities of the positive class.
         """
         # how can this be, logisitic *does* implement this
         raise NotImplementedError(
                 'sgd does not provide this functionality')
+
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index 32b5f2caedc46..69a617cc93cb2 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -49,6 +49,7 @@ def test_sgd():
     #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
     assert_array_equal(clf.predict(T), true_result)
 
+
 def test_sgd_penalties():
     """Check whether penalties and hyperparameters are set properly"""
     clf = sgd.sparse.SGD(penalty='l2')
@@ -58,6 +59,7 @@ def test_sgd_penalties():
     clf = sgd.sparse.SGD(penalty='elasticnet', rho=0.85)
     assert clf.rho == 0.85
 
+
 def test_sgd_params():
     """Test parameter validity check"""
     try:
@@ -75,6 +77,7 @@ def test_sgd_params():
     else:
         assert False
 
+
 def test_sgd_multiclass():
     """SGD is not able to handle multi class problems"""
     clf = sgd.sparse.SGD()
@@ -85,6 +88,7 @@ def test_sgd_multiclass():
     else:
         assert False
 
+
 def test_sgd_l1():
     n = len(X4)
     np.random.seed(13)
@@ -96,6 +100,5 @@ def test_sgd_l1():
                          fit_intercept=False,
                          n_iter=1000)
     clf.fit(X, Y)
-    print clf.coef_
     assert_array_equal(clf.coef_[1:-1], np.zeros((4,)))
 

From 280eaec479cc4e471ec786d91f60bb7877a0895c Mon Sep 17 00:00:00 2001
From: Alexandre Gramfort 
Date: Mon, 25 Oct 2010 01:11:08 +0800
Subject: [PATCH 14/17] sgd module code review

---
 ...comp_sparse_document_classification_sgd.py |   13 +-
 scikits/learn/sgd/setup.py                    |    1 -
 scikits/learn/sgd/sparse/setup.py             |    6 +-
 scikits/learn/sgd/sparse/sgd.py               |   37 +-
 .../learn/sgd/sparse/src/sgd_fast_sparse.c    | 2092 ++++++++---------
 .../learn/sgd/sparse/src/sgd_fast_sparse.pyx  |  152 +-
 scikits/learn/sgd/tests/test_sparse.py        |   61 +-
 7 files changed, 1186 insertions(+), 1176 deletions(-)

diff --git a/examples/sgd/mlcomp_sparse_document_classification_sgd.py b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
index 127ad7e4a6d11..d56af4fdf37a7 100644
--- a/examples/sgd/mlcomp_sparse_document_classification_sgd.py
+++ b/examples/sgd/mlcomp_sparse_document_classification_sgd.py
@@ -40,13 +40,12 @@
 import sys
 import os
 import numpy as np
-import scipy.sparse as sp
-import pylab as pl
+# import pylab as pl
 
 from scikits.learn.datasets import load_mlcomp
 from scikits.learn.metrics import confusion_matrix
 
-from scikits.learn.svm.sparse import LinearSVC
+# from scikits.learn.svm.sparse import LinearSVC
 from scikits.learn.sgd.sparse import SGD
 
 
@@ -68,7 +67,7 @@
 neg = 1 # comp.graphics
 pos_idx = np.where(target == pos)[0]
 neg_idx = np.where(target == neg)[0]
-idx = np.concatenate((pos_idx,neg_idx))
+idx = np.concatenate((pos_idx, neg_idx))
 np.random.seed(13)
 np.random.shuffle(idx)
 data = news_train.data[idx]
@@ -77,9 +76,9 @@
 print "num train docs: ", data.shape[0]
 print ""
 print "Training a linear SVM (hinge loss and L2 regularizer) using SGD.\n"\
-      "SGD(n_iter=50,alpha=0.00001,fit_intercept=True)"
+      "SGD(n_iter=50, alpha=0.00001, fit_intercept=True)"
 t0 = time()
-clf = SGD(n_iter=50,alpha=0.00001,fit_intercept=True)
+clf = SGD(n_iter=50, alpha=0.00001, fit_intercept=True)
 #clf = LinearSVC(**parameters)
 clf.fit(data, target)
 print "done in %fs" % (time() - t0)
@@ -93,7 +92,7 @@
 target = news_test.target
 pos_idx = np.where(target == pos)[0]
 neg_idx = np.where(target == neg)[0]
-idx = np.concatenate((pos_idx,neg_idx))
+idx = np.concatenate((pos_idx, neg_idx))
 data = news_test.data[idx]
 target = news_test.target[idx]
 
diff --git a/scikits/learn/sgd/setup.py b/scikits/learn/sgd/setup.py
index 2628e6e58fcbd..7f26520788bd1 100644
--- a/scikits/learn/sgd/setup.py
+++ b/scikits/learn/sgd/setup.py
@@ -1,4 +1,3 @@
-import numpy
 from ConfigParser import ConfigParser
 
 def configuration(parent_package='', top_path=None):
diff --git a/scikits/learn/sgd/sparse/setup.py b/scikits/learn/sgd/sparse/setup.py
index 5e50dea3568c7..3d1891b9d6b23 100644
--- a/scikits/learn/sgd/sparse/setup.py
+++ b/scikits/learn/sgd/sparse/setup.py
@@ -16,11 +16,11 @@ def configuration(parent_package='', top_path=None):
                          )
 
     # add other directories
-    config.add_subpackage('tests')
+    # config.add_subpackage('tests')
     return config
 
 if __name__ == '__main__':
     from numpy.distutils.core import setup
     setup(**configuration(top_path='').todict())
-    
-    
+
+
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index d8f9843e52783..50addd8f902e7 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -10,16 +10,17 @@
 from ..base import LinearModel
 from . import sgd_fast_sparse
 
+
 class SGD(LinearModel, ClassifierMixin):
     """Linear Model trained by minimizing a regularized training
     error using SGD.
 
     This implementation works on scipy.sparse X and dense coef_.
-    
+
     Parameters
     ----------
     loss : str, ('hinge'|'log'|'modifiedhuber')
-        The loss function to be used. 
+        The loss function to be used.
     penalty : str, ('l2'|'l1'|'elasticnet')
         The penalty (aka regularization term) to be used.
     alpha : float
@@ -37,7 +38,7 @@ class SGD(LinearModel, ClassifierMixin):
         The number of passes over the training data (aka epochs).
     shuffle: bool
         Whether or not the training data should be shuffled after each epoch.
-        Defaults to False. 
+        Defaults to False.
 
     Attributes
     ----------
@@ -58,7 +59,7 @@ def _get_loss_function(self):
             self.loss_function = loss_functions[self.loss]
         except KeyError:
             raise ValueError("The loss %s is not supported. " % self.loss)
-    
+
     def _set_coef(self, coef_):
         self.coef_ = coef_
         if coef_ is None:
@@ -81,20 +82,19 @@ def fit(self, X, Y, **params):
             raise ValueError("SGD supports binary classification only.")
         self.classes = classes
 
-        # encode original class labels as 1 (classes[0]) or -1 (classes[1]). 
+        # encode original class labels as 1 (classes[0]) or -1 (classes[1]).
         Y_new = np.ones(Y.shape, dtype=np.float64)
-        Y_new *= -1.0
-        Y_new[Y == classes[0]] = 1.0
+        Y_new[Y == classes[1]] = - 1.0
         Y = Y_new
 
         n_samples, n_features = X.shape[0], X.shape[1]
         if self.coef_ is None:
             self.coef_ = np.zeros(n_features, dtype=np.float64, order="c")
-        
+
         X_data = np.array(X.data, dtype=np.float64, order="c")
         X_indices = X.indices
         X_indptr = X.indptr
-        verbose = 0#2
+        verbose = 0#2 # XXX : shouldn't verbose be a instance param
         coef_, intercept_ = sgd_fast_sparse.plain_sgd(self.coef_,
                                                       self.intercept_,
                                                       self.loss_function,
@@ -104,7 +104,7 @@ def fit(self, X, Y, **params):
                                                       X_indices, X_indptr, Y,
                                                       self.n_iter,
                                                       int(self.fit_intercept),
-                                                      verbose, 
+                                                      verbose,
                                                       int(self.shuffle))
 
         # update self.coef_ and self.sparse_coef_ consistently
@@ -123,17 +123,14 @@ def predict(self, X):
 
         Returns
         -------
-        array, shape = [n_samples] 
+        array, shape = [n_samples]
            Array containing the predicted class labels (either -1 or 1).
-        """        
-        sign = np.sign(self.predict_margin(X))
-        sign[sign == 1] = 0
-        sign[sign == -1] = 1
-        # FIXME what if sign == 0? break randomly?
-        return np.array([self.classes[p] for p in sign])
+        """
+        indices = np.array(self.predict_margin(X) < 0, dtype=np.int)
+        return self.classes[indices]
 
     def predict_margin(self, X):
-        """Predict signed 'distance' to the hyperplane (aka confidence score). 
+        """Predict signed 'distance' to the hyperplane (aka confidence score).
 
         Parameters
         ----------
@@ -150,7 +147,7 @@ def predict_margin(self, X):
                         + self.intercept_)
 
     def predict_proba(self, X):
-        """Predict class membership probability. 
+        """Predict class membership probability.
 
         Parameters
         ----------
@@ -158,7 +155,7 @@ def predict_proba(self, X):
 
         Returns
         -------
-        array, shape = [n_samples] 
+        array, shape = [n_samples]
             Contains the membership probabilities of the positive class.
         """
         # how can this be, logisitic *does* implement this
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
index 3b4ec5cdd4ea1..473bf54c686dc 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.12.1 on Sun Oct 24 11:34:09 2010 */
+/* Generated by Cython 0.12.1 on Sun Oct 24 18:57:16 2010 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -380,7 +380,7 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;
 
 typedef npy_cdouble __pyx_t_5numpy_complex_t;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
@@ -393,8 +393,8 @@ struct __pyx_obj_15sgd_fast_sparse_LossFunction {
   struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtab;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
- *         raise NotImplementedError()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+ * 
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
@@ -405,8 +405,8 @@ struct __pyx_obj_15sgd_fast_sparse_Regression {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
- *         return SquaredError,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+ * 
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
  *     """
@@ -418,8 +418,8 @@ struct __pyx_obj_15sgd_fast_sparse_Huber {
   double c;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
- *         return Log,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+ * 
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
  *     """
@@ -430,7 +430,7 @@ struct __pyx_obj_15sgd_fast_sparse_SquaredError {
   struct __pyx_obj_15sgd_fast_sparse_Regression __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
@@ -442,8 +442,8 @@ struct __pyx_obj_15sgd_fast_sparse_Classification {
   struct __pyx_obj_15sgd_fast_sparse_LossFunction __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
- *         return ModifiedHuber,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
+ * 
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
  *     """SVM classification loss for binary
@@ -454,8 +454,8 @@ struct __pyx_obj_15sgd_fast_sparse_Hinge {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
- *         raise NotImplementedError()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":72
+ * 
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
  *     """Modified Huber loss function for binary
@@ -466,7 +466,7 @@ struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber {
   struct __pyx_obj_15sgd_fast_sparse_Classification __pyx_base;
 };
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
@@ -479,7 +479,7 @@ struct __pyx_obj_15sgd_fast_sparse_Log {
 };
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":33
  * # ----------------------------------------
  * 
  * cdef class LossFunction:             # <<<<<<<<<<<<<<
@@ -494,8 +494,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":54
- *         raise NotImplementedError()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+ * 
  * 
  * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<
  *     """Base class for loss functions for regression."""
@@ -508,8 +508,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Regression {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *__pyx_vtabptr_15sgd_fast_sparse_Regression;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
- *         return Log,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
+ * 
  * 
  * cdef class SquaredError(Regression):             # <<<<<<<<<<<<<<
  *     """
@@ -522,8 +522,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *__pyx_vtabptr_15sgd_fast_sparse_SquaredError;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":153
- *         return SquaredError,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
+ * 
  * 
  * cdef class Huber(Regression):             # <<<<<<<<<<<<<<
  *     """
@@ -536,7 +536,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Huber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *__pyx_vtabptr_15sgd_fast_sparse_Huber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":62
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
  * 
  * 
  * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<
@@ -550,8 +550,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Classification {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *__pyx_vtabptr_15sgd_fast_sparse_Classification;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
- *         return ModifiedHuber,()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
+ * 
  * 
  * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<
  *     """SVM classification loss for binary
@@ -564,8 +564,8 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *__pyx_vtabptr_15sgd_fast_sparse_Hinge;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
- *         raise NotImplementedError()
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":72
+ * 
  * 
  * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<
  *     """Modified Huber loss function for binary
@@ -578,7 +578,7 @@ struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber {
 static struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *__pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber;
 
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":119
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
  * 
  * 
  * cdef class Log(Classification):             # <<<<<<<<<<<<<<
@@ -977,8 +977,8 @@ static char __pyx_k_8[] = "unknown dtype code in numpy.pxd (%d)";
 static char __pyx_k_9[] = "Format string allocated too short, see comment in numpy.pxd";
 static char __pyx_k_10[] = "Format string allocated too short.";
 static char __pyx_k_11[] = "LossFunction.loss (line 35)";
-static char __pyx_k_12[] = "LossFunction.dloss (line 44)";
-static char __pyx_k_13[] = "plain_sgd (line 183)";
+static char __pyx_k_12[] = "LossFunction.dloss (line 45)";
+static char __pyx_k_13[] = "plain_sgd (line 194)";
 static char __pyx_k__B[] = "B";
 static char __pyx_k__H[] = "H";
 static char __pyx_k__I[] = "I";
@@ -1127,7 +1127,7 @@ static PyObject *__pyx_n_s__y;
 static PyObject *__pyx_n_s__zeros;
 static PyObject *__pyx_int_15;
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1175,12 +1175,12 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":43
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":43
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
+ * 
  *     cpdef double dloss(self, double p, double y):
- *         """Evaluate the derivative of the loss function.
  */
   __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
@@ -1202,7 +1202,7 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":35
  * cdef class LossFunction:
  *     """Base class for convex loss functions"""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1211,7 +1211,7 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_loss(struct __pyx_obj_15
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_loss[] = "Evaluate the loss function.\n\n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   double __pyx_v_p;
   double __pyx_v_y;
@@ -1277,9 +1277,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
- *         :returns: double"""
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         raise NotImplementedError()
+ * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the derivative of the loss function.
  * 
@@ -1298,14 +1298,14 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1313,10 +1313,10 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1325,18 +1325,18 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":52
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":53
  *         :type y: double
  *         :returns: double"""
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
- * cdef class Regression(LossFunction):
+ * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1352,16 +1352,16 @@ static  double __pyx_f_15sgd_fast_sparse_12LossFunction_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":44
- *         :returns: double"""
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":45
  *         raise NotImplementedError()
+ * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         """Evaluate the derivative of the loss function.
  * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n        \n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
+static char __pyx_doc_15sgd_fast_sparse_12LossFunction_dloss[] = "Evaluate the derivative of the loss function.\n\n        :arg p: The prediction.\n        :type p: double\n        :arg y: The true value.\n        :type y: double\n        :returns: double";
 static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   double __pyx_v_p;
   double __pyx_v_y;
@@ -1387,29 +1387,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
       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 = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __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 = 44; __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 = 44; __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 = 45; __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 = 45; __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 = 44; __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 = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 45; __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 = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.LossFunction.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self)->__pyx_vtab)->dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1427,7 +1427,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12LossFunction_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1448,14 +1448,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1463,10 +1463,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1475,18 +1475,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":57
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1502,7 +1502,7 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_loss(struct __pyx_obj_15sg
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":56
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
  * cdef class Regression(LossFunction):
  *     """Base class for loss functions for regression."""
  *     cpdef double loss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1536,29 +1536,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
       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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __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 = 56; __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 = 56; __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 = 58; __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 = 58; __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 = 56; __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 = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 58; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1576,7 +1576,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_loss(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1597,14 +1597,14 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_10Regression_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1612,10 +1612,10 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1624,18 +1624,18 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":59
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":61
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1651,7 +1651,7 @@ static  double __pyx_f_15sgd_fast_sparse_10Regression_dloss(struct __pyx_obj_15s
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":58
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":60
  *     cpdef double loss(self,double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self,double p, double y):             # <<<<<<<<<<<<<<
@@ -1685,29 +1685,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
       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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __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 = 58; __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 = 58; __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 = 60; __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 = 60; __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 = 58; __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 = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 60; __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 = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Regression.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Regression *)((struct __pyx_obj_15sgd_fast_sparse_Regression *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1725,7 +1725,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_10Regression_dloss(PyObject *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1746,14 +1746,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1761,10 +1761,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1773,18 +1773,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":65
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1800,7 +1800,7 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_loss(struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":64
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
  * cdef class Classification(LossFunction):
  *     """Base class for loss functions for classification."""
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1834,29 +1834,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
       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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __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 = 64; __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 = 64; __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 = 66; __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 = 66; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 66; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -1874,7 +1874,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_loss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1895,14 +1895,14 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_14Classification_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -1910,10 +1910,10 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -1922,18 +1922,18 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":67
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":69
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):
  *         raise NotImplementedError()             # <<<<<<<<<<<<<<
  * 
- * cdef class ModifiedHuber(Classification):
+ * 
  */
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_Raise(__pyx_t_1, 0, 0);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   __pyx_r = 0;
   goto __pyx_L0;
@@ -1949,7 +1949,7 @@ static  double __pyx_f_15sgd_fast_sparse_14Classification_dloss(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":66
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":68
  *     cpdef double loss(self, double p, double y):
  *         raise NotImplementedError()
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
@@ -1983,29 +1983,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
       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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __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 = 66; __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 = 66; __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 = 68; __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 = 68; __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 = 66; __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 = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 68; __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 = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Classification.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Classification *)((struct __pyx_obj_15sgd_fast_sparse_Classification *)__pyx_v_self)->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2023,12 +2023,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_14Classification_dloss(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z >= 1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -2047,14 +2047,14 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2062,10 +2062,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); 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_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2074,68 +2074,68 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":80
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
  *     """
  *     cpdef double loss(self, double p,double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
- *         if z >= 1:
- *             return 0
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
+ *         if z >= 1.0:
+ *             return 0.0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":81
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
  *     cpdef double loss(self, double p,double y):
- *         cdef double z = p*y
- *         if z >= 1:             # <<<<<<<<<<<<<<
- *             return 0
- *         elif z >= -1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:             # <<<<<<<<<<<<<<
+ *             return 0.0
+ *         elif z >= -1.0:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
+  __pyx_t_6 = (__pyx_v_z >= 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
- *         cdef double z = p*y
- *         if z >= 1:
- *             return 0             # <<<<<<<<<<<<<<
- *         elif z >= -1:
- *             return (1-z) * (1-z)
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":85
+ *         cdef double z = p * y
+ *         if z >= 1.0:
+ *             return 0.0             # <<<<<<<<<<<<<<
+ *         elif z >= -1.0:
+ *             return (1.0 - z) * (1.0 - z)
  */
-    __pyx_r = 0;
+    __pyx_r = 0.0;
     goto __pyx_L0;
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":83
- *         if z >= 1:
- *             return 0
- *         elif z >= -1:             # <<<<<<<<<<<<<<
- *             return (1-z) * (1-z)
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
+ *         if z >= 1.0:
+ *             return 0.0
+ *         elif z >= -1.0:             # <<<<<<<<<<<<<<
+ *             return (1.0 - z) * (1.0 - z)
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
+  __pyx_t_6 = (__pyx_v_z >= (-1.0));
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":84
- *             return 0
- *         elif z >= -1:
- *             return (1-z) * (1-z)             # <<<<<<<<<<<<<<
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":87
+ *             return 0.0
+ *         elif z >= -1.0:
+ *             return (1.0 - z) * (1.0 - z)             # <<<<<<<<<<<<<<
  *         else:
- *             return -4*z
+ *             return -4.0 * z
  */
-    __pyx_r = ((1 - __pyx_v_z) * (1 - __pyx_v_z));
+    __pyx_r = ((1.0 - __pyx_v_z) * (1.0 - __pyx_v_z));
     goto __pyx_L0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":86
- *             return (1-z) * (1-z)
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+ *             return (1.0 - z) * (1.0 - z)
  *         else:
- *             return -4*z             # <<<<<<<<<<<<<<
+ *             return -4.0 * z             # <<<<<<<<<<<<<<
  * 
  *     cpdef double dloss(self, double p, double y):
  */
-    __pyx_r = (-4 * __pyx_v_z);
+    __pyx_r = ((-4.0) * __pyx_v_z);
     goto __pyx_L0;
   }
   __pyx_L3:;
@@ -2155,12 +2155,12 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_loss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":79
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":82
  *     Stochastic Gradient Descent', ICML'04.
  *     """
  *     cpdef double loss(self, double p,double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z >= 1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -2189,29 +2189,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
       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 = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __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, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 79; __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 = 79; __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 = 79; __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 = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 82; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2229,12 +2229,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_loss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
- *             return -4*z
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
+ *             return -4.0 * z
  * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z >= 1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -2253,14 +2253,14 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2268,10 +2268,10 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2280,68 +2280,68 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":89
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
  * 
  *     cpdef double dloss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
- *         if z >= 1:
- *             return 0
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
+ *         if z >= 1.0:
+ *             return 0.0
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":90
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
  *     cpdef double dloss(self, double p, double y):
- *         cdef double z = p*y
- *         if z >= 1:             # <<<<<<<<<<<<<<
- *             return 0
- *         elif z >= -1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:             # <<<<<<<<<<<<<<
+ *             return 0.0
+ *         elif z >= -1.0:
  */
-  __pyx_t_6 = (__pyx_v_z >= 1);
+  __pyx_t_6 = (__pyx_v_z >= 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
- *         cdef double z = p*y
- *         if z >= 1:
- *             return 0             # <<<<<<<<<<<<<<
- *         elif z >= -1:
- *             return 2*(1-z)*y
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":94
+ *         cdef double z = p * y
+ *         if z >= 1.0:
+ *             return 0.0             # <<<<<<<<<<<<<<
+ *         elif z >= -1.0:
+ *             return 2.0 * (1.0 - z) * y
  */
-    __pyx_r = 0;
+    __pyx_r = 0.0;
     goto __pyx_L0;
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":92
- *         if z >= 1:
- *             return 0
- *         elif z >= -1:             # <<<<<<<<<<<<<<
- *             return 2*(1-z)*y
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
+ *         if z >= 1.0:
+ *             return 0.0
+ *         elif z >= -1.0:             # <<<<<<<<<<<<<<
+ *             return 2.0 * (1.0 - z) * y
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_z >= -1);
+  __pyx_t_6 = (__pyx_v_z >= (-1.0));
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":93
- *             return 0
- *         elif z >= -1:
- *             return 2*(1-z)*y             # <<<<<<<<<<<<<<
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":96
+ *             return 0.0
+ *         elif z >= -1.0:
+ *             return 2.0 * (1.0 - z) * y             # <<<<<<<<<<<<<<
  *         else:
- *             return 4*y
+ *             return 4.0 * y
  */
-    __pyx_r = ((2 * (1 - __pyx_v_z)) * __pyx_v_y);
+    __pyx_r = ((2.0 * (1.0 - __pyx_v_z)) * __pyx_v_y);
     goto __pyx_L0;
     goto __pyx_L3;
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":95
- *             return 2*(1-z)*y
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
+ *             return 2.0 * (1.0 - z) * y
  *         else:
- *             return 4*y             # <<<<<<<<<<<<<<
+ *             return 4.0 * y             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-    __pyx_r = (4 * __pyx_v_y);
+    __pyx_r = (4.0 * __pyx_v_y);
     goto __pyx_L0;
   }
   __pyx_L3:;
@@ -2361,12 +2361,12 @@ static  double __pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss(struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":88
- *             return -4*z
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":91
+ *             return -4.0 * z
  * 
  *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z >= 1:
+ *         cdef double z = p * y
+ *         if z >= 1.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -2395,29 +2395,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
       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 = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __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 = 88; __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 = 88; __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 = 91; __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 = 91; __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 = 88; __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 = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 91; __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 = 91; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.ModifiedHuber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_ModifiedHuber *)((struct __pyx_obj_15sgd_fast_sparse_ModifiedHuber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2435,11 +2435,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber_dloss(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":97
- *             return 4*y
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":100
+ *             return 4.0 * y
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return ModifiedHuber,()
+ *         return ModifiedHuber, ()
  * 
  */
 
@@ -2449,15 +2449,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":98
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":101
  * 
  *     def __reduce__(self):
- *         return ModifiedHuber,()             # <<<<<<<<<<<<<<
+ *         return ModifiedHuber, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class Hinge(Classification):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_ModifiedHuber)));
@@ -2481,11 +2481,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_13ModifiedHuber___reduce__(PyObject
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *     classification tasks with y in {-1,1}.
  *     """
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2505,14 +2505,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2520,10 +2520,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2532,31 +2532,31 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":105
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
  *     """
- *     cpdef  double loss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return (1 - z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":106
- *     cpdef  double loss(self, double p, double y):
- *         cdef double z = p*y
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double z = p * y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return (1 - z)
- *         return 0
+ *         return 0.0
  */
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":107
- *         cdef double z = p*y
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
+ *         cdef double z = p * y
  *         if z < 1.0:
  *             return (1 - z)             # <<<<<<<<<<<<<<
- *         return 0
- *     cpdef  double dloss(self, double p, double y):
+ *         return 0.0
+ * 
  */
     __pyx_r = (1 - __pyx_v_z);
     goto __pyx_L0;
@@ -2564,14 +2564,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
  *         if z < 1.0:
  *             return (1 - z)
- *         return 0             # <<<<<<<<<<<<<<
- *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y
+ *         return 0.0             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef double dloss(self, double p, double y):
  */
-  __pyx_r = 0;
+  __pyx_r = 0.0;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -2589,11 +2589,11 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_loss(struct __pyx_obj_15sgd_fast
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":104
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":108
  *     classification tasks with y in {-1,1}.
  *     """
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2623,29 +2623,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
       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 = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __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 = 104; __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 = 104; __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 = 108; __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 = 108; __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 = 104; __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 = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 108; __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 = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2663,11 +2663,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
- *             return (1 - z)
- *         return 0
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+ *         return 0.0
+ * 
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2687,14 +2687,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Hinge_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2702,10 +2702,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2714,30 +2714,30 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":110
- *         return 0
- *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":115
+ * 
+ *     cpdef double dloss(self, double p, double y):
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z < 1.0:
  *             return y
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":111
- *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
+ *     cpdef double dloss(self, double p, double y):
+ *         cdef double z = p * y
  *         if z < 1.0:             # <<<<<<<<<<<<<<
  *             return y
- *         return 0
+ *         return 0.0
  */
   __pyx_t_6 = (__pyx_v_z < 1.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":112
- *         cdef double z = p*y
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":117
+ *         cdef double z = p * y
  *         if z < 1.0:
  *             return y             # <<<<<<<<<<<<<<
- *         return 0
+ *         return 0.0
  * 
  */
     __pyx_r = __pyx_v_y;
@@ -2746,14 +2746,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":113
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":118
  *         if z < 1.0:
  *             return y
- *         return 0             # <<<<<<<<<<<<<<
+ *         return 0.0             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-  __pyx_r = 0;
+  __pyx_r = 0.0;
   goto __pyx_L0;
 
   __pyx_r = 0;
@@ -2771,11 +2771,11 @@ static  double __pyx_f_15sgd_fast_sparse_5Hinge_dloss(struct __pyx_obj_15sgd_fas
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":109
- *             return (1 - z)
- *         return 0
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":114
+ *         return 0.0
+ * 
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
  *         if z < 1.0:
  */
 
@@ -2805,29 +2805,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
       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 = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __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 = 109; __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 = 109; __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 = 114; __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 = 114; __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 = 109; __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 = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 114; __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 = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Hinge.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Hinge *)((struct __pyx_obj_15sgd_fast_sparse_Hinge *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -2845,11 +2845,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":115
- *         return 0
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":120
+ *         return 0.0
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return Hinge,()
+ *         return Hinge, ()
  * 
  */
 
@@ -2859,15 +2859,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":116
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":121
  * 
  *     def __reduce__(self):
- *         return Hinge,()             # <<<<<<<<<<<<<<
+ *         return Hinge, ()             # <<<<<<<<<<<<<<
  * 
  * 
  */
   __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_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Hinge)));
@@ -2891,11 +2891,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Hinge___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z > 18:
  */
 
@@ -2915,14 +2915,14 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -2930,10 +2930,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -2942,18 +2942,18 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":124
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
  *     """
  *     cpdef double loss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
  *         if z > 18:
  *             return exp(-z)
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":125
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":130
  *     cpdef double loss(self, double p, double y):
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z > 18:             # <<<<<<<<<<<<<<
  *             return exp(-z)
  *         if z < -18:
@@ -2961,8 +2961,8 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_t_6 = (__pyx_v_z > 18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":126
- *         cdef double z = p*y
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
+ *         cdef double z = p * y
  *         if z > 18:
  *             return exp(-z)             # <<<<<<<<<<<<<<
  *         if z < -18:
@@ -2974,7 +2974,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":127
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
  *         if z > 18:
  *             return exp(-z)
  *         if z < -18:             # <<<<<<<<<<<<<<
@@ -2984,7 +2984,7 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   __pyx_t_6 = (__pyx_v_z < -18);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
  *             return exp(-z)
  *         if z < -18:
  *             return -z * y             # <<<<<<<<<<<<<<
@@ -2997,12 +2997,12 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":129
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
  *         if z < -18:
  *             return -z * y
  *         return log(1.0+exp(-z))             # <<<<<<<<<<<<<<
  * 
- *     cpdef  double dloss(self, double p, double y):
+ *     cpdef double dloss(self, double p, double y):
  */
   __pyx_r = log((1.0 + exp((-__pyx_v_z))));
   goto __pyx_L0;
@@ -3022,11 +3022,11 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_loss(struct __pyx_obj_15sgd_fast_s
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":123
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":128
  *     tasks with y in {-1,1}.
  *     """
  *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
+ *         cdef double z = p * y
  *         if z > 18:
  */
 
@@ -3056,29 +3056,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
       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 = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __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 = 123; __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 = 123; __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 = 128; __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 = 128; __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 = 123; __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 = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 128; __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 = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3096,12 +3096,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_loss(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *         return log(1.0+exp(-z))
  * 
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z > 18:
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
+ *         if z > 18.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3120,14 +3120,14 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_3Log_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3135,10 +3135,10 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3147,30 +3147,30 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":132
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
  * 
- *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y             # <<<<<<<<<<<<<<
- *         if z > 18:
+ *     cpdef double dloss(self, double p, double y):
+ *         cdef double z = p * y             # <<<<<<<<<<<<<<
+ *         if z > 18.0:
  *             return exp(-z) * y
  */
   __pyx_v_z = (__pyx_v_p * __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":133
- *     cpdef  double dloss(self, double p, double y):
- *         cdef double z = p*y
- *         if z > 18:             # <<<<<<<<<<<<<<
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":138
+ *     cpdef double dloss(self, double p, double y):
+ *         cdef double z = p * y
+ *         if z > 18.0:             # <<<<<<<<<<<<<<
  *             return exp(-z) * y
- *         if z < -18:
+ *         if z < -18.0:
  */
-  __pyx_t_6 = (__pyx_v_z > 18);
+  __pyx_t_6 = (__pyx_v_z > 18.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":134
- *         cdef double z = p*y
- *         if z > 18:
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":139
+ *         cdef double z = p * y
+ *         if z > 18.0:
  *             return exp(-z) * y             # <<<<<<<<<<<<<<
- *         if z < -18:
+ *         if z < -18.0:
  *             return y
  */
     __pyx_r = (exp((-__pyx_v_z)) * __pyx_v_y);
@@ -3179,19 +3179,19 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L3:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":135
- *         if z > 18:
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
+ *         if z > 18.0:
  *             return exp(-z) * y
- *         if z < -18:             # <<<<<<<<<<<<<<
+ *         if z < -18.0:             # <<<<<<<<<<<<<<
  *             return y
  *         return y / (exp(z) + 1.0)
  */
-  __pyx_t_6 = (__pyx_v_z < -18);
+  __pyx_t_6 = (__pyx_v_z < (-18.0));
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":141
  *             return exp(-z) * y
- *         if z < -18:
+ *         if z < -18.0:
  *             return y             # <<<<<<<<<<<<<<
  *         return y / (exp(z) + 1.0)
  * 
@@ -3202,8 +3202,8 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   }
   __pyx_L4:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":137
- *         if z < -18:
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":142
+ *         if z < -18.0:
  *             return y
  *         return y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<
  * 
@@ -3227,12 +3227,12 @@ static  double __pyx_f_15sgd_fast_sparse_3Log_dloss(struct __pyx_obj_15sgd_fast_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":131
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":136
  *         return log(1.0+exp(-z))
  * 
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double z = p*y
- *         if z > 18:
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double z = p * y
+ *         if z > 18.0:
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3261,29 +3261,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
       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 = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __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 = 131; __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 = 131; __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 = 136; __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 = 136; __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 = 131; __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 = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 136; __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 = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Log.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Log *)((struct __pyx_obj_15sgd_fast_sparse_Log *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3301,11 +3301,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log_dloss(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":139
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":144
  *         return y / (exp(z) + 1.0)
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return Log,()
+ *         return Log, ()
  * 
  */
 
@@ -3315,15 +3315,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":140
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
  * 
  *     def __reduce__(self):
- *         return Log,()             # <<<<<<<<<<<<<<
+ *         return Log, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class SquaredError(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Log)));
@@ -3347,12 +3347,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_3Log___reduce__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
  *     """
  *     """
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3368,14 +3368,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3383,10 +3383,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3395,12 +3395,12 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":146
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":152
  *     """
- *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)             # <<<<<<<<<<<<<<
- *     cpdef  double dloss(self, double p, double y):
- *         return y - p
+ *     cpdef double loss(self, double p, double y):
+ *         return 0.5 * (p - y) * (p - y)             # <<<<<<<<<<<<<<
+ * 
+ *     cpdef double dloss(self, double p, double y):
  */
   __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));
   goto __pyx_L0;
@@ -3419,12 +3419,12 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_loss(struct __pyx_obj_15
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":145
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
  *     """
  *     """
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         return 0.5 * (p - y) * (p - y)
+ * 
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3453,29 +3453,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
       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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __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 = 145; __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 = 145; __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 = 151; __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 = 151; __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 = 145; __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 = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 151; __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 = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3493,10 +3493,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_loss(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
- *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return 0.5 * (p - y) * (p - y)
+ * 
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
  */
@@ -3514,14 +3514,14 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3529,10 +3529,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3541,9 +3541,9 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":148
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":155
+ * 
+ *     cpdef double dloss(self, double p, double y):
  *         return y - p             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
@@ -3565,10 +3565,10 @@ static  double __pyx_f_15sgd_fast_sparse_12SquaredError_dloss(struct __pyx_obj_1
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":147
- *     cpdef  double loss(self, double p, double y):
- *         return 0.5 * (p-y) * (p-y)
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":154
+ *         return 0.5 * (p - y) * (p - y)
+ * 
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         return y - p
  * 
  */
@@ -3599,29 +3599,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
       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 = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __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 = 147; __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 = 147; __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 = 154; __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 = 154; __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 = 147; __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 = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 154; __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 = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.SquaredError.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_SquaredError *)((struct __pyx_obj_15sgd_fast_sparse_SquaredError *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3639,11 +3639,11 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError_dloss(PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":150
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
  *         return y - p
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         return SquaredError,()
+ *         return SquaredError, ()
  * 
  */
 
@@ -3653,15 +3653,15 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":151
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
  * 
  *     def __reduce__(self):
- *         return SquaredError,()             # <<<<<<<<<<<<<<
+ *         return SquaredError, ()             # <<<<<<<<<<<<<<
+ * 
  * 
- * cdef class Huber(Regression):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_SquaredError)));
@@ -3685,12 +3685,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_12SquaredError___reduce__(PyObject *
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":157
- *     """
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":166
  *     cdef double c
+ * 
  *     def __init__(self,c):             # <<<<<<<<<<<<<<
  *         self.c = c
- *     cpdef  double loss(self, double p, double y):
+ * 
  */
 
 static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
@@ -3715,7 +3715,7 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
       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 = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     }
     __pyx_v_c = values[0];
   } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
@@ -3725,20 +3725,20 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.__init__");
   return -1;
   __pyx_L4_argument_unpacking_done:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":158
- *     cdef double c
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
+ * 
  *     def __init__(self,c):
  *         self.c = c             # <<<<<<<<<<<<<<
- *     cpdef  double loss(self, double p, double y):
- *         cdef double r = p-y
+ * 
+ *     cpdef double loss(self, double p, double y):
  */
-  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_c); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   ((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c = __pyx_t_1;
 
   __pyx_r = 0;
@@ -3751,11 +3751,11 @@ static int __pyx_pf_15sgd_fast_sparse_5Huber___init__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
- *     def __init__(self,c):
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
  *         self.c = c
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double r = p-y
+ * 
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double r = p - y
  *         cdef double abs_r = abs(r)
  */
 
@@ -3776,14 +3776,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_loss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3791,10 +3791,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -3803,33 +3803,33 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":160
- *         self.c = c
- *     cpdef  double loss(self, double p, double y):
- *         cdef double r = p-y             # <<<<<<<<<<<<<<
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
+ * 
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double r = p - y             # <<<<<<<<<<<<<<
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  */
   __pyx_v_r = (__pyx_v_p - __pyx_v_y);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":161
- *     cpdef  double loss(self, double p, double y):
- *         cdef double r = p-y
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+ *     cpdef double loss(self, double p, double y):
+ *         cdef double r = p - y
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return 0.5 * r * r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); 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_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 171; __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 = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":162
- *         cdef double r = p-y
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
+ *         cdef double r = p - y
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return 0.5 * r * r
@@ -3838,12 +3838,12 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":163
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return 0.5 * r * r             # <<<<<<<<<<<<<<
  *         else:
- *             return self.c * abs_r - (0.5*self.c*self.c)
+ *             return self.c * abs_r - (0.5 * self.c * self.c)
  */
     __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);
     goto __pyx_L0;
@@ -3851,12 +3851,12 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":165
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
  *             return 0.5 * r * r
  *         else:
- *             return self.c * abs_r - (0.5*self.c*self.c)             # <<<<<<<<<<<<<<
+ *             return self.c * abs_r - (0.5 * self.c * self.c)             # <<<<<<<<<<<<<<
  * 
- *     cpdef  double dloss(self, double p, double y):
+ *     cpdef double dloss(self, double p, double y):
  */
     __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));
     goto __pyx_L0;
@@ -3878,11 +3878,11 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_loss(struct __pyx_obj_15sgd_fast
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":159
- *     def __init__(self,c):
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
  *         self.c = c
- *     cpdef  double loss(self, double p, double y):             # <<<<<<<<<<<<<<
- *         cdef double r = p-y
+ * 
+ *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *         cdef double r = p - y
  *         cdef double abs_r = abs(r)
  */
 
@@ -3912,29 +3912,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
       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 = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __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 = 159; __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 = 159; __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 = 169; __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 = 169; __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 = 159; __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 = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 169; __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.loss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -3952,10 +3952,10 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_loss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
- *             return self.c * abs_r - (0.5*self.c*self.c)
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
+ *             return self.c * abs_r - (0.5 * self.c * self.c)
  * 
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  */
@@ -3977,14 +3977,14 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   if (unlikely(__pyx_skip_dispatch)) ;
   /* Check if overriden in Python */
   else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
-    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (void *)&__pyx_pf_15sgd_fast_sparse_5Huber_dloss)) {
-      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __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_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
@@ -3992,10 +3992,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_2 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 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 = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __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 = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __pyx_r = __pyx_t_5;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -4004,46 +4004,46 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":168
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
  * 
- *     cpdef  double dloss(self, double p, double y):
+ *     cpdef double dloss(self, double p, double y):
  *         cdef double r = y - p             # <<<<<<<<<<<<<<
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  */
   __pyx_v_r = (__pyx_v_y - __pyx_v_p);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":169
- *     cpdef  double dloss(self, double p, double y):
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":179
+ *     cpdef double dloss(self, double p, double y):
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<
  *         if abs_r <= self.c:
  *             return r
  */
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __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 = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_abs_r = __pyx_t_5;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":170
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":180
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:             # <<<<<<<<<<<<<<
  *             return r
- *         elif r > 0:
+ *         elif r > 0.0:
  */
   __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":171
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":181
  *         cdef double abs_r = abs(r)
  *         if abs_r <= self.c:
  *             return r             # <<<<<<<<<<<<<<
- *         elif r > 0:
+ *         elif r > 0.0:
  *             return self.c
  */
     __pyx_r = __pyx_v_r;
@@ -4051,19 +4051,19 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
     goto __pyx_L3;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":172
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":182
  *         if abs_r <= self.c:
  *             return r
- *         elif r > 0:             # <<<<<<<<<<<<<<
+ *         elif r > 0.0:             # <<<<<<<<<<<<<<
  *             return self.c
  *         else:
  */
-  __pyx_t_6 = (__pyx_v_r > 0);
+  __pyx_t_6 = (__pyx_v_r > 0.0);
   if (__pyx_t_6) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":173
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
  *             return r
- *         elif r > 0:
+ *         elif r > 0.0:
  *             return self.c             # <<<<<<<<<<<<<<
  *         else:
  *             return -self.c
@@ -4074,7 +4074,7 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   }
   /*else*/ {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":175
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":185
  *             return self.c
  *         else:
  *             return -self.c             # <<<<<<<<<<<<<<
@@ -4101,10 +4101,10 @@ static  double __pyx_f_15sgd_fast_sparse_5Huber_dloss(struct __pyx_obj_15sgd_fas
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":167
- *             return self.c * abs_r - (0.5*self.c*self.c)
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
+ *             return self.c * abs_r - (0.5 * self.c * self.c)
  * 
- *     cpdef  double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
+ *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<
  *         cdef double r = y - p
  *         cdef double abs_r = abs(r)
  */
@@ -4135,29 +4135,29 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
       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;}
+        __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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;}
+    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __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 = 177; __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;}
+    __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 = 177; __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 = 177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.Huber.dloss");
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_15sgd_fast_sparse_Huber *)((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_15sgd_fast_sparse_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -4175,7 +4175,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber_dloss(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":177
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":187
  *             return -self.c
  * 
  *     def __reduce__(self):             # <<<<<<<<<<<<<<
@@ -4190,22 +4190,22 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   PyObject *__pyx_t_2 = NULL;
   __Pyx_RefNannySetupContext("__reduce__");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":178
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":188
  * 
  *     def __reduce__(self):
  *         return Huber,(self.c,)             # <<<<<<<<<<<<<<
  * 
- * @cython.boundscheck(False)
+ * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_obj_15sgd_fast_sparse_Huber *)__pyx_v_self)->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __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 = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__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 = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_15sgd_fast_sparse_Huber)));
@@ -4230,7 +4230,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":183
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":194
  * @cython.wraparound(False)
  * @cython.cdivision(True)
  * def plain_sgd(np.ndarray[double, ndim=1] w,             # <<<<<<<<<<<<<<
@@ -4239,7 +4239,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_5Huber___reduce__(PyObject *__pyx_v_
  */
 
 static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n    \n    ";
+static char __pyx_doc_15sgd_fast_sparse_plain_sgd[] = "Cython implementation of SGD with different loss functions and\n    penalties.\n\n    ";
 static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyArrayObject *__pyx_v_w = 0;
   double __pyx_v_intercept;
@@ -4361,119 +4361,119 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept);
       if (likely(values[1])) kw_args--;
       else {
-        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __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, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     }
     if (unlikely(kw_args > 0)) {
-      if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      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 = 194; __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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 186; __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 = 187; __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 197; __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 = 198; __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 = 198; __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 203; __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 = 203; __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 = 204; __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 = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   } else if (PyTuple_GET_SIZE(__pyx_args) != 14) {
     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 = 184; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 195; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_loss = ((struct __pyx_obj_15sgd_fast_sparse_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 = 186; __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 = 187; __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 = 187; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 197; __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 = 198; __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 = 198; __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 = 192; __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 = 192; __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 = 193; __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 = 193; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __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 = 203; __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 = 203; __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 = 204; __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 = 204; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("plain_sgd", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("sgd_fast_sparse.plain_sgd");
   return NULL;
@@ -4492,44 +4492,44 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_bstruct_X_indices.buf = NULL;
   __pyx_bstruct_X_indptr.buf = NULL;
   __pyx_bstruct_Y.buf = NULL;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __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 = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_w), __pyx_ptype_5numpy_ndarray, 1, "w", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_15sgd_fast_sparse_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __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 = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indices), __pyx_ptype_5numpy_ndarray, 1, "X_indices", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_X_indptr), __pyx_ptype_5numpy_ndarray, 1, "X_indptr", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, "Y", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   {
     __Pyx_BufFmt_StackElem __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)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __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 = 194; __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];
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
-    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 = 183; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __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_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 = 183; __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 = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_bstride_0_Y = __pyx_bstruct_Y.strides[0];
   __pyx_bshape_0_Y = __pyx_bstruct_Y.shape[0];
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":199
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
  *     """
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]             # <<<<<<<<<<<<<<
@@ -4538,7 +4538,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_samples = (__pyx_v_Y->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":200
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
  *     # get the data information into easy vars
  *     cdef unsigned int n_samples = Y.shape[0]
  *     cdef unsigned int n_features = w.shape[0]             # <<<<<<<<<<<<<<
@@ -4547,7 +4547,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_n_features = (__pyx_v_w->dimensions[0]);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":202
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
  *     cdef unsigned int n_features = w.shape[0]
  * 
  *     cdef double *w_data_ptr = w.data             # <<<<<<<<<<<<<<
@@ -4556,7 +4556,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_w_data_ptr = ((double *)__pyx_v_w->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":203
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
  * 
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data             # <<<<<<<<<<<<<<
@@ -4565,7 +4565,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_data_ptr = ((double *)__pyx_v_X_data->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":204
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
  *     cdef double *w_data_ptr = w.data
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data             # <<<<<<<<<<<<<<
@@ -4574,7 +4574,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indptr_ptr = ((int *)__pyx_v_X_indptr->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":205
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
  *     cdef double *X_data_ptr = X_data.data
  *     cdef int *X_indptr_ptr = X_indptr.data
  *     cdef int *X_indices_ptr = X_indices.data             # <<<<<<<<<<<<<<
@@ -4583,54 +4583,54 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_X_indices_ptr = ((int *)__pyx_v_X_indices->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":208
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
  * 
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,             # <<<<<<<<<<<<<<
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __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 = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__arange); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_n_samples); 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_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":209
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
  *     # FIXME unsined int?
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                              dtype = np.int32)             # <<<<<<<<<<<<<<
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  */
-  __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 = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__int32); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyEval_CallObjectWithKeywords(__pyx_t_2, __pyx_t_3, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);
   {
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     } else {__pyx_bstride_0_index = __pyx_bstruct_index.strides[0];
       __pyx_bshape_0_index = __pyx_bstruct_index.shape[0];
     }
@@ -4639,7 +4639,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_v_index = ((PyArrayObject *)__pyx_t_5);
   __pyx_t_5 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":210
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
  *     cdef np.ndarray[int, ndim=1, mode="c"] index = np.arange(n_samples,
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data             # <<<<<<<<<<<<<<
@@ -4648,7 +4648,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_index_ptr = ((int *)__pyx_v_index->data);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":211
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
  *                                                              dtype = np.int32)
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0             # <<<<<<<<<<<<<<
@@ -4657,7 +4657,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_offset = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":212
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
  *     cdef int *index_ptr = index.data
  *     cdef int offset = 0
  *     cdef int xnnz = 0             # <<<<<<<<<<<<<<
@@ -4666,7 +4666,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_xnnz = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":213
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
  *     cdef int offset = 0
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0             # <<<<<<<<<<<<<<
@@ -4675,7 +4675,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wscale = 1.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":214
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
  *     cdef int xnnz = 0
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0             # <<<<<<<<<<<<<<
@@ -4684,7 +4684,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":215
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":226
  *     cdef double wscale = 1.0
  *     cdef double eta = 0.0
  *     cdef double p = 0.0             # <<<<<<<<<<<<<<
@@ -4693,7 +4693,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_p = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":216
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
  *     cdef double eta = 0.0
  *     cdef double p = 0.0
  *     cdef double update = 0.0             # <<<<<<<<<<<<<<
@@ -4702,7 +4702,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_update = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":217
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
  *     cdef double p = 0.0
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<
@@ -4711,7 +4711,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sumloss = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":218
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
  *     cdef double update = 0.0
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0             # <<<<<<<<<<<<<<
@@ -4720,7 +4720,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_wnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":219
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
  *     cdef double sumloss = 0.0
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0             # <<<<<<<<<<<<<<
@@ -4729,7 +4729,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":220
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":231
  *     cdef double wnorm = 0.0
  *     cdef double t = 0.0
  *     cdef double y = 0.0             # <<<<<<<<<<<<<<
@@ -4738,7 +4738,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_y = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":221
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
  *     cdef double t = 0.0
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<
@@ -4747,7 +4747,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_count = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":222
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
  *     cdef double y = 0.0
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<
@@ -4756,7 +4756,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_epoch = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":223
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
  *     cdef unsigned int count = 0
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<
@@ -4765,7 +4765,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_i = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":224
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
  *     cdef unsigned int epoch = 0
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0             # <<<<<<<<<<<<<<
@@ -4774,7 +4774,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_sample_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":225
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
  *     cdef unsigned int i = 0
  *     cdef unsigned int sample_idx = 0
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None             # <<<<<<<<<<<<<<
@@ -4786,7 +4786,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __Pyx_BufFmt_StackElem __pyx_stack[1];
     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 = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 236; __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];
     }
@@ -4795,7 +4795,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __Pyx_INCREF(Py_None);
   __pyx_v_q = ((PyArrayObject *)Py_None);
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":227
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
  *     cdef np.ndarray[double, ndim=1, mode="c"] q = None
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:             # <<<<<<<<<<<<<<
@@ -4805,46 +4805,46 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_8 = (__pyx_v_penalty_type != 2);
   if (__pyx_t_8) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":228
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
  *     cdef double *q_data_ptr
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")             # <<<<<<<<<<<<<<
  *         q_data_ptr =  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 = 228; __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 = 239; __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 = 228; __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 = 239; __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 = 228; __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 = 239; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __pyx_t_3 = 0;
-    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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 = 228; __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 = 239; __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 = 228; __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 = 239; __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 = 228; __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 = 239; __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __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 = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyEval_CallObjectWithKeywords(__pyx_t_1, __pyx_t_5, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__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 = 228; __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 = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_7 = ((PyArrayObject *)__pyx_t_4);
     {
       __Pyx_BufFmt_StackElem __pyx_stack[1];
@@ -4861,14 +4861,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __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 = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __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;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":229
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
  *     if penalty_type != L2:
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data             # <<<<<<<<<<<<<<
@@ -4880,7 +4880,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   }
   __pyx_L6:;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":230
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
  *         q = np.zeros((n_features,), dtype = np.float64, order = "c")
  *         q_data_ptr =  q.data
  *     cdef double u = 0.0             # <<<<<<<<<<<<<<
@@ -4889,7 +4889,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_u = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":232
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
  *     cdef double u = 0.0
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))             # <<<<<<<<<<<<<<
@@ -4898,7 +4898,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_typw = sqrt((1.0 / sqrt(__pyx_v_alpha)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":233
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
  *     # computing eta0
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))             # <<<<<<<<<<<<<<
@@ -4907,7 +4907,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_eta0 = (__pyx_v_typw / __pyx_f_15sgd_fast_sparse_max(1.0, ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, (-__pyx_v_typw), 1.0, 0)));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":234
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
  *     cdef double typw = sqrt(1.0 / sqrt(alpha))
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)             # <<<<<<<<<<<<<<
@@ -4916,23 +4916,23 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
   __pyx_v_t = (1.0 / (__pyx_v_eta0 * __pyx_v_alpha));
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":235
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
  *     cdef double eta0 = typw / max(1.0, loss.dloss(-typw, 1.0))
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()             # <<<<<<<<<<<<<<
  *     for epoch from 0 <= epoch < 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 = 235; __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 = 246; __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 = 235; __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 = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __Pyx_DECREF(__pyx_v_t_start);
   __pyx_v_t_start = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":236
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":247
  *     t = 1.0 / (eta0 * alpha)
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:             # <<<<<<<<<<<<<<
@@ -4942,7 +4942,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   __pyx_t_9 = __pyx_v_n_iter;
   for (__pyx_v_epoch = 0; __pyx_v_epoch < __pyx_t_9; __pyx_v_epoch++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":237
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
  *     t_start = time()
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -4952,25 +4952,25 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":238
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
  *     for epoch from 0 <= epoch < n_iter:
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))             # <<<<<<<<<<<<<<
  *         if shuffle:
  *             np.random.shuffle(index)
  */
-      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyLong_FromUnsignedLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __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 = 238; __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 = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L9;
     }
     __pyx_L9:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":239
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
  *         if verbose > 0:
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:             # <<<<<<<<<<<<<<
@@ -4980,27 +4980,27 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_13 = __pyx_v_shuffle;
     if (__pyx_t_13) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":240
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
  *             print("-- Epoch %d" % (epoch + 1))
  *         if shuffle:
  *             np.random.shuffle(index)             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __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 = 251; __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 = 240; __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 = 251; __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__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shuffle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __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(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 251; __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;
@@ -5009,7 +5009,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __pyx_L10:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":241
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":252
  *         if shuffle:
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:             # <<<<<<<<<<<<<<
@@ -5019,7 +5019,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_14 = __pyx_v_n_samples;
     for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":242
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
  *             np.random.shuffle(index)
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]             # <<<<<<<<<<<<<<
@@ -5029,7 +5029,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_15 = __pyx_v_i;
       __pyx_v_sample_idx = (*__Pyx_BufPtrCContig1d(int *, __pyx_bstruct_index.buf, __pyx_t_15, __pyx_bstride_0_index));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":243
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
  *         for i from 0 <= i < n_samples:
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]             # <<<<<<<<<<<<<<
@@ -5038,7 +5038,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_offset = (__pyx_v_X_indptr_ptr[__pyx_v_sample_idx]);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":244
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
  *             sample_idx = index[i]
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset             # <<<<<<<<<<<<<<
@@ -5047,7 +5047,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_xnnz = ((__pyx_v_X_indptr_ptr[(__pyx_v_sample_idx + 1)]) - __pyx_v_offset);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":245
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
  *             offset = X_indptr_ptr[sample_idx]
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]             # <<<<<<<<<<<<<<
@@ -5057,7 +5057,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_16 = __pyx_v_sample_idx;
       __pyx_v_y = (*__Pyx_BufPtrStrided1d(double *, __pyx_bstruct_Y.buf, __pyx_t_16, __pyx_bstride_0_Y));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":246
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
  *             xnnz = X_indptr_ptr[sample_idx + 1] - offset
  *             y = Y[sample_idx]
  *             eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<
@@ -5066,7 +5066,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":248
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
  *             eta = 1.0 / (alpha * t)
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept             # <<<<<<<<<<<<<<
@@ -5075,36 +5075,36 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_p = ((__pyx_f_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);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":249
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
  *             p = (dot(w_data_ptr, X_data_ptr, X_indices_ptr,
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<
  *             update = eta * loss.dloss(p, y)
- *             if update != 0:
+ *             if update != 0.0:
  */
       __pyx_v_sumloss += ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":250
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
  *                      offset, xnnz) * wscale) + intercept
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<
- *             if update != 0:
+ *             if update != 0.0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  */
       __pyx_v_update = (__pyx_v_eta * ((struct __pyx_vtabstruct_15sgd_fast_sparse_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":251
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
  *             sumloss += loss.loss(p, y)
  *             update = eta * loss.dloss(p, y)
- *             if update != 0:             # <<<<<<<<<<<<<<
+ *             if update != 0.0:             # <<<<<<<<<<<<<<
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  */
-      __pyx_t_8 = (__pyx_v_update != 0);
+      __pyx_t_8 = (__pyx_v_update != 0.0);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":253
- *             if update != 0:
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
+ *             if update != 0.0:
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)             # <<<<<<<<<<<<<<
  *                 if fit_intercept == 1:
@@ -5112,7 +5112,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
         __pyx_f_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);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":254
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
  *                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<
@@ -5122,12 +5122,12 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         __pyx_t_8 = (__pyx_v_fit_intercept == 1);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":255
+          /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
  *                     offset, xnnz, update)
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01             # <<<<<<<<<<<<<<
  *             if penalty_type != L1:
- *                 wscale *= (1 - (rho * eta * alpha))
+ *                 wscale *= (1.0 - (rho * eta * alpha))
  */
           __pyx_v_intercept += (__pyx_v_update * 0.01);
           goto __pyx_L14;
@@ -5137,28 +5137,28 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L13:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":256
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
  *                 if fit_intercept == 1:
  *                     intercept += update * 0.01
  *             if penalty_type != L1:             # <<<<<<<<<<<<<<
- *                 wscale *= (1 - (rho * eta * alpha))
+ *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:
  */
       __pyx_t_8 = (__pyx_v_penalty_type != 1);
       if (__pyx_t_8) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":257
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
  *                     intercept += update * 0.01
  *             if penalty_type != L1:
- *                 wscale *= (1 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
+ *                 wscale *= (1.0 - (rho * eta * alpha))             # <<<<<<<<<<<<<<
  *                 if wscale < 1e-9:
  *                     w *= wscale
  */
-        __pyx_v_wscale *= (1 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
+        __pyx_v_wscale *= (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha));
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":258
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
  *             if penalty_type != L1:
- *                 wscale *= (1 - (rho * eta * alpha))
+ *                 wscale *= (1.0 - (rho * eta * alpha))
  *                 if wscale < 1e-9:             # <<<<<<<<<<<<<<
  *                     w *= wscale
  *                     wscale = 1.0
@@ -5166,18 +5166,18 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         __pyx_t_8 = (__pyx_v_wscale < 1.0000000000000001e-09);
         if (__pyx_t_8) {
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":259
- *                 wscale *= (1 - (rho * eta * alpha))
+          /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":270
+ *                 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_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
-          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __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 = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
           __pyx_t_17 = ((PyArrayObject *)__pyx_t_3);
           {
@@ -5195,19 +5195,19 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
             }
             __pyx_bstride_0_w = __pyx_bstruct_w.strides[0];
             __pyx_bshape_0_w = __pyx_bstruct_w.shape[0];
-            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_t_17 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_w));
           __pyx_v_w = ((PyArrayObject *)__pyx_t_3);
           __pyx_t_3 = 0;
 
-          /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":260
+          /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":271
  *                 if wscale < 1e-9:
  *                     w *= wscale
  *                     wscale = 1.0             # <<<<<<<<<<<<<<
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
- *                 u += ((1 - rho) * eta * alpha)
+ *                 u += ((1.0 - rho) * eta * alpha)
  */
           __pyx_v_wscale = 1.0;
           goto __pyx_L16;
@@ -5217,28 +5217,28 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       }
       __pyx_L15:;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":261
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
  *                     w *= wscale
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
- *                 u += ((1 - rho) * eta * alpha)
+ *                 u += ((1.0 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  */
       switch (__pyx_v_penalty_type) {
         case 1:
         case 3:
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":262
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
  *                     wscale = 1.0
  *             if penalty_type == L1 or penalty_type == ELASTICNET:
- *                 u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
+ *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  */
-        __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+        __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":264
- *                 u += ((1 - rho) * eta * alpha)
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
+ *                 u += ((1.0 - rho) * eta * alpha)
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)             # <<<<<<<<<<<<<<
  *             t += 1
@@ -5248,7 +5248,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
         break;
       }
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":265
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
  *                 l1penalty(w_data_ptr, wscale, q_data_ptr,
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1             # <<<<<<<<<<<<<<
@@ -5257,39 +5257,39 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  */
       __pyx_v_t += 1;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":266
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
  *                           X_indices_ptr, offset, xnnz, u)
  *             t += 1
  *             count += 1             # <<<<<<<<<<<<<<
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
- *             u += ((1 - rho) * eta * alpha)
+ *             u += ((1.0 - rho) * eta * alpha)
  */
       __pyx_v_count += 1;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":267
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
  *             t += 1
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<
- *             u += ((1 - rho) * eta * alpha)
+ *             u += ((1.0 - rho) * eta * alpha)
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
  */
     switch (__pyx_v_penalty_type) {
       case 1:
       case 3:
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":268
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
  *             count += 1
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
- *             u += ((1 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
+ *             u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
  * 
  */
-      __pyx_v_u += (((1 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
+      __pyx_v_u += (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":269
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":280
  *         if penalty_type == L1 or penalty_type == ELASTICNET:
- *             u += ((1 - rho) * eta * alpha)
+ *             u += ((1.0 - rho) * eta * alpha)
  *             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)             # <<<<<<<<<<<<<<
  * 
  *         # report epoche information
@@ -5298,7 +5298,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       break;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":272
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
  * 
  *         # report epoche information
  *         if verbose > 0:             # <<<<<<<<<<<<<<
@@ -5308,19 +5308,19 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     __pyx_t_8 = (__pyx_v_verbose > 0);
     if (__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":273
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
  *         # 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 = 273; __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 = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__dot); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __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(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_w));
@@ -5328,80 +5328,80 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __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_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __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 = 273; __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 = 284; __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 = 273; __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 = 284; __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_3 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __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 = 284; __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 = 273; __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 = 284; __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_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_18 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_18 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_v_wnorm = sqrt(__pyx_t_18);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":275
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
  *             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_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyFloat_FromDouble(__pyx_v_wnorm); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":276
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
  *             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 = 276; __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 = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__shape); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":277
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":288
  *             "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_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_1 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __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 = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":278
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":289
  *                                                     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 = 278; __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 = 289; __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 = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyTuple_New(5); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
@@ -5418,165 +5418,165 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
       __pyx_t_5 = 0;
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), __pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":279
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":290
  *                                                     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 = 279; __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 = 290; __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 = 279; __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 = 290; __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 = 279; __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 = 290; __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 = 279; __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 = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_PrintOne(__pyx_t_19) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 290; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       goto __pyx_L17;
     }
     __pyx_L17:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
  * 
  *         # 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 = 282; __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 = 293; __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 = 282; __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 = 293; __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 = 282; __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 = 293; __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 = 282; __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 = 293; __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__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_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_1, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_19);
     PyTuple_SET_ITEM(__pyx_t_19, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_t_2, __pyx_t_19, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
-    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (!__pyx_t_8) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_19 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__any); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_19);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":282
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
  * 
  *         # 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_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__isnan); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_INCREF(((PyObject *)__pyx_v_w));
       PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
       __Pyx_GIVEREF(((PyObject *)__pyx_v_w));
-      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__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 = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
       __Pyx_GIVEREF(__pyx_t_1);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __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 = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_20) {
 
-        /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":283
+        /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
  *         # 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 = 283; __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 = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_5 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__isnan); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_5);
         __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 = 283; __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 = 294; __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 = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_19 = PyTuple_New(1); if (unlikely(!__pyx_t_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__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_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_Call(__pyx_t_5, __pyx_t_19, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
         __Pyx_DECREF(__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 = 283; __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 = 294; __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 = 283; __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 = 294; __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 = 283; __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 = 294; __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 = 283; __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 = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_5);
           PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
           __Pyx_GIVEREF(__pyx_t_1);
           __pyx_t_1 = 0;
-          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_Call(__pyx_t_19, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_19); __pyx_t_19 = 0;
           __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-          __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 283; __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 = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __pyx_t_23 = __pyx_t_22;
         } else {
@@ -5592,41 +5592,41 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     if (__pyx_t_20) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":284
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":295
  *         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 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));
       PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_4));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_Raise(__pyx_t_5, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L18;
     }
     __pyx_L18:;
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":286
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":297
  *             raise ValueError("floating-point under-/overflow occured.")
  * 
  *     w *= wscale             # <<<<<<<<<<<<<<
  *     return w, intercept
  * 
  */
-  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyFloat_FromDouble(__pyx_v_wscale); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_InPlaceMultiply(((PyObject *)__pyx_v_w), __pyx_t_5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);
   {
@@ -5644,14 +5644,14 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
     }
     __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 = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_17 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_v_w));
   __pyx_v_w = ((PyArrayObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":287
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
  * 
  *     w *= wscale
  *     return w, intercept             # <<<<<<<<<<<<<<
@@ -5659,9 +5659,9 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
  * 
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __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 = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)__pyx_v_w));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_w));
@@ -5718,7 +5718,7 @@ static PyObject *__pyx_pf_15sgd_fast_sparse_plain_sgd(PyObject *__pyx_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":290
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":301
  * 
  * 
  * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<
@@ -5731,12 +5731,12 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("max");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":291
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
  * 
  * cdef inline double max(double a, double b):
  *     return a if a >= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef inline double min(double a, double b):
+ * 
  */
   if ((__pyx_v_a >= __pyx_v_b)) {
     __pyx_t_1 = __pyx_v_a;
@@ -5752,8 +5752,8 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_max(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":293
- *     return a if a >= b else b
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":305
+ * 
  * 
  * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<
  *     return a if a <= b else b
@@ -5765,12 +5765,12 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   double __pyx_t_1;
   __Pyx_RefNannySetupContext("min");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":294
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":306
  * 
  * cdef inline double min(double a, double b):
  *     return a if a <= b else b             # <<<<<<<<<<<<<<
  * 
- * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
+ * 
  */
   if ((__pyx_v_a <= __pyx_v_b)) {
     __pyx_t_1 = __pyx_v_a;
@@ -5786,8 +5786,8 @@ static CYTHON_INLINE double __pyx_f_15sgd_fast_sparse_min(double __pyx_v_a, doub
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":296
- *     return a if a <= b else b
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":309
+ * 
  * 
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,             # <<<<<<<<<<<<<<
  *                 int offset, int xnnz):
@@ -5801,7 +5801,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("dot");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":298
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
  * cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
  *                 int offset, int xnnz):
  *     cdef double sum = 0.0             # <<<<<<<<<<<<<<
@@ -5810,7 +5810,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_sum = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":300
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
  *     cdef double sum = 0.0
  *     cdef int j
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5820,7 +5820,7 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":301
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
  *     cdef int j
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5830,12 +5830,12 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
     __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)]));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":302
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
  *     for j from 0 <= j < xnnz:
  *         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
  *     return sum             # <<<<<<<<<<<<<<
  * 
- * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
+ * 
  */
   __pyx_r = __pyx_v_sum;
   goto __pyx_L0;
@@ -5846,8 +5846,8 @@ static  double __pyx_f_15sgd_fast_sparse_dot(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":304
- *     return sum
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
+ * 
  * 
  * cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,             # <<<<<<<<<<<<<<
  *                 int *X_indices_ptr, int offset, int xnnz, double c):
@@ -5864,7 +5864,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("add");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":311
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":325
  *     cdef int idx
  *     cdef double val
  *     cdef double innerprod = 0.0             # <<<<<<<<<<<<<<
@@ -5873,7 +5873,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_innerprod = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":312
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":326
  *     cdef double val
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0             # <<<<<<<<<<<<<<
@@ -5882,7 +5882,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
   __pyx_v_xsqnorm = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":313
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
  *     cdef double innerprod = 0.0
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -5892,7 +5892,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":314
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
  *     cdef double xsqnorm = 0.0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5901,7 +5901,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":315
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]             # <<<<<<<<<<<<<<
@@ -5910,7 +5910,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_val = (__pyx_v_X_data_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":316
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
  *         idx = X_indices_ptr[offset + j]
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)             # <<<<<<<<<<<<<<
@@ -5919,7 +5919,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_innerprod += ((__pyx_v_w_data_ptr[__pyx_v_idx]) * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":317
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
  *         val = X_data_ptr[offset + j]
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)             # <<<<<<<<<<<<<<
@@ -5928,7 +5928,7 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
  */
     __pyx_v_xsqnorm += (__pyx_v_val * __pyx_v_val);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":318
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
  *         innerprod += (w_data_ptr[idx] * val)
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)             # <<<<<<<<<<<<<<
@@ -5938,12 +5938,12 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
     (__pyx_v_w_data_ptr[__pyx_v_idx]) += (__pyx_v_val * (__pyx_v_c / __pyx_v_wscale));
   }
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":319
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
  *         xsqnorm += (val * val)
  *         w_data_ptr[idx] += val * (c / wscale)
  *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)             # <<<<<<<<<<<<<<
  * 
- * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
+ * 
  */
   __pyx_r = (((__pyx_v_xsqnorm * __pyx_v_c) * __pyx_v_c) + (((2.0 * __pyx_v_innerprod) * __pyx_v_wscale) * __pyx_v_c));
   goto __pyx_L0;
@@ -5954,8 +5954,8 @@ static  double __pyx_f_15sgd_fast_sparse_add(double *__pyx_v_w_data_ptr, double
   return __pyx_r;
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":321
- *     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":336
+ * 
  * 
  * cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,             # <<<<<<<<<<<<<<
  *                     int *X_indices_ptr, int offset, int xnnz, double u):
@@ -5970,7 +5970,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("l1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":327
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":342
  *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -5979,7 +5979,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":328
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":343
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -5988,7 +5988,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":329
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":344
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     cdef int idx = 0             # <<<<<<<<<<<<<<
@@ -5997,7 +5997,7 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
  */
   __pyx_v_idx = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":330
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":345
  *     cdef int j = 0
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:             # <<<<<<<<<<<<<<
@@ -6007,73 +6007,73 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __pyx_t_1 = __pyx_v_xnnz;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":331
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":346
  *     cdef int idx = 0
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]             # <<<<<<<<<<<<<<
  *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:
+ *         if (wscale * w_data_ptr[idx]) > 0.0:
  */
     __pyx_v_idx = (__pyx_v_X_indices_ptr[(__pyx_v_offset + __pyx_v_j)]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":332
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":347
  *     for j from 0 <= j < xnnz:
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<
- *         if (wscale * w_data_ptr[idx]) > 0:
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+ *         if (wscale * w_data_ptr[idx]) > 0.0:
+ *             w_data_ptr[idx] = max(0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":333
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":348
  *         idx = X_indices_ptr[offset + j]
  *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+ *         if (wscale * w_data_ptr[idx]) > 0.0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = max(0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  *                                                         / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":334
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":349
  *         z = w_data_ptr[idx]
- *         if (wscale * w_data_ptr[idx]) > 0:
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])             # <<<<<<<<<<<<<<
+ *         if (wscale * w_data_ptr[idx]) > 0.0:
+ *             w_data_ptr[idx] = max(0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx])             # <<<<<<<<<<<<<<
  *                                                         / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:
+ *         elif (wscale * w_data_ptr[idx]) < 0.0:
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":336
- *             w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
+ *             w_data_ptr[idx] = max(0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
  *                                                         / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+ *         elif (wscale * w_data_ptr[idx]) < 0.0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[idx] = min(0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
  *                                                         / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":337
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":352
  *                                                         / wscale) )
- *         elif (wscale * w_data_ptr[idx]) < 0:
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])             # <<<<<<<<<<<<<<
+ *         elif (wscale * w_data_ptr[idx]) < 0.0:
+ *             w_data_ptr[idx] = min(0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx])             # <<<<<<<<<<<<<<
  *                                                         / wscale) )
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
  */
-      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_15sgd_fast_sparse_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":339
- *             w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":354
+ *             w_data_ptr[idx] = min(0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
  *                                                         / wscale) )
  *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<
  * 
- * cdef void finall1penalty(double *w_data_ptr, double wscale,
+ * 
  */
     (__pyx_v_q_data_ptr[__pyx_v_idx]) += (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z));
   }
@@ -6081,8 +6081,8 @@ static  void __pyx_f_15sgd_fast_sparse_l1penalty(double *__pyx_v_w_data_ptr, dou
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":341
- *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
+/* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":357
+ * 
  * 
  * cdef void finall1penalty(double *w_data_ptr, double wscale,             # <<<<<<<<<<<<<<
  *                          unsigned int n_features,
@@ -6096,7 +6096,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   int __pyx_t_2;
   __Pyx_RefNannySetupContext("finall1penalty");
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":351
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":367
  * 
  *     """
  *     cdef double z = 0.0             # <<<<<<<<<<<<<<
@@ -6105,7 +6105,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_z = 0.0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":352
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":368
  *     """
  *     cdef double z = 0.0
  *     cdef int j = 0             # <<<<<<<<<<<<<<
@@ -6114,70 +6114,70 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
  */
   __pyx_v_j = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":353
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":369
  *     cdef double z = 0.0
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:             # <<<<<<<<<<<<<<
  *         z = w_data_ptr[j]
- *         if (wscale * w_data_ptr[j]) > 0:
+ *         if (wscale * w_data_ptr[j]) > 0.0:
  */
   __pyx_t_1 = __pyx_v_n_features;
   for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_1; __pyx_v_j++) {
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":354
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":370
  *     cdef int j = 0
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]             # <<<<<<<<<<<<<<
- *         if (wscale * w_data_ptr[j]) > 0:
- *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_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])
  */
     __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_j]);
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":355
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":371
  *     for j from 0 <= j < n_features:
  *         z = w_data_ptr[j]
- *         if (wscale * w_data_ptr[j]) > 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_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])
  *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) > 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":356
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":372
  *         z = w_data_ptr[j]
- *         if (wscale * w_data_ptr[j]) > 0:
- *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_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])             # <<<<<<<<<<<<<<
  *                                                     / wscale) )
- *         elif (wscale * w_data_ptr[j]) < 0:
+ *         elif (wscale * w_data_ptr[j]) < 0.0:
  */
-      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_max(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_j]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":358
- *             w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_data_ptr[j])
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":374
+ *             w_data_ptr[j] = max(0.0, w_data_ptr[j] - ((u + q_data_ptr[j])
  *                                                     / wscale) )
- *         elif (wscale * w_data_ptr[j]) < 0:             # <<<<<<<<<<<<<<
- *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+ *         elif (wscale * w_data_ptr[j]) < 0.0:             # <<<<<<<<<<<<<<
+ *             w_data_ptr[j] = min(0.0, w_data_ptr[j] + ((u - q_data_ptr[j])
  *                                                     / wscale) )
  */
-    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0);
+    __pyx_t_2 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_j])) < 0.0);
     if (__pyx_t_2) {
 
-      /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":359
+      /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":375
  *                                                     / wscale) )
- *         elif (wscale * w_data_ptr[j]) < 0:
- *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])             # <<<<<<<<<<<<<<
+ *         elif (wscale * w_data_ptr[j]) < 0.0:
+ *             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))
  */
-      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_min(0, ((__pyx_v_w_data_ptr[__pyx_v_j]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
+      (__pyx_v_w_data_ptr[__pyx_v_j]) = __pyx_f_15sgd_fast_sparse_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_j]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_j])) / __pyx_v_wscale)));
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":361
- *             w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+    /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":377
+ *             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))             # <<<<<<<<<<<<<<
  * 
@@ -6188,7 +6188,7 @@ static  void __pyx_f_15sgd_fast_sparse_finall1penalty(double *__pyx_v_w_data_ptr
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":187
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":187
  *         # experimental exception made for __getbuffer__ and __releasebuffer__
  *         # -- the details of this may change.
  *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<
@@ -6224,7 +6224,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __Pyx_GIVEREF(__pyx_v_info->obj);
   __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":193
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":193
  *             # of flags
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -6233,7 +6233,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":194
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":194
  *             cdef int copy_shape, i, ndim
  *             cdef int endian_detector = 1
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -6242,7 +6242,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":196
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":196
  *             cdef bint little_endian = ((&endian_detector)[0] != 0)
  * 
  *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<
@@ -6251,7 +6251,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":198
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":198
  *             ndim = PyArray_NDIM(self)
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -6261,7 +6261,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":199
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":199
  * 
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 copy_shape = 1             # <<<<<<<<<<<<<<
@@ -6273,7 +6273,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":201
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":201
  *                 copy_shape = 1
  *             else:
  *                 copy_shape = 0             # <<<<<<<<<<<<<<
@@ -6284,7 +6284,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":203
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":203
  *                 copy_shape = 0
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<
@@ -6294,7 +6294,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":204
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":204
  * 
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<
@@ -6308,7 +6308,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":205
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":205
  *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not C contiguous")             # <<<<<<<<<<<<<<
@@ -6330,7 +6330,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L6:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":207
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":207
  *                 raise ValueError(u"ndarray is not C contiguous")
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<
@@ -6340,7 +6340,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);
   if (__pyx_t_3) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":208
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":208
  * 
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<
@@ -6354,7 +6354,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_2) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":209
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":209
  *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)
  *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):
  *                 raise ValueError(u"ndarray is not Fortran contiguous")             # <<<<<<<<<<<<<<
@@ -6376,7 +6376,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L7:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":211
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":211
  *                 raise ValueError(u"ndarray is not Fortran contiguous")
  * 
  *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<
@@ -6385,7 +6385,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":212
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":212
  * 
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim             # <<<<<<<<<<<<<<
@@ -6394,7 +6394,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->ndim = __pyx_v_ndim;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":213
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":213
  *             info.buf = PyArray_DATA(self)
  *             info.ndim = ndim
  *             if copy_shape:             # <<<<<<<<<<<<<<
@@ -6404,7 +6404,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_6 = __pyx_v_copy_shape;
   if (__pyx_t_6) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":216
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":216
  *                 # Allocate new buffer for strides and shape info. This is allocated
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<
@@ -6413,7 +6413,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":217
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":217
  *                 # as one block, strides first.
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<
@@ -6422,7 +6422,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":218
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":218
  *                 info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):             # <<<<<<<<<<<<<<
@@ -6433,7 +6433,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
       __pyx_v_i = __pyx_t_7;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":219
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":219
  *                 info.shape = info.strides + ndim
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<
@@ -6442,7 +6442,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
       (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_v_self))[__pyx_v_i]);
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":220
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":220
  *                 for i in range(ndim):
  *                     info.strides[i] = PyArray_STRIDES(self)[i]
  *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<
@@ -6455,7 +6455,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":222
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":222
  *                     info.shape[i] = PyArray_DIMS(self)[i]
  *             else:
  *                 info.strides = PyArray_STRIDES(self)             # <<<<<<<<<<<<<<
@@ -6464,7 +6464,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_v_self)));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":223
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":223
  *             else:
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)             # <<<<<<<<<<<<<<
@@ -6475,7 +6475,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L8:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":224
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":224
  *                 info.strides = PyArray_STRIDES(self)
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL             # <<<<<<<<<<<<<<
@@ -6484,7 +6484,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->suboffsets = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":225
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":225
  *                 info.shape = PyArray_DIMS(self)
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<
@@ -6493,7 +6493,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_v_self));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":226
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":226
  *             info.suboffsets = NULL
  *             info.itemsize = PyArray_ITEMSIZE(self)
  *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<
@@ -6502,7 +6502,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_v_self)));
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":229
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":229
  * 
  *             cdef int t
  *             cdef char* f = NULL             # <<<<<<<<<<<<<<
@@ -6511,7 +6511,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_f = NULL;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":230
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":230
  *             cdef int t
  *             cdef char* f = NULL
  *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<
@@ -6521,7 +6521,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));
   __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":234
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":234
  *             cdef int offset
  * 
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<
@@ -6530,7 +6530,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
   __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":236
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":236
  *             cdef bint hasfields = PyDataType_HASFIELDS(descr)
  * 
  *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<
@@ -6546,7 +6546,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":238
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":238
  *             if not hasfields and not copy_shape:
  *                 # do not call releasebuffer
  *                 info.obj = None             # <<<<<<<<<<<<<<
@@ -6562,7 +6562,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":241
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":241
  *             else:
  *                 # need to call releasebuffer
  *                 info.obj = self             # <<<<<<<<<<<<<<
@@ -6577,7 +6577,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   __pyx_L11:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":243
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":243
  *                 info.obj = self
  * 
  *             if not hasfields:             # <<<<<<<<<<<<<<
@@ -6587,7 +6587,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   __pyx_t_1 = (!__pyx_v_hasfields);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":244
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":244
  * 
  *             if not hasfields:
  *                 t = descr.type_num             # <<<<<<<<<<<<<<
@@ -6596,7 +6596,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_t = __pyx_v_descr->type_num;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":245
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":245
  *             if not hasfields:
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
@@ -6611,7 +6611,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     if (!__pyx_t_2) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":246
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":246
  *                 t = descr.type_num
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
@@ -6631,7 +6631,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     if (__pyx_t_1) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":247
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":247
  *                 if ((descr.byteorder == '>' and little_endian) or
  *                     (descr.byteorder == '<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
@@ -6653,7 +6653,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     __pyx_L13:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":248
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":248
  *                     (descr.byteorder == '<' and not little_endian)):
  *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"             # <<<<<<<<<<<<<<
@@ -6666,7 +6666,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":249
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":249
  *                     raise ValueError(u"Non-native byte order not supported")
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"             # <<<<<<<<<<<<<<
@@ -6679,7 +6679,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":250
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":250
  *                 if   t == NPY_BYTE:        f = "b"
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"             # <<<<<<<<<<<<<<
@@ -6692,7 +6692,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":251
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":251
  *                 elif t == NPY_UBYTE:       f = "B"
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"             # <<<<<<<<<<<<<<
@@ -6705,7 +6705,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":252
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":252
  *                 elif t == NPY_SHORT:       f = "h"
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"             # <<<<<<<<<<<<<<
@@ -6718,7 +6718,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":253
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":253
  *                 elif t == NPY_USHORT:      f = "H"
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"             # <<<<<<<<<<<<<<
@@ -6731,7 +6731,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":254
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":254
  *                 elif t == NPY_INT:         f = "i"
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"             # <<<<<<<<<<<<<<
@@ -6744,7 +6744,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":255
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":255
  *                 elif t == NPY_UINT:        f = "I"
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"             # <<<<<<<<<<<<<<
@@ -6757,7 +6757,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":256
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":256
  *                 elif t == NPY_LONG:        f = "l"
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"             # <<<<<<<<<<<<<<
@@ -6770,7 +6770,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":257
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":257
  *                 elif t == NPY_ULONG:       f = "L"
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"             # <<<<<<<<<<<<<<
@@ -6783,7 +6783,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":258
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":258
  *                 elif t == NPY_LONGLONG:    f = "q"
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"             # <<<<<<<<<<<<<<
@@ -6796,7 +6796,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":259
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":259
  *                 elif t == NPY_ULONGLONG:   f = "Q"
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"             # <<<<<<<<<<<<<<
@@ -6809,7 +6809,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":260
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":260
  *                 elif t == NPY_FLOAT:       f = "f"
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"             # <<<<<<<<<<<<<<
@@ -6822,7 +6822,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":261
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":261
  *                 elif t == NPY_DOUBLE:      f = "d"
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"             # <<<<<<<<<<<<<<
@@ -6835,7 +6835,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":262
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":262
  *                 elif t == NPY_LONGDOUBLE:  f = "g"
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"             # <<<<<<<<<<<<<<
@@ -6848,7 +6848,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":263
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":263
  *                 elif t == NPY_CFLOAT:      f = "Zf"
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"             # <<<<<<<<<<<<<<
@@ -6861,7 +6861,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
       goto __pyx_L14;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":264
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":264
  *                 elif t == NPY_CDOUBLE:     f = "Zd"
  *                 elif t == NPY_CLONGDOUBLE: f = "Zg"
  *                 elif t == NPY_OBJECT:      f = "O"             # <<<<<<<<<<<<<<
@@ -6875,7 +6875,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":266
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":266
  *                 elif t == NPY_OBJECT:      f = "O"
  *                 else:
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
@@ -6901,7 +6901,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     }
     __pyx_L14:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":267
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":267
  *                 else:
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f             # <<<<<<<<<<<<<<
@@ -6910,7 +6910,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = __pyx_v_f;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":268
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":268
  *                     raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *                 info.format = f
  *                 return             # <<<<<<<<<<<<<<
@@ -6923,7 +6923,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":270
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":270
  *                 return
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<
@@ -6932,7 +6932,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_info->format = ((char *)malloc(255));
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":271
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":271
  *             else:
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<
@@ -6941,7 +6941,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     (__pyx_v_info->format[0]) = '^';
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":272
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":272
  *                 info.format = stdlib.malloc(_buffer_format_string_len)
  *                 info.format[0] = '^' # Native data types, manual alignment
  *                 offset = 0             # <<<<<<<<<<<<<<
@@ -6950,7 +6950,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
  */
     __pyx_v_offset = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":275
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":275
  *                 f = _util_dtypestring(descr, info.format + 1,
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)             # <<<<<<<<<<<<<<
@@ -6960,7 +6960,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
     __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_f = __pyx_t_9;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":276
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":276
  *                                       info.format + _buffer_format_string_len,
  *                                       &offset)
  *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<
@@ -6993,7 +6993,7 @@ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buf
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":278
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":278
  *                 f[0] = 0 # Terminate format string
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<
@@ -7007,7 +7007,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __Pyx_RefNannySetupContext("__releasebuffer__");
   __Pyx_INCREF((PyObject *)__pyx_v_self);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":279
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":279
  * 
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<
@@ -7017,7 +7017,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_v_self));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":280
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":280
  *         def __releasebuffer__(ndarray self, Py_buffer* info):
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<
@@ -7029,7 +7029,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   }
   __pyx_L5:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":281
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":281
  *             if PyArray_HASFIELDS(self):
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<
@@ -7039,7 +7039,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":282
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":282
  *                 stdlib.free(info.format)
  *             if sizeof(npy_intp) != sizeof(Py_ssize_t):
  *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<
@@ -7055,7 +7055,7 @@ static void __pyx_pf_5numpy_7ndarray___releasebuffer__(PyObject *__pyx_v_self, P
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":755
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":755
  * ctypedef npy_cdouble     complex_t
  * 
  * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<
@@ -7068,7 +7068,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew1");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":756
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":756
  * 
  * cdef inline object PyArray_MultiIterNew1(a):
  *     return PyArray_MultiIterNew(1, a)             # <<<<<<<<<<<<<<
@@ -7094,7 +7094,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":758
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":758
  *     return PyArray_MultiIterNew(1, a)
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<
@@ -7107,7 +7107,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew2");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":759
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":759
  * 
  * cdef inline object PyArray_MultiIterNew2(a, b):
  *     return PyArray_MultiIterNew(2, a, b)             # <<<<<<<<<<<<<<
@@ -7133,7 +7133,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":761
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":761
  *     return PyArray_MultiIterNew(2, a, b)
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<
@@ -7146,7 +7146,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew3");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":762
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":762
  * 
  * cdef inline object PyArray_MultiIterNew3(a, b, c):
  *     return PyArray_MultiIterNew(3, a, b,  c)             # <<<<<<<<<<<<<<
@@ -7172,7 +7172,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":764
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":764
  *     return PyArray_MultiIterNew(3, a, b,  c)
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<
@@ -7185,7 +7185,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew4");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":765
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":765
  * 
  * cdef inline object PyArray_MultiIterNew4(a, b, c, d):
  *     return PyArray_MultiIterNew(4, a, b, c,  d)             # <<<<<<<<<<<<<<
@@ -7211,7 +7211,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":767
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":767
  *     return PyArray_MultiIterNew(4, a, b, c,  d)
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<
@@ -7224,7 +7224,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   PyObject *__pyx_t_1 = NULL;
   __Pyx_RefNannySetupContext("PyArray_MultiIterNew5");
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":768
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":768
  * 
  * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):
  *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)             # <<<<<<<<<<<<<<
@@ -7250,7 +7250,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":770
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":770
  *     return PyArray_MultiIterNew(5, a, b, c,  d,  e)
  * 
  * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<
@@ -7285,7 +7285,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);
   __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":777
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":777
  *     cdef int delta_offset
  *     cdef tuple i
  *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<
@@ -7294,7 +7294,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
   __pyx_v_endian_detector = 1;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":778
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":778
  *     cdef tuple i
  *     cdef int endian_detector = 1
  *     cdef bint little_endian = ((&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<
@@ -7303,7 +7303,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
   __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":781
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":781
  *     cdef tuple fields
  * 
  *     for childname in descr.names:             # <<<<<<<<<<<<<<
@@ -7322,7 +7322,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __pyx_v_childname = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":782
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":782
  * 
  *     for childname in descr.names:
  *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<
@@ -7336,7 +7336,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __pyx_v_fields = ((PyObject *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":783
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":783
  *     for childname in descr.names:
  *         fields = descr.fields[childname]
  *         child, new_offset = fields             # <<<<<<<<<<<<<<
@@ -7359,7 +7359,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":785
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":785
  *         child, new_offset = fields
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<
@@ -7384,7 +7384,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":786
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":786
  * 
  *         if (end - f) - (new_offset - offset[0]) < 15:
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")             # <<<<<<<<<<<<<<
@@ -7406,7 +7406,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     __pyx_L5:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":788
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":788
  *             raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd")
  * 
  *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<
@@ -7421,7 +7421,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     if (!__pyx_t_7) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":789
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":789
  * 
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<
@@ -7441,7 +7441,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":790
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":790
  *         if ((child.byteorder == '>' and little_endian) or
  *             (child.byteorder == '<' and not little_endian)):
  *             raise ValueError(u"Non-native byte order not supported")             # <<<<<<<<<<<<<<
@@ -7463,7 +7463,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     __pyx_L6:;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":800
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":800
  * 
  *         # Output padding bytes
  *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<
@@ -7480,7 +7480,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       if (!__pyx_t_6) break;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":801
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":801
  *         # Output padding bytes
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte             # <<<<<<<<<<<<<<
@@ -7489,7 +7489,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       (__pyx_v_f[0]) = 120;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":802
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":802
  *         while offset[0] < new_offset:
  *             f[0] = 120 # "x"; pad byte
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7498,7 +7498,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
       __pyx_v_f += 1;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":803
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":803
  *             f[0] = 120 # "x"; pad byte
  *             f += 1
  *             offset[0] += 1             # <<<<<<<<<<<<<<
@@ -7508,7 +7508,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       (__pyx_v_offset[0]) += 1;
     }
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":805
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":805
  *             offset[0] += 1
  * 
  *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<
@@ -7517,7 +7517,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
  */
     (__pyx_v_offset[0]) += __pyx_v_child->elsize;
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":807
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":807
  *         offset[0] += child.itemsize
  * 
  *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<
@@ -7527,7 +7527,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));
     if (__pyx_t_6) {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":808
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":808
  * 
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num             # <<<<<<<<<<<<<<
@@ -7540,7 +7540,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       __pyx_v_t = __pyx_t_3;
       __pyx_t_3 = 0;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":809
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":809
  *         if not PyDataType_HASFIELDS(child):
  *             t = child.type_num
  *             if end - f < 5:             # <<<<<<<<<<<<<<
@@ -7550,7 +7550,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);
       if (__pyx_t_6) {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":810
+        /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":810
  *             t = child.type_num
  *             if end - f < 5:
  *                 raise RuntimeError(u"Format string allocated too short.")             # <<<<<<<<<<<<<<
@@ -7572,7 +7572,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       }
       __pyx_L10:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":813
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":813
  * 
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"             # <<<<<<<<<<<<<<
@@ -7591,7 +7591,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":814
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":814
  *             # Until ticket #99 is fixed, use integers to avoid warnings
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"             # <<<<<<<<<<<<<<
@@ -7610,7 +7610,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":815
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":815
  *             if   t == NPY_BYTE:        f[0] =  98 #"b"
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"             # <<<<<<<<<<<<<<
@@ -7629,7 +7629,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":816
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":816
  *             elif t == NPY_UBYTE:       f[0] =  66 #"B"
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"             # <<<<<<<<<<<<<<
@@ -7648,7 +7648,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":817
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":817
  *             elif t == NPY_SHORT:       f[0] = 104 #"h"
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"             # <<<<<<<<<<<<<<
@@ -7667,7 +7667,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":818
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":818
  *             elif t == NPY_USHORT:      f[0] =  72 #"H"
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"             # <<<<<<<<<<<<<<
@@ -7686,7 +7686,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":819
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":819
  *             elif t == NPY_INT:         f[0] = 105 #"i"
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"             # <<<<<<<<<<<<<<
@@ -7705,7 +7705,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":820
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":820
  *             elif t == NPY_UINT:        f[0] =  73 #"I"
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"             # <<<<<<<<<<<<<<
@@ -7724,7 +7724,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":821
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":821
  *             elif t == NPY_LONG:        f[0] = 108 #"l"
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"             # <<<<<<<<<<<<<<
@@ -7743,7 +7743,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":822
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":822
  *             elif t == NPY_ULONG:       f[0] = 76  #"L"
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"             # <<<<<<<<<<<<<<
@@ -7762,7 +7762,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":823
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":823
  *             elif t == NPY_LONGLONG:    f[0] = 113 #"q"
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"             # <<<<<<<<<<<<<<
@@ -7781,7 +7781,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":824
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":824
  *             elif t == NPY_ULONGLONG:   f[0] = 81  #"Q"
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"             # <<<<<<<<<<<<<<
@@ -7800,7 +7800,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":825
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":825
  *             elif t == NPY_FLOAT:       f[0] = 102 #"f"
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"             # <<<<<<<<<<<<<<
@@ -7819,7 +7819,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":826
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":826
  *             elif t == NPY_DOUBLE:      f[0] = 100 #"d"
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<
@@ -7840,7 +7840,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":827
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":827
  *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #"g"
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<
@@ -7861,7 +7861,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":828
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":828
  *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<
@@ -7882,7 +7882,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
         goto __pyx_L11;
       }
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":829
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":829
  *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd
  *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"             # <<<<<<<<<<<<<<
@@ -7902,7 +7902,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       }
       /*else*/ {
 
-        /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":831
+        /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":831
  *             elif t == NPY_OBJECT:      f[0] = 79 #"O"
  *             else:
  *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)             # <<<<<<<<<<<<<<
@@ -7925,7 +7925,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
       }
       __pyx_L11:;
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":832
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":832
  *             else:
  *                 raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t)
  *             f += 1             # <<<<<<<<<<<<<<
@@ -7937,7 +7937,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
     }
     /*else*/ {
 
-      /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":836
+      /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":836
  *             # Cython ignores struct boundary information ("T{...}"),
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<
@@ -7951,7 +7951,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":837
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":837
  *             # so don't output it
  *             f = _util_dtypestring(child, f, end, offset)
  *     return f             # <<<<<<<<<<<<<<
@@ -7981,7 +7981,7 @@ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx
   return __pyx_r;
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":952
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":952
  * 
  * 
  * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<
@@ -7996,7 +7996,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_INCREF((PyObject *)__pyx_v_arr);
   __Pyx_INCREF(__pyx_v_base);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":954
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":954
  * cdef inline void set_array_base(ndarray arr, object base):
  *      cdef PyObject* baseptr
  *      if base is None:             # <<<<<<<<<<<<<<
@@ -8006,7 +8006,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __pyx_t_1 = (__pyx_v_base == Py_None);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":955
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":955
  *      cdef PyObject* baseptr
  *      if base is None:
  *          baseptr = NULL             # <<<<<<<<<<<<<<
@@ -8018,7 +8018,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":957
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":957
  *          baseptr = NULL
  *      else:
  *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<
@@ -8027,7 +8027,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
     Py_INCREF(__pyx_v_base);
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":958
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":958
  *      else:
  *          Py_INCREF(base) # important to do this before decref below!
  *          baseptr = base             # <<<<<<<<<<<<<<
@@ -8038,7 +8038,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   }
   __pyx_L3:;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":959
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":959
  *          Py_INCREF(base) # important to do this before decref below!
  *          baseptr = base
  *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<
@@ -8047,7 +8047,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
  */
   Py_XDECREF(__pyx_v_arr->base);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":960
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":960
  *          baseptr = base
  *      Py_XDECREF(arr.base)
  *      arr.base = baseptr             # <<<<<<<<<<<<<<
@@ -8061,7 +8061,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":962
+/* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":962
  *      arr.base = baseptr
  * 
  * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<
@@ -8075,7 +8075,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __Pyx_RefNannySetupContext("get_array_base");
   __Pyx_INCREF((PyObject *)__pyx_v_arr);
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":963
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":963
  * 
  * cdef inline object get_array_base(ndarray arr):
  *     if arr.base is NULL:             # <<<<<<<<<<<<<<
@@ -8085,7 +8085,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   __pyx_t_1 = (__pyx_v_arr->base == NULL);
   if (__pyx_t_1) {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":964
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":964
  * cdef inline object get_array_base(ndarray arr):
  *     if arr.base is NULL:
  *         return None             # <<<<<<<<<<<<<<
@@ -8100,7 +8100,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py
   }
   /*else*/ {
 
-    /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/numpy.pxd":966
+    /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/numpy.pxd":966
  *         return None
  *     else:
  *         return arr.base             # <<<<<<<<<<<<<<
@@ -9554,7 +9554,7 @@ 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 = 43; __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 = 284; __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 = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
@@ -9651,9 +9651,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Regression.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_10Regression_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Regression.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Regression.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_15sgd_fast_sparse_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Regression = &__pyx_type_15sgd_fast_sparse_Regression;
   __pyx_vtabptr_15sgd_fast_sparse_Classification = &__pyx_vtable_15sgd_fast_sparse_Classification;
   __pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_LossFunction;
@@ -9665,9 +9665,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Classification.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_14Classification_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Classification.tp_base = __pyx_ptype_15sgd_fast_sparse_LossFunction;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Classification.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_15sgd_fast_sparse_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Classification = &__pyx_type_15sgd_fast_sparse_Classification;
   __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber = &__pyx_vtable_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9679,9 +9679,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_ModifiedHuber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_13ModifiedHuber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_ModifiedHuber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_15sgd_fast_sparse_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_ModifiedHuber = &__pyx_type_15sgd_fast_sparse_ModifiedHuber;
   __pyx_vtabptr_15sgd_fast_sparse_Hinge = &__pyx_vtable_15sgd_fast_sparse_Hinge;
   __pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9693,9 +9693,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Hinge.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Hinge_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Hinge.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Hinge.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_15sgd_fast_sparse_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Hinge = &__pyx_type_15sgd_fast_sparse_Hinge;
   __pyx_vtabptr_15sgd_fast_sparse_Log = &__pyx_vtable_15sgd_fast_sparse_Log;
   __pyx_vtable_15sgd_fast_sparse_Log.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Classification;
@@ -9707,9 +9707,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Log.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_3Log_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Log.tp_base = __pyx_ptype_15sgd_fast_sparse_Classification;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Log.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_15sgd_fast_sparse_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Log = &__pyx_type_15sgd_fast_sparse_Log;
   __pyx_vtabptr_15sgd_fast_sparse_SquaredError = &__pyx_vtable_15sgd_fast_sparse_SquaredError;
   __pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9721,9 +9721,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_SquaredError.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_12SquaredError_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_SquaredError.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_SquaredError.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "SquaredError", (PyObject *)&__pyx_type_15sgd_fast_sparse_SquaredError) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_SquaredError = &__pyx_type_15sgd_fast_sparse_SquaredError;
   __pyx_vtabptr_15sgd_fast_sparse_Huber = &__pyx_vtable_15sgd_fast_sparse_Huber;
   __pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base = *__pyx_vtabptr_15sgd_fast_sparse_Regression;
@@ -9735,9 +9735,9 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   *(void(**)(void))&__pyx_vtable_15sgd_fast_sparse_Huber.__pyx_base.__pyx_base.dloss = (void(*)(void))__pyx_f_15sgd_fast_sparse_5Huber_dloss;
   #endif
   __pyx_type_15sgd_fast_sparse_Huber.tp_base = __pyx_ptype_15sgd_fast_sparse_Regression;
-  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetVtable(__pyx_type_15sgd_fast_sparse_Huber.tp_dict, __pyx_vtabptr_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_15sgd_fast_sparse_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_15sgd_fast_sparse_Huber = &__pyx_type_15sgd_fast_sparse_Huber;
   /*--- Type import code ---*/
   __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
@@ -9748,7 +9748,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   /*--- Function import code ---*/
   /*--- Execution code ---*/
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":10
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":10
  * # License: BSD Style.
  * 
  * import numpy as np             # <<<<<<<<<<<<<<
@@ -9760,7 +9760,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":11
  * 
  * import numpy as np
  * import sys             # <<<<<<<<<<<<<<
@@ -9772,7 +9772,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":12
  * import numpy as np
  * import sys
  * from time import time             # <<<<<<<<<<<<<<
@@ -9793,7 +9793,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/pprett/workspace/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
+  /* "/Users/alex/work/src/scikit-learn/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx":1
  * # encoding: utf-8             # <<<<<<<<<<<<<<
  * # cython: cdivision=True
  * # cython: boundscheck=False
@@ -9830,7 +9830,7 @@ PyMODINIT_FUNC PyInit_sgd_fast_sparse(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
 
-  /* "/usr/local/lib/python2.6/dist-packages/Cython-0.12.1-py2.6-linux-x86_64.egg/Cython/Includes/stdlib.pxd":2
+  /* "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/site-packages/Cython/Includes/stdlib.pxd":2
  * 
  * cdef extern from "stdlib.h" nogil:             # <<<<<<<<<<<<<<
  *     void free(void *ptr)
diff --git a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
index aee69cded8d44..0a3450da2e91a 100644
--- a/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
+++ b/scikits/learn/sgd/sparse/src/sgd_fast_sparse.pyx
@@ -34,16 +34,17 @@ cdef class LossFunction:
     """Base class for convex loss functions"""
     cpdef double loss(self, double p, double y):
         """Evaluate the loss function.
-        
+
         :arg p: The prediction.
         :type p: double
         :arg y: The true value.
         :type y: double
         :returns: double"""
         raise NotImplementedError()
+
     cpdef double dloss(self, double p, double y):
         """Evaluate the derivative of the loss function.
-        
+
         :arg p: The prediction.
         :type p: double
         :arg y: The true value.
@@ -51,6 +52,7 @@ cdef class LossFunction:
         :returns: double"""
         raise NotImplementedError()
 
+
 cdef class Regression(LossFunction):
     """Base class for loss functions for regression."""
     cpdef double loss(self,double p, double y):
@@ -66,6 +68,7 @@ cdef class Classification(LossFunction):
     cpdef double dloss(self, double p, double y):
         raise NotImplementedError()
 
+
 cdef class ModifiedHuber(Classification):
     """Modified Huber loss function for binary
     classification tasks with y in {-1,1}.
@@ -77,43 +80,45 @@ cdef class ModifiedHuber(Classification):
     Stochastic Gradient Descent', ICML'04.
     """
     cpdef double loss(self, double p,double y):
-        cdef double z = p*y
-        if z >= 1:
-            return 0
-        elif z >= -1:
-            return (1-z) * (1-z) 
+        cdef double z = p * y
+        if z >= 1.0:
+            return 0.0
+        elif z >= -1.0:
+            return (1.0 - z) * (1.0 - z)
         else:
-            return -4*z
+            return -4.0 * z
 
     cpdef double dloss(self, double p, double y):
-        cdef double z = p*y
-        if z >= 1:
-            return 0
-        elif z >= -1:
-            return 2*(1-z)*y
+        cdef double z = p * y
+        if z >= 1.0:
+            return 0.0
+        elif z >= -1.0:
+            return 2.0 * (1.0 - z) * y
         else:
-            return 4*y
+            return 4.0 * y
 
     def __reduce__(self):
-        return ModifiedHuber,()
+        return ModifiedHuber, ()
+
 
 cdef class Hinge(Classification):
     """SVM classification loss for binary
     classification tasks with y in {-1,1}.
     """
-    cpdef  double loss(self, double p, double y):
-        cdef double z = p*y
+    cpdef double loss(self, double p, double y):
+        cdef double z = p * y
         if z < 1.0:
             return (1 - z)
-        return 0
-    cpdef  double dloss(self, double p, double y):
-        cdef double z = p*y
+        return 0.0
+
+    cpdef double dloss(self, double p, double y):
+        cdef double z = p * y
         if z < 1.0:
             return y
-        return 0
+        return 0.0
 
     def __reduce__(self):
-        return Hinge,()
+        return Hinge, ()
 
 
 cdef class Log(Classification):
@@ -121,55 +126,60 @@ cdef class Log(Classification):
     tasks with y in {-1,1}.
     """
     cpdef double loss(self, double p, double y):
-        cdef double z = p*y
+        cdef double z = p * y
         if z > 18:
             return exp(-z)
         if z < -18:
             return -z * y
-        return log(1.0+exp(-z)) 
+        return log(1.0+exp(-z))
 
-    cpdef  double dloss(self, double p, double y):
-        cdef double z = p*y
-        if z > 18:
+    cpdef double dloss(self, double p, double y):
+        cdef double z = p * y
+        if z > 18.0:
             return exp(-z) * y
-        if z < -18:
+        if z < -18.0:
             return y
         return y / (exp(z) + 1.0)
 
     def __reduce__(self):
-        return Log,()
+        return Log, ()
+
 
 cdef class SquaredError(Regression):
     """
     """
-    cpdef  double loss(self, double p, double y):
-        return 0.5 * (p-y) * (p-y)
-    cpdef  double dloss(self, double p, double y):
+    cpdef double loss(self, double p, double y):
+        return 0.5 * (p - y) * (p - y)
+
+    cpdef double dloss(self, double p, double y):
         return y - p
 
     def __reduce__(self):
-        return SquaredError,()
+        return SquaredError, ()
+
 
 cdef class Huber(Regression):
     """
     """
     cdef double c
+
     def __init__(self,c):
         self.c = c
-    cpdef  double loss(self, double p, double y):
-        cdef double r = p-y
+
+    cpdef double loss(self, double p, double y):
+        cdef double r = p - y
         cdef double abs_r = abs(r)
         if abs_r <= self.c:
             return 0.5 * r * r
         else:
-            return self.c * abs_r - (0.5*self.c*self.c)
+            return self.c * abs_r - (0.5 * self.c * self.c)
 
-    cpdef  double dloss(self, double p, double y):
-        cdef double r = y - p 
+    cpdef double dloss(self, double p, double y):
+        cdef double r = y - p
         cdef double abs_r = abs(r)
         if abs_r <= self.c:
             return r
-        elif r > 0:
+        elif r > 0.0:
             return self.c
         else:
             return -self.c
@@ -177,6 +187,7 @@ cdef class Huber(Regression):
     def __reduce__(self):
         return Huber,(self.c,)
 
+
 @cython.boundscheck(False)
 @cython.wraparound(False)
 @cython.cdivision(True)
@@ -193,12 +204,12 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
               int verbose, int shuffle):
     """Cython implementation of SGD with different loss functions and
     penalties.
-    
+
     """
     # get the data information into easy vars
     cdef unsigned int n_samples = Y.shape[0]
     cdef unsigned int n_features = w.shape[0]
-    
+
     cdef double *w_data_ptr = w.data
     cdef double *X_data_ptr = X_data.data
     cdef int *X_indptr_ptr = X_indptr.data
@@ -248,40 +259,40 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
                      offset, xnnz) * wscale) + intercept
             sumloss += loss.loss(p, y)
             update = eta * loss.dloss(p, y)
-            if update != 0:
+            if update != 0.0:
                 add(w_data_ptr, wscale, X_data_ptr, X_indices_ptr,
                     offset, xnnz, update)
                 if fit_intercept == 1:
                     intercept += update * 0.01
             if penalty_type != L1:
-                wscale *= (1 - (rho * eta * alpha))
+                wscale *= (1.0 - (rho * eta * alpha))
                 if wscale < 1e-9:
                     w *= wscale
                     wscale = 1.0
             if penalty_type == L1 or penalty_type == ELASTICNET:
-                u += ((1 - rho) * eta * alpha)
+                u += ((1.0 - rho) * eta * alpha)
                 l1penalty(w_data_ptr, wscale, q_data_ptr,
                           X_indices_ptr, offset, xnnz, u)
             t += 1
             count += 1
         if penalty_type == L1 or penalty_type == ELASTICNET:
-            u += ((1 - rho) * eta * alpha)
+            u += ((1.0 - rho) * eta * alpha)
             finall1penalty(w_data_ptr, wscale, n_features, q_data_ptr, u)
-	    
+
         # 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, 
+            "Bias: %.6f, T: %d, Avg. loss: %.6f" % (wnorm,
                                                     w.nonzero()[0].shape[0],
-                                                    intercept, count, 
+                                                    intercept, count,
                                                     sumloss / count))
             print("Total training time: %.2f seconds." % (time()-t_start))
 
         # 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.")     
+            raise ValueError("floating-point under-/overflow occured.")
 
     w *= wscale
     return w, intercept
@@ -290,9 +301,11 @@ def plain_sgd(np.ndarray[double, ndim=1] w,
 cdef inline double max(double a, double b):
     return a if a >= b else b
 
+
 cdef inline double min(double a, double b):
     return a if a <= b else b
 
+
 cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
                 int offset, int xnnz):
     cdef double sum = 0.0
@@ -301,9 +314,10 @@ cdef double dot(double *w_data_ptr, double *X_data_ptr, int *X_indices_ptr,
         sum += w_data_ptr[X_indices_ptr[offset + j]] * X_data_ptr[offset + j]
     return sum
 
+
 cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
                 int *X_indices_ptr, int offset, int xnnz, double c):
-    """Scales example x by constant c and adds it to the weight vector w. 
+    """Scales example x by constant c and adds it to the weight vector w.
     """
     cdef int j
     cdef int idx
@@ -315,13 +329,14 @@ cdef double add(double *w_data_ptr, double wscale, double *X_data_ptr,
         val = X_data_ptr[offset + j]
         innerprod += (w_data_ptr[idx] * val)
         xsqnorm += (val * val)
-        w_data_ptr[idx] += val * (c / wscale)    
+        w_data_ptr[idx] += val * (c / wscale)
     return (xsqnorm * c * c) + (2.0 * innerprod * wscale * c)
 
+
 cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
                     int *X_indices_ptr, int offset, int xnnz, double u):
-    """Applys the L1 penalty to each updated feature. 
-    This implements the truncated gradient approach by 
+    """Applys the L1 penalty to each updated feature.
+    This implements the truncated gradient approach by
     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
     """
     cdef double z = 0.0
@@ -330,33 +345,34 @@ cdef void l1penalty(double *w_data_ptr, double wscale, double *q_data_ptr,
     for j from 0 <= j < xnnz:
         idx = X_indices_ptr[offset + j]
         z = w_data_ptr[idx]
-        if (wscale * w_data_ptr[idx]) > 0:
-            w_data_ptr[idx] = max(0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
+        if (wscale * w_data_ptr[idx]) > 0.0:
+            w_data_ptr[idx] = max(0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx])
                                                         / wscale) )
-        elif (wscale * w_data_ptr[idx]) < 0:
-            w_data_ptr[idx] = min(0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
+        elif (wscale * w_data_ptr[idx]) < 0.0:
+            w_data_ptr[idx] = min(0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx])
                                                         / wscale) )
         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))
 
-cdef void finall1penalty(double *w_data_ptr, double wscale, 
-                         unsigned int n_features, 
+
+cdef void finall1penalty(double *w_data_ptr, double wscale,
+                         unsigned int n_features,
                          double *q_data_ptr, double u):
-    """Applys the L1 penalty to all feature. 
-    This implements the truncated gradient approach by 
+    """Applys the L1 penalty to all feature.
+    This implements the truncated gradient approach by
     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].
 
-    Experimental: this was proposed by Bob Carpenter (LingPipe). 
-    
+    Experimental: this was proposed by Bob Carpenter (LingPipe).
+
     """
     cdef double z = 0.0
     cdef int j = 0
     for j from 0 <= j < n_features:
         z = w_data_ptr[j]
-        if (wscale * w_data_ptr[j]) > 0:
-            w_data_ptr[j] = max(0, w_data_ptr[j] - ((u + q_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])
                                                     / wscale) )
-        elif (wscale * w_data_ptr[j]) < 0:
-            w_data_ptr[j] = min(0, w_data_ptr[j] + ((u - q_data_ptr[j])
+        elif (wscale * w_data_ptr[j]) < 0.0:
+            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))
-    
+
diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index 27a473f3bd9c7..8f1a9c7d3c7bf 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -1,10 +1,6 @@
 import numpy as np
-from scipy import sparse
-from scikits.learn import datasets, sgd, svm
-from numpy.testing import assert_array_almost_equal, \
-     assert_array_equal, assert_equal, assert_almost_equal
-
-from nose.tools import assert_raises
+from scikits.learn import sgd
+from numpy.testing import assert_array_equal
 
 # test sample 1
 X = np.array([[-2, -1], [-1, -1], [-1, -2], [1, 1], [1, 2], [2, 1]])
@@ -20,36 +16,37 @@
 true_result2 = [1, 2, 3]
 
 # test sample 3
-X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0], 
+X3 = np.array([[1,1,0,0,0,0], [1,1,0,0,0,0],
                [0,0,1,0,0,0], [0,0,1,0,0,0],
-	       [0,0,0,0,1,1], [0,0,0,0,1,1], 
+               [0,0,0,0,1,1], [0,0,0,0,1,1],
                [0,0,0,1,0,0], [0,0,0,1,0,0]])
 Y3 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 X4 = np.array([[1,0.9,0.8,0,0,0], [1,.84,.98,0,0,0],
-	       [1,.96,.88,0,0,0], [1,.91,.99,0,0,0],
-	       [0,0,0,.89,.91,1], [0,0,0,.79,.84,1],
-	       [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
+           [1,.96,.88,0,0,0], [1,.91,.99,0,0,0],
+           [0,0,0,.89,.91,1], [0,0,0,.79,.84,1],
+           [0,0,0,.91,.95,1], [0,0,0,.93,1,1]])
 Y4 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
-X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0], 
+X5 = np.array([[1,1,1,0,0,0], [1,1,1,0,0,0],
                [1,1,1,0,0,0], [1,1,1,0,0,0],
-	       [0,0,0,1,1,1], [0,0,0,1,1,1], 
+               [0,0,0,1,1,1], [0,0,0,1,1,1],
                [0,0,0,1,1,1], [0,0,0,1,1,1]])
 Y5 = np.array([1, 1, 1, 1, 2, 2, 2, 2])
 
 
 def test_sgd():
     """Check that sparse SGD gives any results :-)"""
-    
+
     clf = sgd.sparse.SGD(penalty='l2', alpha=0.01,
-			 fit_intercept=True,
-			 n_iter=10, shuffle=True)
+             fit_intercept=True,
+             n_iter=10, shuffle=True)
     clf.fit(X, Y)
     print clf.coef_
     #assert_almost_equal(clf.coef_[0], clf.coef_[1], decimal=7)
     assert_array_equal(clf.predict(T), true_result)
-    
+
+
 def test_sgd_penalties():
     """Check whether penalties and hyperparameters are set properly"""
     clf = sgd.sparse.SGD(penalty='l2')
@@ -59,34 +56,37 @@ def test_sgd_penalties():
     clf = sgd.sparse.SGD(penalty='elasticnet', rho=0.85)
     assert clf.rho == 0.85
 
+
 def test_sgd_params():
     """Test parameter validity check.
     """
     try:
-	clf = sgd.sparse.SGD(n_iter=0)
-	clf = sgd.sparse.SGD(n_iter=-10000)
+        clf = sgd.sparse.SGD(n_iter=0)
+        clf = sgd.sparse.SGD(n_iter=-10000)
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
 
     try:
-	clf = sgd.sparse.SGD(shuffle="false")
+        clf = sgd.sparse.SGD(shuffle="false")
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
+
 
 def test_sgd_multiclass():
-    """SGD is not able to handle multi class problems. 
+    """SGD is not able to handle multi class problems.
     """
     clf = sgd.sparse.SGD()
     try:
-	clf.fit(X2, Y2)
+        clf.fit(X2, Y2)
     except ValueError:
-	pass
+        pass
     else:
-	assert False
+        assert False
+
 
 def test_sgd_l1():
     n = len(X4)
@@ -95,9 +95,8 @@ def test_sgd_l1():
     np.random.shuffle(idx)
     X = X4[idx, :]
     Y = Y4[idx, :]
-    clf = sgd.sparse.SGD(penalty='l1', alpha=.2,
-			 fit_intercept=False,
-			 n_iter=1000)
+    clf = sgd.sparse.SGD(penalty='l1', alpha=.2, fit_intercept=False,
+                         n_iter=1000)
     clf.fit(X, Y)
     print clf.coef_
     assert_array_equal(clf.coef_[1:-1], np.zeros((4,)))

From ca77c797f9783871b59744f6d58aa63465d4fe55 Mon Sep 17 00:00:00 2001
From: Peter Prettenhofer 
Date: Sun, 24 Oct 2010 21:21:43 +0200
Subject: [PATCH 15/17] 100% code coverage.

---
 scikits/learn/sgd/tests/test_sparse.py | 39 ++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/scikits/learn/sgd/tests/test_sparse.py b/scikits/learn/sgd/tests/test_sparse.py
index e5b5a22ab748f..8c8d9ccdfa3b0 100644
--- a/scikits/learn/sgd/tests/test_sparse.py
+++ b/scikits/learn/sgd/tests/test_sparse.py
@@ -54,7 +54,30 @@ def test_sgd_penalties():
     assert clf.rho == 0.0
     clf = sgd.sparse.SGD(penalty='elasticnet', rho=0.85)
     assert clf.rho == 0.85
+    try:
+        clf = sgd.sparse.SGD(penalty='foobar', rho=0.85)
+    except ValueError:
+        pass
+    else:
+        assert False
 
+def test_sgd_losses():
+    """Check whether losses and hyperparameters are set properly"""
+    clf = sgd.sparse.SGD(loss='hinge')
+    assert isinstance(clf.loss_function,
+                      sgd.sparse.sgd.sgd_fast_sparse.Hinge)
+    clf = sgd.sparse.SGD(loss='log')
+    assert isinstance(clf.loss_function,
+                      sgd.sparse.sgd.sgd_fast_sparse.Log)
+    clf = sgd.sparse.SGD(loss='modifiedhuber')
+    assert isinstance(clf.loss_function,
+                      sgd.sparse.sgd.sgd_fast_sparse.ModifiedHuber)
+    try:
+        clf = sgd.sparse.SGD(loss="foobar")
+    except ValueError:
+        pass
+    else:
+        assert False
 
 def test_sgd_params():
     """Test parameter validity check"""
@@ -73,6 +96,10 @@ def test_sgd_params():
     else:
         assert False
 
+def test_set_coef():
+    clf = sgd.sparse.SGD()
+    clf._set_coef(None)
+    assert clf.sparse_coef_ == None
 
 def test_sgd_multiclass():
     """SGD is not able to handle multi class problems"""
@@ -84,6 +111,18 @@ def test_sgd_multiclass():
     else:
         assert False
 
+def test_sgd_proba():
+    """Test that SGD raises NotImplementedError when clf.proba is called."""
+    clf = sgd.sparse.SGD(penalty='l2', alpha=0.01,
+                         fit_intercept=True,
+                         n_iter=10, shuffle=True)
+    clf.fit(X, Y)
+    try:
+        p = clf.predict_proba([3, 2])
+    except NotImplementedError:
+        pass
+    else:
+        assert False
 
 def test_sgd_l1():
     n = len(X4)

From 0a6f6d141fbdb90df7c8ac545f5b81c56b1aa785 Mon Sep 17 00:00:00 2001
From: Peter Prettenhofer 
Date: Sun, 24 Oct 2010 21:30:12 +0200
Subject: [PATCH 16/17] added doctests to SGD and sgd.LinearModel

---
 scikits/learn/sgd/base.py       | 18 ++++++++++++++++++
 scikits/learn/sgd/sparse/sgd.py | 18 ++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index cf275ac951631..83bfe1c112c1b 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -46,6 +46,24 @@ class LinearModel(BaseEstimator):
     `intercept_` : float
         Constants in decision function.
 
+    Examples
+    --------
+    >>> import numpy as np
+    >>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
+    >>> Y = np.array([1, 1, 2, 2])
+    >>> from scikits.learn.sgd.sparse import SGD
+    >>> clf = SGD()
+    >>> clf.fit(X, Y)
+    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5,
+    penalty='l2', coef_=array([-9.80373, -9.80373]), rho=1.0,
+    alpha=0.0001, intercept_=0.1)
+    >>> print clf.predict([[-0.8, -1]])
+    [ 1.]
+
+    See also
+    --------
+    LinearSVC
+
     """
 
     def __init__(self, loss="hinge", penalty='l2', alpha=0.0001,
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index a1beb89889b25..13ae54cd708ce 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -48,6 +48,24 @@ class SGD(LinearModel, ClassifierMixin):
     `intercept_` : float
         Constants in decision function.
 
+    Examples
+    --------
+    >>> import numpy as np
+    >>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
+    >>> Y = np.array([1, 1, 2, 2])
+    >>> from scikits.learn.sgd.sparse import SGD
+    >>> clf = SGD()
+    >>> clf.fit(X, Y)
+    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5,
+    penalty='l2', coef_=array([-9.80373, -9.80373]), rho=1.0,
+    alpha=0.0001, intercept_=0.1)
+    >>> print clf.predict([[-0.8, -1]])
+    [ 1.]
+
+    See also
+    --------
+    LinearSVC
+
     """
 
     def _get_loss_function(self):

From 644ef2dcca20b2b0a1d530f559137c423a98065c Mon Sep 17 00:00:00 2001
From: Olivier Grisel 
Date: Sun, 24 Oct 2010 23:28:24 +0200
Subject: [PATCH 17/17] fix broken doctests: they are space sensitive
 unfortunately

---
 scikits/learn/sgd/base.py       | 5 ++---
 scikits/learn/sgd/sparse/sgd.py | 5 ++---
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/scikits/learn/sgd/base.py b/scikits/learn/sgd/base.py
index 83bfe1c112c1b..f791d378d3801 100644
--- a/scikits/learn/sgd/base.py
+++ b/scikits/learn/sgd/base.py
@@ -54,9 +54,8 @@ class LinearModel(BaseEstimator):
     >>> from scikits.learn.sgd.sparse import SGD
     >>> clf = SGD()
     >>> clf.fit(X, Y)
-    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5,
-    penalty='l2', coef_=array([-9.80373, -9.80373]), rho=1.0,
-    alpha=0.0001, intercept_=0.1)
+    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5, penalty='l2',
+      coef_=array([-9.80373, -9.80373]), rho=1.0, alpha=0.0001, intercept_=0.1)
     >>> print clf.predict([[-0.8, -1]])
     [ 1.]
 
diff --git a/scikits/learn/sgd/sparse/sgd.py b/scikits/learn/sgd/sparse/sgd.py
index 13ae54cd708ce..6d1d6ef689a7d 100644
--- a/scikits/learn/sgd/sparse/sgd.py
+++ b/scikits/learn/sgd/sparse/sgd.py
@@ -56,9 +56,8 @@ class SGD(LinearModel, ClassifierMixin):
     >>> from scikits.learn.sgd.sparse import SGD
     >>> clf = SGD()
     >>> clf.fit(X, Y)
-    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5,
-    penalty='l2', coef_=array([-9.80373, -9.80373]), rho=1.0,
-    alpha=0.0001, intercept_=0.1)
+    SGD(loss='hinge', shuffle=False, fit_intercept=True, n_iter=5, penalty='l2',
+      coef_=array([-9.80373, -9.80373]), rho=1.0, alpha=0.0001, intercept_=0.1)
     >>> print clf.predict([[-0.8, -1]])
     [ 1.]