From ac36a19ce129769d07b947e07e6aef5f00ec937e Mon Sep 17 00:00:00 2001
From: Denis Arrivault <denis.arrivault@lif.univ-mrs.fr>
Date: Fri, 23 Mar 2018 11:00:11 +0100
Subject: [PATCH] Optimizations on SVD

---
 examples/3.pautomac_light.train.gv     |  41 ---
 examples/3.pautomac_light.train.gv.pdf | Bin 14552 -> 0 bytes
 examples/3.pautomac_light.train.json   |   1 -
 examples/3.pautomac_light.train.yaml   |  67 -----
 examples/PythonOptimizations.ipynb     | 394 -------------------------
 examples/performances_calculation.py   |  48 ---
 examples/simple_automata.json          |   1 -
 examples/simple_automata.json.gv       |  15 -
 examples/simple_automata.json.gv.pdf   | Bin 11290 -> 0 bytes
 examples/simple_automata.yaml          |  23 --
 examples/simple_automata.yaml.gv       |  15 -
 examples/simple_automata.yaml.gv.pdf   | Bin 11290 -> 0 bytes
 examples/svd_tests.py                  | 101 -------
 splearn/hankel.py                      |  52 ++--
 splearn/spectral.py                    | 157 +---------
 15 files changed, 41 insertions(+), 874 deletions(-)
 delete mode 100644 examples/3.pautomac_light.train.gv
 delete mode 100644 examples/3.pautomac_light.train.gv.pdf
 delete mode 100644 examples/3.pautomac_light.train.json
 delete mode 100644 examples/3.pautomac_light.train.yaml
 delete mode 100644 examples/PythonOptimizations.ipynb
 delete mode 100644 examples/performances_calculation.py
 delete mode 100644 examples/simple_automata.json
 delete mode 100644 examples/simple_automata.json.gv
 delete mode 100644 examples/simple_automata.json.gv.pdf
 delete mode 100644 examples/simple_automata.yaml
 delete mode 100644 examples/simple_automata.yaml.gv
 delete mode 100644 examples/simple_automata.yaml.gv.pdf
 delete mode 100644 examples/svd_tests.py

diff --git a/examples/3.pautomac_light.train.gv b/examples/3.pautomac_light.train.gv
deleted file mode 100644
index 630afa0..0000000
--- a/examples/3.pautomac_light.train.gv
+++ /dev/null
@@ -1,41 +0,0 @@
-//3.pautomac_light.train.dot
-digraph {
-	0 [label="0
-______"]
-	1 [label="1
-______"]
-	2 [label="2
-______
--0.45 >"]
-	3 [label="3
-______
-0.63 >"]
-	4 [label="4
-______
--0.55 >"]
-	0 -> 1 [label="0:-0.24"]
-	0 -> 2 [label="0:0.35"]
-	0 -> 3 [label="0:-0.28"]
-	0 -> 4 [label="0:-0.21"]
-	1 -> 1 [label="0:-0.30"]
-	1 -> 2 [label="0:0.21"]
-	1 -> 4 [label="0:-0.56"]
-	2 -> 3 [label="0:-0.21"]
-	4 -> 4 [label="0:0.24"]
-	0 -> 2 [label="1:-0.30"]
-	0 -> 3 [label="1:0.28"]
-	0 -> 4 [label="1:0.20"]
-	1 -> 2 [label="1:0.26"]
-	0 -> 2 [label="2:0.38"]
-	0 -> 3 [label="2:-0.22"]
-	0 -> 4 [label="2:-0.23"]
-	1 -> 4 [label="2:0.35"]
-	1 -> 2 [label="3:0.28"]
-	1 -> 3 [label="3:-0.24"]
-	2 -> 2 [label="3:-0.63"]
-	2 -> 3 [label="3:0.47"]
-	3 -> 2 [label="3:-0.37"]
-	3 -> 4 [label="3:0.65"]
-	4 -> 3 [label="3:-0.38"]
-	4 -> 4 [label="3:0.66"]
-}
diff --git a/examples/3.pautomac_light.train.gv.pdf b/examples/3.pautomac_light.train.gv.pdf
deleted file mode 100644
index 13325f666807d2f6f0e6e5f37700589d688fa25b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 14552
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
UCE(CCG%>U=<x*93^>^a}0E#q`5C8xG

diff --git a/examples/3.pautomac_light.train.json b/examples/3.pautomac_light.train.json
deleted file mode 100644
index 9f45619..0000000
--- a/examples/3.pautomac_light.train.json
+++ /dev/null
@@ -1 +0,0 @@
-{"automaton": {"nbL": 4, "nbS": 5, "initial": {"numpy.ndarray": {"values": [-0.0004934419970497512, 0.0030634697107912346, -0.044073932015580415, -0.1077770261654714, -0.0866391379316952], "dtype": "float64"}}, "final": {"numpy.ndarray": {"values": [0.07757136847945045, -0.024220294003132026, -0.4468125366321221, 0.627732084089759, -0.554674433356224], "dtype": "float64"}}, "transitions": [{"numpy.ndarray": {"values": [[0.04512120959511772, -0.24038969827844062, 0.34944999592135334, -0.2811680730534579, -0.21402523377497645], [0.0692580056243761, -0.30062293462829204, 0.20641375368520157, -0.14960814319756124, -0.5580573163749153], [0.02980115192176571, -0.13866480809160409, 0.18362212572805459, -0.20969545230657607, -0.14481622025561292], [0.005699344003198349, -0.023385825120201414, -0.06600665373981851, 0.10749935271466007, -0.15103654604159977], [-0.02008655193147911, 0.09026347555230492, -0.005525585655539262, -0.031355317090308935, 0.2432902242047721]], "dtype": "float64"}}, {"numpy.ndarray": {"values": [[0.0774477207917058, 0.09007073705762021, -0.3047220063293013, 0.2767624549859105, 0.20289396030628148], [-0.09902980483670844, -0.08061846818727973, 0.25853170692250554, -0.12086330214608881, -0.11085207725068251], [-0.061710792028537534, -0.06244151779954751, 0.12007654564862075, 0.0025063746277943564, -0.1567967473145572], [-0.002736973749965403, -0.009005721984277787, -0.00046003295909181354, -0.008550426472005344, -0.053754646789681754], [0.030987327588710728, 0.03972680066723246, -0.04997113350910248, 0.0035769411874962344, 0.1418257620585633]], "dtype": "float64"}}, {"numpy.ndarray": {"values": [[-0.06791915236220235, -0.11357937659088102, 0.37955392604054394, -0.21784979894046635, -0.22977695089938127], [0.11596642335411328, 0.14914956804629287, -0.13357508376686902, -0.008916063072034974, 0.3484153673774836], [0.011730817547426673, 0.019273800531955612, 0.0414265834586712, -0.035346588560982, 0.02316491010895583], [0.007328911075541707, 0.005536509132796312, -0.022456082950666856, 0.03611543477693187, -0.038514339001406585], [-0.010589894686551544, -0.010626616553723532, -0.000543105645661794, -0.025567476700160314, 0.04984888818929034]], "dtype": "float64"}}, {"numpy.ndarray": {"values": [[0.07276211427780357, -0.0157195576855797, 0.07428592814590385, -0.10369861539249735, 0.024753473688328077], [-0.05607105449779142, -0.08896207276035666, 0.27638225397521243, -0.2371125582838589, 0.07372294122306285], [-0.007391294007753122, -0.048741797963875705, -0.6291239733858526, 0.46816276521577677, 0.09251699239093385], [-0.007110224931878467, -0.05623317735898056, -0.36606658567620365, -0.013297798115225407, 0.6491033177492604], [0.002335515008556511, -0.021561151264484414, 0.09096243479437888, -0.38438823493062646, 0.6616477207948602]], "dtype": "float64"}}], "type": "classic"}}
\ No newline at end of file
diff --git a/examples/3.pautomac_light.train.yaml b/examples/3.pautomac_light.train.yaml
deleted file mode 100644
index 09108d5..0000000
--- a/examples/3.pautomac_light.train.yaml
+++ /dev/null
@@ -1,67 +0,0 @@
-automaton:
-  final:
-    numpy.ndarray:
-      dtype: float64
-      values: [0.07757136847945045, -0.024220294003132026, -0.4468125366321221, 0.627732084089759,
-        -0.554674433356224]
-  initial:
-    numpy.ndarray:
-      dtype: float64
-      values: [-0.0004934419970497512, 0.0030634697107912346, -0.044073932015580415,
-        -0.1077770261654714, -0.0866391379316952]
-  nbL: 4
-  nbS: 5
-  transitions:
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [0.04512120959511772, -0.24038969827844062, 0.34944999592135334, -0.2811680730534579,
-        -0.21402523377497645]
-      - [0.0692580056243761, -0.30062293462829204, 0.20641375368520157, -0.14960814319756124,
-        -0.5580573163749153]
-      - [0.02980115192176571, -0.13866480809160409, 0.18362212572805459, -0.20969545230657607,
-        -0.14481622025561292]
-      - [0.005699344003198349, -0.023385825120201414, -0.06600665373981851, 0.10749935271466007,
-        -0.15103654604159977]
-      - [-0.02008655193147911, 0.09026347555230492, -0.005525585655539262, -0.031355317090308935,
-        0.2432902242047721]
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [0.0774477207917058, 0.09007073705762021, -0.3047220063293013, 0.2767624549859105,
-        0.20289396030628148]
-      - [-0.09902980483670844, -0.08061846818727973, 0.25853170692250554, -0.12086330214608881,
-        -0.11085207725068251]
-      - [-0.061710792028537534, -0.06244151779954751, 0.12007654564862075, 0.0025063746277943564,
-        -0.1567967473145572]
-      - [-0.002736973749965403, -0.009005721984277787, -0.00046003295909181354, -0.008550426472005344,
-        -0.053754646789681754]
-      - [0.030987327588710728, 0.03972680066723246, -0.04997113350910248, 0.0035769411874962344,
-        0.1418257620585633]
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [-0.06791915236220235, -0.11357937659088102, 0.37955392604054394, -0.21784979894046635,
-        -0.22977695089938127]
-      - [0.11596642335411328, 0.14914956804629287, -0.13357508376686902, -0.008916063072034974,
-        0.3484153673774836]
-      - [0.011730817547426673, 0.019273800531955612, 0.0414265834586712, -0.035346588560982,
-        0.02316491010895583]
-      - [0.007328911075541707, 0.005536509132796312, -0.022456082950666856, 0.03611543477693187,
-        -0.038514339001406585]
-      - [-0.010589894686551544, -0.010626616553723532, -0.000543105645661794, -0.025567476700160314,
-        0.04984888818929034]
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [0.07276211427780357, -0.0157195576855797, 0.07428592814590385, -0.10369861539249735,
-        0.024753473688328077]
-      - [-0.05607105449779142, -0.08896207276035666, 0.27638225397521243, -0.2371125582838589,
-        0.07372294122306285]
-      - [-0.007391294007753122, -0.048741797963875705, -0.6291239733858526, 0.46816276521577677,
-        0.09251699239093385]
-      - [-0.007110224931878467, -0.05623317735898056, -0.36606658567620365, -0.013297798115225407,
-        0.6491033177492604]
-      - [0.002335515008556511, -0.021561151264484414, 0.09096243479437888, -0.38438823493062646,
-        0.6616477207948602]
-  type: classic
diff --git a/examples/PythonOptimizations.ipynb b/examples/PythonOptimizations.ipynb
deleted file mode 100644
index 386c4d3..0000000
--- a/examples/PythonOptimizations.ipynb
+++ /dev/null
@@ -1,394 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from timeit import default_timer as timer\n",
-    "import random\n",
-    "import numpy as np"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "*** With setdefault ***\n",
-      "Mean time = 2.9573e-07 +/- 5.1021e-07 sigma\n",
-      "{33: 969, 23: 1030, 10: 1002, 54: 990, 37: 1055, 28: 983, 34: 964, 25: 1023, 55: 1016, 46: 958, 17: 979, 0: 1003, 98: 1025, 19: 977, 66: 1002, 73: 979, 42: 1038, 52: 986, 80: 1007, 45: 1044, 62: 942, 40: 1001, 77: 996, 26: 995, 11: 971, 97: 985, 59: 1024, 63: 939, 43: 1036, 88: 977, 47: 967, 44: 964, 93: 967, 51: 962, 69: 1003, 12: 988, 81: 1008, 82: 962, 61: 1003, 30: 985, 3: 1017, 79: 975, 29: 979, 35: 989, 31: 1019, 72: 1017, 78: 977, 100: 977, 7: 947, 91: 973, 90: 966, 38: 960, 20: 927, 8: 983, 75: 999, 92: 1020, 99: 1030, 64: 976, 57: 1030, 86: 1041, 16: 941, 39: 1017, 94: 996, 18: 940, 13: 1024, 27: 990, 53: 1042, 68: 952, 2: 1031, 85: 984, 21: 1009, 36: 1009, 71: 990, 84: 1022, 49: 1010, 60: 990, 70: 967, 9: 949, 67: 989, 87: 980, 74: 970, 32: 983, 89: 999, 96: 998, 50: 991, 56: 1010, 76: 1001, 95: 964, 24: 1004, 14: 950, 83: 1053, 5: 988, 22: 1043, 65: 980, 6: 967, 15: 966, 41: 922, 1: 960, 48: 958, 58: 955, 4: 999}\n",
-      "*** With if syntax ***\n",
-      "Mean time = 2.9544e-07 +/- 5.2105e-07 sigma\n",
-      "{33: 969, 23: 1030, 10: 1002, 54: 990, 37: 1055, 28: 983, 34: 964, 25: 1023, 55: 1016, 46: 958, 17: 979, 0: 1003, 98: 1025, 19: 977, 66: 1002, 73: 979, 42: 1038, 52: 986, 80: 1007, 45: 1044, 62: 942, 40: 1001, 77: 996, 26: 995, 11: 971, 97: 985, 59: 1024, 63: 939, 43: 1036, 88: 977, 47: 967, 44: 964, 93: 967, 51: 962, 69: 1003, 12: 988, 81: 1008, 82: 962, 61: 1003, 30: 985, 3: 1017, 79: 975, 29: 979, 35: 989, 31: 1019, 72: 1017, 78: 977, 100: 977, 7: 947, 91: 973, 90: 966, 38: 960, 20: 927, 8: 983, 75: 999, 92: 1020, 99: 1030, 64: 976, 57: 1030, 86: 1041, 16: 941, 39: 1017, 94: 996, 18: 940, 13: 1024, 27: 990, 53: 1042, 68: 952, 2: 1031, 85: 984, 21: 1009, 36: 1009, 71: 990, 84: 1022, 49: 1010, 60: 990, 70: 967, 9: 949, 67: 989, 87: 980, 74: 970, 32: 983, 89: 999, 96: 998, 50: 991, 56: 1010, 76: 1001, 95: 964, 24: 1004, 14: 950, 83: 1053, 5: 988, 22: 1043, 65: 980, 6: 967, 15: 966, 41: 922, 1: 960, 48: 958, 58: 955, 4: 999}\n"
-     ]
-    }
-   ],
-   "source": [
-    "N = 100000\n",
-    "d1 = {}\n",
-    "d2 = {}\n",
-    "duration1 = np.zeros((N,), dtype=np.float32)\n",
-    "duration2 = np.zeros((N,), dtype=np.float32)\n",
-    "str = \"Mean time = {0:.4e} +/- {1:.4e} sigma\"\n",
-    "for i in range(N):\n",
-    "    k = random.randint(0,100)\n",
-    "    start = timer()\n",
-    "    d1[k] = d1.setdefault(k, 0) + 1\n",
-    "    duration1[i] = timer() - start\n",
-    "    start = timer()\n",
-    "    d2[k] = d2[k] + 1 if k in d2 else 1\n",
-    "    duration2[i] = timer() - start\n",
-    "\n",
-    "print(\"*** With setdefault ***\")\n",
-    "print(str.format(np.mean(duration1), np.std(duration1)))\n",
-    "print(d1)\n",
-    "print(\"*** With if syntax ***\")\n",
-    "print(str.format(np.mean(duration2), np.std(duration2)))\n",
-    "print(d2)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "\n",
-      "__global__ void multiply_them(float *dest, float *a, float *b)\n",
-      "{\n",
-      " const int i = threadIdx.x;\n",
-      " dest[i] = a[i] * b[i];\n",
-      "}\n",
-      "\n",
-      "[-2.90137202e-01  2.81293893e+00 -1.65957522e+00 -8.62088725e-02\n",
-      "  1.45804667e+00  7.99023032e-01  8.37303638e-01  2.03320041e-01\n",
-      " -1.78530657e+00 -9.88828689e-02  2.83610914e-02 -3.73530895e-01\n",
-      "  1.13282132e+00  3.41161788e-01  7.03967333e-01  2.51203799e+00\n",
-      " -1.10995814e-01 -2.47637033e-01  4.86121893e-01 -5.22908807e-01\n",
-      "  2.42040649e-01  3.50897670e-01 -2.33534321e-01 -5.71392417e-01\n",
-      "  2.94612437e-01  8.51076543e-01 -1.22819483e-01 -1.12457033e-02\n",
-      "  7.62222052e-01 -5.62664986e-01 -2.81204749e-02  2.15141201e+00\n",
-      " -2.52846658e-01 -4.59794961e-02 -2.25618288e-01 -2.16486081e-02\n",
-      "  1.80242336e+00  1.98668197e-01  1.38681874e-01 -8.27464104e-01\n",
-      "  2.84924650e+00  4.41990757e+00  7.45217443e-01  2.79382646e-01\n",
-      " -3.47226970e-02 -3.42106796e-03 -2.03399825e+00  1.97560683e-01\n",
-      "  1.39831769e+00 -8.06550503e-01 -1.33297205e+00  1.37708103e-02\n",
-      " -4.00247842e-01  1.86116919e-02  2.44872691e-03  3.97552028e-02\n",
-      " -3.61032963e+00 -5.08877039e-01  3.09200644e-01 -2.52947181e-01\n",
-      " -1.45006254e-01 -2.06694026e-02 -6.71102941e-01 -2.49164805e-01\n",
-      " -2.45076999e-01 -8.83047581e-02 -2.77056009e-01 -3.63603652e-01\n",
-      "  9.13712531e-02  1.50326788e-01 -1.89215928e-01  6.49247885e-01\n",
-      " -1.04680789e+00  4.51940441e+00 -4.10190582e-01 -1.03717482e+00\n",
-      " -2.83955693e-01  2.13240623e-01 -4.06043559e-01  1.64782095e+00\n",
-      "  3.88930738e-02  1.79433972e-01 -1.63999215e-01  8.21388125e-01\n",
-      "  3.96741897e-01 -1.78203881e+00 -7.89099187e-02 -2.08030403e-01\n",
-      " -1.67499959e+00 -6.03813231e-02  9.04122651e-01  2.57910769e-02\n",
-      " -2.13610873e-01  1.05494165e+00  1.07709356e-02 -4.04108614e-02\n",
-      " -1.21986246e+00  3.52327973e-01  9.47596207e-02 -8.17048013e-01\n",
-      "  4.55845296e-01  1.14165060e-01 -8.36074054e-01 -2.73001790e+00\n",
-      " -2.25733072e-02  1.01752472e+00  1.58793926e-01 -3.07355216e-03\n",
-      "  3.39909703e-01  3.54566932e-01  4.76458110e-03 -2.74281472e-01\n",
-      " -4.90250558e-01 -5.93070447e-01  4.16583568e-01  1.40949559e+00\n",
-      " -6.85005546e-01  5.71568191e-01  2.63672054e-01 -2.65214413e-01\n",
-      " -1.82554388e+00 -2.56274521e-01 -2.20750004e-01  2.96699733e-01\n",
-      " -6.49191618e-01 -4.23787624e-01  1.40397280e-01  5.71154011e-03\n",
-      " -1.53047368e-01 -1.18402898e+00  8.88164192e-02 -7.80049741e-01\n",
-      "  1.22469738e-01  5.82156956e-01 -2.78263122e-01  5.70335388e+00\n",
-      "  2.33998346e+00  9.56273079e-01  1.51689303e+00 -4.10727739e-01\n",
-      "  4.94410247e-01 -3.66233498e-01  7.14528918e-01  2.38090664e-01\n",
-      " -6.46302760e-01 -3.08008194e-01 -3.49969387e-01  1.53435739e-02\n",
-      "  5.77413812e-02  3.72533381e-01  1.98260975e+00 -7.76899280e-03\n",
-      " -1.54382363e-01 -1.86449081e-01 -9.56342891e-02  1.03035802e-02\n",
-      "  1.14140980e-01  1.41981363e+00 -7.38705873e-01 -2.08745885e+00\n",
-      " -6.28826141e-01  1.02032393e-01 -7.70327747e-01  5.62456894e+00\n",
-      " -2.95871317e-01  1.26501453e+00  4.17780161e-01  8.68652642e-01\n",
-      " -4.87591237e-01  6.19750731e-02 -1.26040816e+00 -3.43194783e-01\n",
-      "  1.27273810e+00 -3.55367869e-01  2.32648347e-02  2.89628506e-01\n",
-      " -1.51091516e-01  2.83231330e-03 -1.51034407e-02  1.76298320e+00\n",
-      " -3.59570235e-01  2.01595259e+00 -7.87402838e-02  4.81955826e-01\n",
-      " -1.40068781e+00  2.83799553e-03  6.27174973e-01  3.14519048e-01\n",
-      " -1.10712957e+00 -3.53843659e-01 -6.35562837e-01  4.04969931e-01\n",
-      " -1.65314469e-02  4.08839643e-01  8.27084303e-01  3.12124312e-01\n",
-      " -4.19728532e-02 -4.32954282e-01  5.92173636e-01 -1.95017815e+00\n",
-      "  3.28963660e-02  6.78022718e-03 -1.16085088e+00  5.09182066e-02\n",
-      " -6.12896085e-01 -8.15577134e-02  1.12161350e+00 -3.40709865e-01\n",
-      "  2.52548099e-01 -4.65507209e-01  5.91823518e-01 -7.46792078e-01\n",
-      "  1.19965337e-01  6.05180681e-01 -5.09674013e-01  2.71683186e-01\n",
-      "  2.30722860e-01 -1.65039837e-01 -8.05439278e-02  1.71006903e-01\n",
-      " -2.81729937e-01  1.10326950e-02  3.20048153e-01  9.83216614e-03\n",
-      "  1.53846651e-01  1.16461468e+00 -4.88103539e-01 -2.46520080e-02\n",
-      " -7.18142092e-02 -1.67339086e-03 -2.42161244e-01  2.67475009e-01\n",
-      " -1.32814407e+00 -5.36984839e-02  1.15024351e-01 -1.35336888e+00\n",
-      " -4.01394248e-01  2.28310853e-01  2.85696723e-02 -9.75638449e-01\n",
-      "  1.79381263e+00  1.34870076e+00 -9.75736082e-01 -2.56683826e-01\n",
-      " -9.24404740e-01  1.18486941e+00 -1.60593867e-01  5.32781780e-01\n",
-      " -1.61111280e-01 -5.70979357e-01  2.48478189e-01 -5.70544958e-01\n",
-      " -3.36045325e-02 -1.70751661e-01 -7.83387959e-01 -3.28783333e-01\n",
-      "  6.68492764e-02 -4.55635548e-01  6.78718448e-01  1.61884940e+00\n",
-      "  1.40411711e+00  1.68428612e+00 -1.77249038e+00 -9.48907316e-01\n",
-      "  1.18341064e+00 -5.30112609e-02 -1.22148085e+00  5.62596917e-01\n",
-      "  1.31391573e+00  1.84780562e+00  5.45549512e-01  1.03463089e+00\n",
-      " -7.32520103e-01  3.38242576e-02 -6.29517257e-01  6.84408307e-01\n",
-      " -2.80194193e-01  4.18214053e-01 -2.41577148e+00 -2.93253827e+00\n",
-      "  9.50718462e-01  2.36972594e+00  4.81406689e-01  1.71889886e-02\n",
-      "  6.07256055e-01 -2.35717386e-01 -2.49700022e+00  6.08527958e-01\n",
-      " -7.02820182e-01 -1.22066826e-01  6.92340672e-01  9.00277853e-01\n",
-      " -1.30328491e-01 -4.41209674e-02 -9.21233058e-01  1.37919143e-01\n",
-      "  3.67532313e-01  3.77332382e-02  2.87247807e-01  2.75621843e+00\n",
-      "  7.48364270e-01 -3.02746415e-01  1.44414037e-01  5.80033548e-02\n",
-      "  1.95701897e-01 -1.33819908e-01  1.95749756e-02  9.36418235e-01\n",
-      "  1.13439392e-02 -3.80111992e-01 -9.90576968e-02 -5.11335442e-03\n",
-      " -7.68416934e-03 -2.29034567e+00 -2.59990782e-01 -1.78645715e-01\n",
-      "  1.65659058e+00 -2.18677855e+00  1.03389049e+00  1.44531997e-02\n",
-      " -3.51684600e-01  4.83583333e-03  1.80972859e-01  2.64298506e-02\n",
-      " -2.43892953e-01 -2.05088049e-01 -3.25786471e-01  6.42316818e-01\n",
-      "  1.44556820e-01  9.11835134e-02  1.94504070e+00 -5.24064781e-05\n",
-      " -2.08403915e-01 -1.54737011e-01 -1.55257428e+00  7.24277273e-02\n",
-      " -8.63651395e-01  1.59108377e+00  5.03697515e-01 -3.29254329e-01\n",
-      " -8.90930295e-02  1.14660770e-01 -9.05855417e-01  8.15455243e-03\n",
-      "  1.48153394e-01 -2.29722723e-01 -8.32916439e-01 -6.75686240e-01\n",
-      "  6.29307210e-01 -5.49214065e-01 -8.63798857e-02 -2.25813970e-01\n",
-      "  1.34750354e+00 -1.27279890e+00  1.71834212e-02 -9.28580642e-01\n",
-      " -4.82821971e-01 -3.34665596e-01 -5.94868183e-01 -1.29932821e-01\n",
-      " -1.92791373e-02 -1.49232015e-01  1.34774446e+00  1.19024850e-01\n",
-      " -1.20160818e-01 -1.26262501e-01  1.97318313e-03  1.36541653e+00\n",
-      "  1.02985278e-01 -2.10293263e-01  2.37391043e+00  2.78081983e-01\n",
-      "  1.06245232e+00 -2.89069340e-02 -2.64283836e-01 -3.76625746e-01\n",
-      "  2.17229322e-01  4.31653678e-01  3.62828434e-01  5.05672574e-01\n",
-      "  7.73309097e-02  2.52127171e+00 -5.13727009e-01 -5.77548921e-01\n",
-      " -1.68320909e-01  4.10304099e-01  2.59571910e-01  2.76594549e-01\n",
-      "  1.45417917e+00  4.71246615e-02 -9.45373952e-01 -2.64028404e-02\n",
-      " -1.45785689e+00 -2.15390992e+00  2.60196701e-02 -1.00632882e+00\n",
-      " -2.80741006e-01 -1.05663754e-01 -1.99056208e-01  1.07909453e+00]\n"
-     ]
-    }
-   ],
-   "source": [
-    "import pycuda.autoinit\n",
-    "import pycuda.driver as drv\n",
-    "import numpy\n",
-    "from pycuda.compiler import SourceModule\n",
-    "\n",
-    "module = \"\"\"\n",
-    "__global__ void multiply_them(float *dest, float *a, float *b)\n",
-    "{\n",
-    " const int i = threadIdx.x;\n",
-    " dest[i] = a[i] * b[i];\n",
-    "}\n",
-    "\"\"\"\n",
-    "print(module)\n",
-    "\n",
-    "mod = SourceModule(module, nvcc=\"nvcc\", options=[\"-ccbin=/usr/bin/clang-3.8\"])\n",
-    "\n",
-    "multiply_them = mod.get_function(\"multiply_them\")\n",
-    "\n",
-    "a = numpy.random.randn(400).astype(numpy.float32)\n",
-    "b = numpy.random.randn(400).astype(numpy.float32)\n",
-    "\n",
-    "dest = numpy.zeros_like(a)\n",
-    "multiply_them(\n",
-    "        drv.Out(dest), drv.In(a), drv.In(b),\n",
-    "        block=(400,1,1), grid=(1,1))\n",
-    "\n",
-    "print (dest)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [
-    {
-     "ename": "CompileError",
-     "evalue": "nvcc preprocessing of /tmp/tmpn_14m8_h.cu failed\n[command: nvcc --preprocess -arch sm_50 -I/home/arrivault/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/cuda /tmp/tmpn_14m8_h.cu --compiler-options -P]\n[stderr:\nb\"ERROR: No supported gcc/g++ host compiler found, but clang-3.8 is available.\\n       Use 'nvcc -ccbin clang-3.8' to use that instead.\\n\"]",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mCompileError\u001b[0m                              Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-4-1815e70115ee>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mpycuda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurandom\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mrand\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mcurand\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0ma_gpu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcurand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m50\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      8\u001b[0m \u001b[0mb_gpu\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcurand\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m50\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/curandom.py\u001b[0m in \u001b[0;36mrand\u001b[0;34m(shape, dtype, stream)\u001b[0m\n\u001b[1;32m    208\u001b[0m                 \u001b[0mdest\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mPOW_2_M32\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    209\u001b[0m             \"\"\",\n\u001b[0;32m--> 210\u001b[0;31m             \"md5_rng_float\")\n\u001b[0m\u001b[1;32m    211\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mdtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfloat64\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    212\u001b[0m         func = get_elwise_kernel(\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/elementwise.py\u001b[0m in \u001b[0;36mget_elwise_kernel\u001b[0;34m(arguments, operation, name, keep, options, **kwargs)\u001b[0m\n\u001b[1;32m    159\u001b[0m     \"\"\"\n\u001b[1;32m    160\u001b[0m     func, arguments = get_elwise_kernel_and_types(\n\u001b[0;32m--> 161\u001b[0;31m             arguments, operation, name, keep, options, **kwargs)\n\u001b[0m\u001b[1;32m    162\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    163\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/elementwise.py\u001b[0m in \u001b[0;36mget_elwise_kernel_and_types\u001b[0;34m(arguments, operation, name, keep, options, use_range, **kwargs)\u001b[0m\n\u001b[1;32m    145\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    146\u001b[0m     mod = module_builder(arguments, operation, name,\n\u001b[0;32m--> 147\u001b[0;31m             keep, options, **kwargs)\n\u001b[0m\u001b[1;32m    148\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    149\u001b[0m     \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/elementwise.py\u001b[0m in \u001b[0;36mget_elwise_module\u001b[0;34m(arguments, operation, name, keep, options, preamble, loop_prep, after_loop)\u001b[0m\n\u001b[1;32m     73\u001b[0m             \u001b[0;34m\"after_loop\"\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mafter_loop\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     74\u001b[0m             },\n\u001b[0;32m---> 75\u001b[0;31m         options=options, keep=keep)\n\u001b[0m\u001b[1;32m     76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     77\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/compiler.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, source, nvcc, options, keep, no_extern_c, arch, code, cache_dir, include_dirs)\u001b[0m\n\u001b[1;32m    289\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    290\u001b[0m         cubin = compile(source, nvcc, options, keep, no_extern_c,\n\u001b[0;32m--> 291\u001b[0;31m                 arch, code, cache_dir, include_dirs)\n\u001b[0m\u001b[1;32m    292\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    293\u001b[0m         \u001b[0;32mfrom\u001b[0m \u001b[0mpycuda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdriver\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmodule_from_buffer\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/compiler.py\u001b[0m in \u001b[0;36mcompile\u001b[0;34m(source, nvcc, options, keep, no_extern_c, arch, code, cache_dir, include_dirs, target)\u001b[0m\n\u001b[1;32m    253\u001b[0m         \u001b[0moptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"-I\"\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 255\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mcompile_plain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnvcc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcache_dir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    256\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    257\u001b[0m \u001b[0;32mclass\u001b[0m \u001b[0mCudaModule\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/compiler.py\u001b[0m in \u001b[0;36mcompile_plain\u001b[0;34m(source, options, keep, nvcc, cache_dir, target)\u001b[0m\n\u001b[1;32m     76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     77\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;34m'#include'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msource\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 78\u001b[0;31m             \u001b[0mchecksum\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpreprocess_source\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnvcc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"utf-8\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     79\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     80\u001b[0m             \u001b[0mchecksum\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msource\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"utf-8\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/compiler.py\u001b[0m in \u001b[0;36mpreprocess_source\u001b[0;34m(source, options, nvcc)\u001b[0m\n\u001b[1;32m     53\u001b[0m         \u001b[0;32mfrom\u001b[0m \u001b[0mpycuda\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdriver\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mCompileError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     54\u001b[0m         raise CompileError(\"nvcc preprocessing of %s failed\" % source_path,\n\u001b[0;32m---> 55\u001b[0;31m                            cmdline, stderr=stderr)\n\u001b[0m\u001b[1;32m     56\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     57\u001b[0m     \u001b[0;31m# sanity check\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mCompileError\u001b[0m: nvcc preprocessing of /tmp/tmpn_14m8_h.cu failed\n[command: nvcc --preprocess -arch sm_50 -I/home/arrivault/.virtualenvs/splearn-pycuda/lib/python3.6/site-packages/pycuda/cuda /tmp/tmpn_14m8_h.cu --compiler-options -P]\n[stderr:\nb\"ERROR: No supported gcc/g++ host compiler found, but clang-3.8 is available.\\n       Use 'nvcc -ccbin clang-3.8' to use that instead.\\n\"]"
-     ]
-    }
-   ],
-   "source": [
-    "import pycuda.gpuarray as gpuarray\n",
-    "import pycuda.driver as cuda\n",
-    "import pycuda.autoinit\n",
-    "import numpy\n",
-    "from pycuda.curandom import rand as curand\n",
-    "\n",
-    "a_gpu = curand((50,))\n",
-    "b_gpu = curand((50,))\n",
-    "\n",
-    "from pycuda.elementwise import ElementwiseKernel\n",
-    "lin_comb = ElementwiseKernel(\n",
-    "        \"float a, float *x, float b, float *y, float *z\",\n",
-    "        \"z[i] = a*x[i] + b*y[i]\",\n",
-    "        \"linear_combination\")\n",
-    "\n",
-    "c_gpu = gpuarray.empty_like(a_gpu)\n",
-    "lin_comb(5, a_gpu, 6, b_gpu, c_gpu)\n",
-    "\n",
-    "import numpy.linalg as la\n",
-    "assert la.norm((c_gpu - (5*a_gpu+6*b_gpu)).get()) < 1e-5"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "import numpy as np\n",
-    "from scipy.linalg import svd\n",
-    "import pycuda.autoinit\n",
-    "import pycuda.gpuarray as gpuarray\n",
-    "d = 50\n",
-    "A = np.asarray(np.random.randint(1, 10,(d, d)), dtype=np.float32)\n",
-    "a_gpu = gpuarray.to_gpu(A)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "2.19 ms ± 1.49 ms per loop (mean ± std. dev. of 7 runs, 3 loops each)\n"
-     ]
-    }
-   ],
-   "source": [
-    "%timeit -n3 [u, s, v] = svd(A)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "3.76 ms ± 1.95 ms per loop (mean ± std. dev. of 7 runs, 3 loops each)\n"
-     ]
-    }
-   ],
-   "source": [
-    "%timeit -n3 [u, s, v] = np.linalg.svd(A)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {},
-   "outputs": [
-    {
-     "ename": "CUSOLVER_STATUS_INTERNAL_ERROR",
-     "evalue": "",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mCUSOLVER_STATUS_INTERNAL_ERROR\u001b[0m            Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-9-3d7440e3c764>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"-n3 u_gpu, s_gpu, vh_gpu = linalg.svd(a_gpu, 'S', 'S', 'cusolver')\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[1;32m   2093\u001b[0m                 \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2094\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2095\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2096\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m<decorator-gen-61>\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m    185\u001b[0m     \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    186\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m         \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    189\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m   1100\u001b[0m                     \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1102\u001b[0;31m         \u001b[0mall_runs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1103\u001b[0m         \u001b[0mbest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1104\u001b[0m         \u001b[0mworst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/lib/python3.6/timeit.py\u001b[0m in \u001b[0;36mrepeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m    204\u001b[0m         \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    205\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m             \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    207\u001b[0m             \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    208\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m    158\u001b[0m         \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    159\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m             \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    161\u001b[0m         \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    162\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m<magic-timeit>\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/build/scikit-cuda/skcuda/linalg.py\u001b[0m in \u001b[0;36msvd\u001b[0;34m(a_gpu, jobu, jobvt, lib)\u001b[0m\n\u001b[1;32m    467\u001b[0m              \u001b[0mldu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvh_gpu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgpudata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mldvt\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    468\u001b[0m              \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mWork\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgpudata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mLwork\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrwork\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 469\u001b[0;31m              int(devInfo.gpudata))\n\u001b[0m\u001b[1;32m    470\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    471\u001b[0m         \u001b[0;31m# Free working space:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/build/scikit-cuda/skcuda/cusolver.py\u001b[0m in \u001b[0;36mcusolverDnSgesvd\u001b[0;34m(handle, jobu, jobvt, m, n, a, lda, s, U, ldu, vt, ldvt, work, lwork, rwork, devInfo)\u001b[0m\n\u001b[1;32m    998\u001b[0m                                            \u001b[0mldu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mldvt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwork\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    999\u001b[0m                                            lwork, int(rwork), int(devInfo))\n\u001b[0;32m-> 1000\u001b[0;31m     \u001b[0mcusolverCheckStatus\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatus\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1001\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1002\u001b[0m \u001b[0m_libcusolver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcusolverDnDgesvd_bufferSize\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrestype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/build/scikit-cuda/skcuda/cusolver.py\u001b[0m in \u001b[0;36mcusolverCheckStatus\u001b[0;34m(status)\u001b[0m\n\u001b[1;32m    160\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mstatus\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    161\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 162\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mCUSOLVER_EXCEPTIONS\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstatus\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    163\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    164\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mCUSOLVER_ERROR\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mCUSOLVER_STATUS_INTERNAL_ERROR\u001b[0m: "
-     ]
-    }
-   ],
-   "source": [
-    "%timeit -n3 u_gpu, s_gpu, vh_gpu = linalg.svd(a_gpu, 'S', 'S', 'cusolver')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {},
-   "outputs": [
-    {
-     "ename": "CUSOLVERError",
-     "evalue": "CUSOLVER_STATUS_INTERNAL_ERROR",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mCUSOLVERError\u001b[0m                             Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-8-c960eb315819>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'-n3 u_cp, s_cp, v_cp = cp.linalg.svd(a_cp)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[1;32m   2093\u001b[0m                 \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2094\u001b[0m             \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2095\u001b[0;31m                 \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2096\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m<decorator-gen-61>\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m<lambda>\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m    185\u001b[0m     \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    186\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m         \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    189\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m   1100\u001b[0m                     \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1102\u001b[0;31m         \u001b[0mall_runs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1103\u001b[0m         \u001b[0mbest\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1104\u001b[0m         \u001b[0mworst\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mall_runs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnumber\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/lib/python3.6/timeit.py\u001b[0m in \u001b[0;36mrepeat\u001b[0;34m(self, repeat, number)\u001b[0m\n\u001b[1;32m    204\u001b[0m         \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    205\u001b[0m         \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 206\u001b[0;31m             \u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    207\u001b[0m             \u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    208\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m    158\u001b[0m         \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    159\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m             \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    161\u001b[0m         \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    162\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m<magic-timeit>\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n",
-      "\u001b[0;32m~/.virtualenvs/sksplearn/lib/python3.6/site-packages/cupy/linalg/decomposition.py\u001b[0m in \u001b[0;36msvd\u001b[0;34m(a, full_matrices, compute_uv)\u001b[0m\n\u001b[1;32m    254\u001b[0m             \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjob\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjob\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    255\u001b[0m             \u001b[0ms\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mu_ptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvt_ptr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 256\u001b[0;31m             workspace.data.ptr, buffersize, 0, dev_info.data.ptr)\n\u001b[0m\u001b[1;32m    257\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# dtype == 'd'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    258\u001b[0m         \u001b[0mbuffersize\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcusolver\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdgesvd_bufferSize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mm\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32mcupy/cuda/cusolver.pyx\u001b[0m in \u001b[0;36mcupy.cuda.cusolver.sgesvd\u001b[0;34m()\u001b[0m\n",
-      "\u001b[0;32mcupy/cuda/cusolver.pyx\u001b[0m in \u001b[0;36mcupy.cuda.cusolver.sgesvd\u001b[0;34m()\u001b[0m\n",
-      "\u001b[0;32mcupy/cuda/cusolver.pyx\u001b[0m in \u001b[0;36mcupy.cuda.cusolver.check_status\u001b[0;34m()\u001b[0m\n",
-      "\u001b[0;31mCUSOLVERError\u001b[0m: CUSOLVER_STATUS_INTERNAL_ERROR"
-     ]
-    }
-   ],
-   "source": [
-    "%timeit -n3 u_cp, s_cp, v_cp = cp.linalg.svd(a_cp)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  }
- ],
- "metadata": {
-  "kernelspec": {
-   "display_name": "Python 3",
-   "language": "python",
-   "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.6.3"
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/examples/performances_calculation.py b/examples/performances_calculation.py
deleted file mode 100644
index 771fe0b..0000000
--- a/examples/performances_calculation.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- coding: utf-8 -*-
-
-'''
-Created on 20 févr. 2018
-
-@author: arrivault
-'''
-from timeit import default_timer as timer
-
-from splearn import Spectral
-from splearn.tests.datasets.get_dataset_path import get_dataset_path
-from splearn.datasets.base import load_data_sample
-
-def launch_fit(X, version='classic', partial=True, sparse=True, smooth_method='none'):
-    param = "****** {:s} - partial = {:b} - sparse = {:b}, {:s} *****".format(version, partial, sparse, smooth_method)
-    print(param)
-
-    sp1 = Spectral(version=version, partial=partial, sparse=sparse, smooth_method=smooth_method)
-    start = timer()
-    sp1 = sp1.fit(X)
-    duration = timer() - start
-    print("Unoptimized : " + str(duration))
- 
-#     sp2 = Spectral(version=version, partial=partial, sparse=sparse, smooth_method=smooth_method)
-#     start = timer()
-#     sp2 = sp2.fit(X)
-#     duration = timer() - start
-#     print("Optimized : " + str(duration))
-#     
-#     if sp1.hankel == sp2.hankel:
-#         print("Same result.")
-#     else:
-#         print("The result is different", file=sys.stderr)
-
-def test_fit():
-    adr = get_dataset_path("3.pautomac_light.train")
-    data = load_data_sample(adr=adr)
-    X = data.data
-    param = {'version':['classic', 'prefix', 'suffix', 'factor'], 'partial':[True, False],
-             'sparse':[True, False], 'smooth_method':['none','trigram']}
-    for version in param['version']:
-#        for partial in param['partial']:
-            for sparse in param['sparse']:
-                for smooth_method in param['smooth_method']:
-                    launch_fit(X, version=version, partial=True, sparse=sparse, smooth_method=smooth_method)
-
-if __name__ == '__main__':
-    test_fit()
diff --git a/examples/simple_automata.json b/examples/simple_automata.json
deleted file mode 100644
index ab271a8..0000000
--- a/examples/simple_automata.json
+++ /dev/null
@@ -1 +0,0 @@
-{"automaton": {"final": {"numpy.ndarray": {"values": [0.15, 0.9], "dtype": "float64"}}, "initial": {"numpy.ndarray": {"values": [0.5, 0.8], "dtype": "float64"}}, "transitions": [{"numpy.ndarray": {"values": [[0.5, 0.15], [0.9, 0]], "dtype": "float64"}}, {"numpy.ndarray": {"values": [[0, 0], [0, -0.15]], "dtype": "float64"}}], "type": "classic", "nbS": 2, "nbL": 2}}
diff --git a/examples/simple_automata.json.gv b/examples/simple_automata.json.gv
deleted file mode 100644
index 0fd62e2..0000000
--- a/examples/simple_automata.json.gv
+++ /dev/null
@@ -1,15 +0,0 @@
-//Simple Automata
-digraph {
-	0 [label="0
-______
-> 0.50
-0.15 >"]
-	1 [label="1
-______
-> 0.80
-0.90 >"]
-	0 -> 0 [label="0:0.50"]
-	0 -> 1 [label="0:0.15"]
-	1 -> 0 [label="0:0.90"]
-	1 -> 1 [label="1:-0.15"]
-}
diff --git a/examples/simple_automata.json.gv.pdf b/examples/simple_automata.json.gv.pdf
deleted file mode 100644
index 9253c0b86d51eaa9a3f4014c4c4202bbf69c7aa4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11290
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
J)z#mP3jlr~Qc?f_

diff --git a/examples/simple_automata.yaml b/examples/simple_automata.yaml
deleted file mode 100644
index b85b6ae..0000000
--- a/examples/simple_automata.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-automaton:
-  final:
-    numpy.ndarray:
-      dtype: float64
-      values: [0.15, 0.9]
-  initial:
-    numpy.ndarray:
-      dtype: float64
-      values: [0.5, 0.8]
-  nbL: 2
-  nbS: 2
-  transitions:
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [0.5, 0.15]
-      - [0.9, 0]
-  - numpy.ndarray:
-      dtype: float64
-      values:
-      - [0, 0]
-      - [0, -0.15]
-  type: classic
diff --git a/examples/simple_automata.yaml.gv b/examples/simple_automata.yaml.gv
deleted file mode 100644
index 0fd62e2..0000000
--- a/examples/simple_automata.yaml.gv
+++ /dev/null
@@ -1,15 +0,0 @@
-//Simple Automata
-digraph {
-	0 [label="0
-______
-> 0.50
-0.15 >"]
-	1 [label="1
-______
-> 0.80
-0.90 >"]
-	0 -> 0 [label="0:0.50"]
-	0 -> 1 [label="0:0.15"]
-	1 -> 0 [label="0:0.90"]
-	1 -> 1 [label="1:-0.15"]
-}
diff --git a/examples/simple_automata.yaml.gv.pdf b/examples/simple_automata.yaml.gv.pdf
deleted file mode 100644
index 9253c0b86d51eaa9a3f4014c4c4202bbf69c7aa4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11290
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
J)z#mP3jlr~Qc?f_

diff --git a/examples/svd_tests.py b/examples/svd_tests.py
deleted file mode 100644
index bcc28f2..0000000
--- a/examples/svd_tests.py
+++ /dev/null
@@ -1,101 +0,0 @@
-# -*- coding: utf-8 -*-
-
-'''
-Created on 20 févr. 2018
-
-@author: arrivault
-'''
-import sys
-from timeit import default_timer as timer
-import numpy as np
-
-def test_svd():
-    d = 1000
-    A = np.asarray(np.random.randint(1, 10,(d, d)), dtype=np.float32)
- 
-    # scipy
-    print("\n****************** Scipy")
-    from scipy.linalg import svd as sc_svd
-    start = timer()
-    u_sc, s_sc, v_sc = sc_svd(A)
-    duration = timer() - start
-    print("SVD scipy : " + str(duration))
-    print(s_sc)
-    print(type(s_sc))
-    
-    # cupy
-    print("\n****************** Cupy")
-    import cupy as cp
-    from cupy.linalg import svd as cp_svd
-    start = timer()
-    A_cp = cp.asarray(A)
-    u_cp, s_cp, v_cp = cp_svd(A_cp)
-    u_cp, s_cp, v_cp = u_cp.get(), s_cp.get(), v_cp.get()
-    duration = timer() - start
-    print("SVD cupy : " + str(duration))
-    print(s_cp)
-    print(A_cp.device)
-    print(type(s_cp))
-
-    # scikit-cuda
-    print("\n****************** scikit-cuda")
-    import pycuda.autoinit
-    import pycuda.gpuarray as gpuarray
-    #import ctypes
-    #ctypes.CDLL('libgomp.so.1', mode=ctypes.RTLD_GLOBAL)
-    from skcuda import linalg as sk_linalg
-    start = timer()
-    sk_linalg.init()
-    A_sk = gpuarray.to_gpu(A)
-    u_sk, s_sk, vh_sk = sk_linalg.svd(A_sk, jobu='S', jobvt='S', lib='cusolver')
-    u_sk, s_sk, v_sk = u_sk.get_async(), s_sk.get_async(), vh_sk.get_async()
-    duration = timer() - start
-    print("SVD skcuda : " + str(duration))
-    print(s_sk)
-    print(type(s_sk))
-     
-#     # tensorflow
-#     print("\n****************** tensorflow")
-#     import tensorflow as tf
-#     start = timer()
-#     with tf.device("/cpu:0"):
-#         s_tf, u_tf, v_tf = tf.svd(A, compute_uv=True)
-#         s_tf, u_tf, v_tf = tf.Session().run(s_tf), tf.Session().run(u_tf), tf.Session().run(v_tf)
-#     duration = timer() - start
-#     print("SVD tensorflow CPU : " + str(duration))
-#     print(s_tf)
-#     print(type(s_tf))
-#     print()
-#     start = timer()
-#     with tf.device("/gpu:0"):
-#         s_tf, u_tf, v_tf = tf.svd(A, compute_uv=True)
-#         s_tf, u_tf, v_tf = tf.Session().run(s_tf), tf.Session().run(u_tf), tf.Session().run(v_tf)
-#     duration = timer() - start
-#     print("SVD tensorflow GPU : " + str(duration))
-#     print(s_tf)
-#     print(type(s_tf))
- 
-    # Theano
-    print("\n****************** theano")
-    from theano import function, shared, tensor, config
-    import theano.tensor.nlinalg as th_linalg
-    x = tensor.dmatrix('x')
-    u, s, v = th_linalg.svd(x)
-    f = function([x], (u, s, v))
-    start = timer()
-    u_th, s_th, v_th = f(A)
-    duration = timer() - start
-
-#     x = shared(np.asarray(A, config.floatX))
-#     f = function([], th_linalg.svd(x))
-#     start = timer()
-#     u_th, s_th, v_th = f()
-#     duration = timer() - start
-    
-    print("SVD theano : " + str(duration))
-    print(s_th)
-    print(type(s_th))
-
-
-if __name__ == '__main__':
-    test_svd()
diff --git a/splearn/hankel.py b/splearn/hankel.py
index 24dc0cf..133f85a 100644
--- a/splearn/hankel.py
+++ b/splearn/hankel.py
@@ -40,6 +40,8 @@ from __future__ import division, print_function
 import scipy.sparse as sps
 import scipy.sparse.linalg as lin
 import numpy as np
+from numpy.linalg import svd, pinv
+from sklearn.utils.extmath import randomized_svd as sk_svd
 
 class Hankel(object):
     """ A Hankel instance , compute the list of Hankel matrices
@@ -61,6 +63,9 @@ class Hankel(object):
     :param boolean partial: (default value = False) build of partial
     :param boolean sparse: (default value = False) True if Hankel
            matrix is sparse
+    :param boolean full_svd_calculation: (default value = False) if True the entire SVD is calculated
+           for building hankel matrix. Else it is done by the sklearn random algorithm only for the greatest
+           k=rank eigenvalues.
     :param boolean mode_quiet: (default value = False) True for no
            output message.
     :param list lhankel: list of all Hankel matrices. At least one of the two parameters 
@@ -86,11 +91,12 @@ class Hankel(object):
             self, sample_instance=None,
             lrows=[], lcolumns=[],
             version="classic", partial=False,
-            sparse=False, mode_quiet=False, lhankel=None):
+            sparse=False, full_svd_calculation=False, mode_quiet=False, lhankel=None):
         
         self.version = version
         self.partial = partial
         self.sparse = sparse
+        self.full_svd__calculation = full_svd_calculation
         self.build_from_sample = True
         if sample_instance is not None:
             # Size of the alphabet
@@ -363,24 +369,19 @@ class Hankel(object):
                               "the smaller dimension of the Hankel Matrix (" +
                              str(matrix_shape) + ")")
         if not self.sparse:
-            try:
-                import theano.tensor as T
-                from theano import function
-                import theano.tensor.nlinalg as th_linalg
-                x = T.dmatrix('x')
-                u, s, v = th_linalg.svd(x)
-                svd = function([x], (u, s, v))
-            except :
-                from scipy.linalg import svd
             hankel = self.lhankel[0]
-            [u, s, v] = svd(hankel)
-            u = u[:, :rank]
-            v = v[:rank, :]
-            # ds = np.zeros((rank, rank), dtype=complex)
-            ds = np.diag(s[:rank])
-            pis = np.linalg.pinv(v)
+            if self.full_svd__calculation:
+                [u, s, v] = svd(hankel)
+                u = u[:, :rank]
+                v = v[:rank, :]
+                # ds = np.zeros((rank, rank), dtype=complex)
+                ds = np.diag(s[:rank])
+            else:
+                [u, s, v] = sk_svd(hankel, n_components=rank)
+                ds = np.diag(s)
+            pis = pinv(v)
             del v
-            pip = np.linalg.pinv(np.dot(u, ds))
+            pip = pinv(np.dot(u, ds))
             del u, ds
             init = np.dot(hankel[0, :], pis)
             term = np.dot(pip, hankel[:, 0])
@@ -390,18 +391,25 @@ class Hankel(object):
                 trans.append(np.dot(pip, np.dot(hankel, pis)))
 
         else:
-            hankel = self.lhankel[0]
-            [u, s, v] = lin.svds(hankel, k=rank)
+            hankel = self.lhankel[0].tocsr()
+            if self.full_svd__calculation:
+                [u, s, v] = svd(hankel.A)
+                u = u[:, :rank]
+                v = v[:rank, :]
+                # ds = np.zeros((rank, rank), dtype=complex)
+                ds = np.diag(s[:rank])
+            else:
+                [u, s, v] = lin.svds(hankel, k=rank)
             ds = np.diag(s)
-            pis = np.linalg.pinv(v)
+            pis = pinv(v)
             del v
-            pip = np.linalg.pinv(np.dot(u, ds))
+            pip = pinv(np.dot(u, ds))
             del u, ds
             init = hankel[0, :].dot(pis)[0, :]
             term = np.dot(pip, hankel[:, 0].toarray())[:, 0]
             trans = []
             for x in range(self.nbL):
-                hankel = self.lhankel[x+1]
+                hankel = self.lhankel[x+1].tocsr()
                 trans.append(np.dot(pip, hankel.dot(pis)))
 
         A = Automaton(nbL=self.nbL, nbS=rank, initial=init, final=term,
diff --git a/splearn/spectral.py b/splearn/spectral.py
index e2b7341..ce705d2 100644
--- a/splearn/spectral.py
+++ b/splearn/spectral.py
@@ -77,6 +77,9 @@ class Spectral(BaseEstimator):
            of partial Hankel matrix
     :param boolean sparse: (default value = False) True if Hankel
            matrix is sparse
+    :param boolean full_svd_calculation: (default value = False) if True the entire SVD is calculated
+           for building hankel matrix. Else it is done by the sklearn random algorithm only for the greatest
+           k=rank eigenvalues.
     :param string smooth_method: (default value = "none") method of smoothing
 
            - 'trigram' the 3-Gram trigram dict
@@ -115,11 +118,12 @@ class Spectral(BaseEstimator):
     """
     def __init__(self,  rank=5, lrows=7, lcolumns=7,
                  version='classic', partial=True,
-                 sparse=True, smooth_method='none',
+                 sparse=True, full_svd_calculation=False, smooth_method='none',
                  mode_quiet=False):
         self.version = version
         self.partial = partial
         self.sparse = sparse
+        self.full_svd_calculation = full_svd_calculation
         self.lrows = lrows
         self.lcolumns = lcolumns
         self.rank = rank
@@ -219,6 +223,7 @@ class Spectral(BaseEstimator):
                          lrows=self.lrows, lcolumns=self.lcolumns,
                          version=self.version,
                          partial=self.partial, sparse=self.sparse,
+                         full_svd_calculation = self.full_svd_calculation,
                          mode_quiet=self.mode_quiet)
         self._automaton = self._hankel.to_automaton(self.rank, self.mode_quiet)
         # for smooth option compute trigram dictionnary
@@ -226,45 +231,8 @@ class Spectral(BaseEstimator):
             self.trigram = self._threegramdict(X.sample)
 
         return self
-    
-    def fit_opt(self, X, y=None):
-        """Fit the model in a optimal way
-
-        - Input:
-
-        :param SplearnArray X: object of shape [n_samples,n_features]
-               Training data
-        :param ndarray y: (default value = None) not used by Spectral estimator
-               numpy array of shape [n_samples] Target values
-
-
-        - Output:
-
-        :returns: Spectral itself with an automaton attribute instanced
-                  returns an instance of self.
-        :rtype: Spectral
-
-        """
-        check_array(X)
 
-        if not isinstance(X, SplearnArray):
-            self._hankel = None
-            self._automaton = None
-            return self
-        self.polulate_dictionnaries_opt(X)
-        self._hankel = Hankel(sample_instance=X,
-                         lrows=self.lrows, lcolumns=self.lcolumns,
-                         version=self.version,
-                         partial=self.partial, sparse=self.sparse,
-                         mode_quiet=self.mode_quiet)
-        self._automaton = self._hankel.to_automaton(self.rank, self.mode_quiet)
-        # for smooth option compute trigram dictionnary
-        if self.smooth == 1:
-            self.trigram = self._threegramdict(X.sample)
-
-        return self
-
-    def polulate_dictionnaries_opt(self, X):
+    def polulate_dictionnaries(self, X):
         """Populates the *sample*, *pref*, *suff*, *fact* dictionnaries of X
                 
         - Input:
@@ -275,10 +243,10 @@ class Spectral(BaseEstimator):
         """
         if not isinstance(X, SplearnArray):
             return X
-        X.sample = {}  # dictionary (word,count)
-        X.pref = {}  # dictionary (prefix,count)
-        X.suff = {}  # dictionary (suffix,count)
-        X.fact = {}  # dictionary (factor,count)
+        dsample = {}  # dictionary (word,count)
+        dpref = {}  # dictionary (prefix,count)
+        dsuff = {}  # dictionary (suffix,count)
+        dfact = {}  # dictionary (factor,count)
         if self.partial:
             if isinstance(self.lrows, int):
                 lrowsmax = self.lrows
@@ -293,96 +261,7 @@ class Spectral(BaseEstimator):
                 lcolumnsmax = self.lcolumns.__len__()
                 version_columns_int = False
             lmax = lrowsmax + lcolumnsmax
-            #threads = []
-            for line in range(X.shape[0]):
-                self._populate_a_word(X, line, lrowsmax, version_rows_int,
-                                      lcolumnsmax, version_columns_int, lmax)
-        else:
-                self._populate_a_word(X, line)
-
-        
-        if self.version == "classic":
-            X.fact = {}
-        elif self.version == "suffix":
-            X.pref = {}
-        elif self.version == "prefix":
-            X.suff = {}
-        elif self.version == "factor":
-            X.suff = {}
-            X.pref = {}
 
-    def _populate_a_word(self, X, line, lrowsmax=None, version_rows_int=None,
-                         lcolumnsmax=None, version_columns_int=None, lmax=None):
-        w = X[line, :]
-        w = w[w >= 0]
-        w = tuple([int(x) for x in w[0:]])
-        X.sample[w] = X.sample.setdefault(w, 0) + 1
-        if self.version == "prefix" or self.version == "classic":
-            # empty word treatment for prefixe, suffix, and factor dictionnaries
-            X.pref[()] = X.pref.setdefault((),0) + 1
-        if self.version == "suffix" or self.version == "classic":
-            X.suff[()] = X.suff.setdefault((),0) + 1
-        if (self.version == "factor" or self.version == "suffix" or
-            self.version == "prefix"):
-            X.fact[()] = X.fact.setdefault((),0) + len(w) + 1
-        if self.partial:
-            for i in range(len(w)):
-                if self.version == "classic":
-                    if ((version_rows_int and i + 1 <= lrowsmax) or
-                       (not version_rows_int and w[:i + 1] in self.lrows)):
-                        X.pref[w[:i + 1]] = X.pref.setdefault(w[:i + 1], 0) + 1
-                    if ((version_columns_int and i + 1 <= lcolumnsmax) or
-                       (not version_columns_int and w[-( i + 1):] in self.lcolumns)):
-                        X.suff[w[-(i + 1):]] = X.suff.setdefault(w[-(i + 1):], 0) + 1
-                elif self.version == "prefix":
-                    # dictionaries dpref is populated until
-                    # lmax = lrows + lcolumns
-                    # dictionaries dfact is populated until lcolumns
-                    if (((version_rows_int or version_columns_int) and i + 1 <= lmax) or
-                         (not version_rows_int and w[:i + 1] in self.lrows) or
-                         (not version_columns_int  and w[:i + 1] in self.lcolumns)):
-                        X.pref[w[:i + 1]] = X.pref.setdefault(w[:i + 1], 0) + 1
-                    for j in range(i + 1, len(w) + 1):
-                        if ((version_columns_int and (j - i) <= lmax) or 
-                            (not version_columns_int and w[i:j] in self.lcolumns)):
-                            X.fact[w[i:j]] = X.fact.setdefault(w[i:j], 0) + 1
-                elif self.version == "suffix":
-                    if (((version_rows_int or version_columns_int) and i <= lmax) or
-                         (not version_rows_int and w[-(i + 1):] in self.lrows) or
-                         (not version_columns_int and w[-(i + 1):] in self.lcolumns)):
-                        X.suff[w[-(i + 1):]] = X.suff.setdefault(w[-(i + 1):], 0) + 1
-                    for j in range(i + 1, len(w) + 1):
-                        if ((version_rows_int and (j - i) <= lmax) or
-                            (not version_rows_int and w[i:j] in self.lrows)):
-                            X.fact[w[i:j]] = X.fact.setdefault(w[i:j], 0) + 1
-                elif self.version == "factor":
-                    for j in range(i + 1, len(w) + 1):
-                        if (((version_rows_int or version_columns_int) and (j - i) <= lmax) or
-                             (not version_rows_int and w[i:j] in self.lrows) or
-                             (not version_columns_int and w[i:j] in self.lcolumns)):
-                            X.fact[w[i:j]] = X.fact.setdefault(w[i:j], 0) + 1
-        else:  # not partial
-            for i in range(len(w)):
-                X.pref[w[:i + 1]] = X.pref.setdefault(w[:i + 1], 0) + 1
-                X.suff[w[i:]] = X.suff.setdefault(w[i:], 0) + 1
-                for j in range(i + 1, len(w) + 1):
-                    X.fact[w[i:j]] = X.fact.setdefault(w[i:j], 0) + 1
-
-    def polulate_dictionnaries(self, X):
-        """Populates the *sample*, *pref*, *suff*, *fact* dictionnaries of X
-                
-        - Input:
-
-        :param SplearnArray X: object of shape [n_samples,n_features]
-               Training data
-        
-        """
-        if not isinstance(X, SplearnArray):
-            return X
-        dsample = {}  # dictionary (word,count)
-        dpref = {}  # dictionary (prefix,count)
-        dsuff = {}  # dictionary (suffix,count)
-        dfact = {}  # dictionary (factor,count)
         for line in range(X.shape[0]):
             w = X[line, :]
             w = w[w >= 0]
@@ -398,20 +277,6 @@ class Spectral(BaseEstimator):
                 dfact[()] = dfact[()] + len(w) + 1 if () in dfact else len(
                     w) + 1
             if self.partial:
-                if isinstance(self.lrows, int):
-                    lrowsmax = self.lrows
-                    version_rows_int = True
-                else:
-                    version_rows_int = False
-                    lrowsmax = self.lrows.__len__()
-                if isinstance(self.lcolumns, int):
-                    lcolumnsmax = self.lcolumns
-                    version_columns_int = True
-                else:
-                    lcolumnsmax = self.lcolumns.__len__()
-                    version_columns_int = False
-                lmax = lrowsmax + lcolumnsmax
-
                 for i in range(len(w)):
                     if self.version == "classic":
                         if (version_rows_int is True and
-- 
GitLab